ฉันจะเพิ่มฟิลด์รูปภาพในฟิลด์ไดนามิกที่กำหนดเองของฉันในการกำหนดค่าระบบได้อย่างไร


10

ฉันต้องการอนุญาตให้ผู้ใช้ผู้ดูแลระบบสามารถสร้างฟิลด์ได้มากเท่าที่เขาต้องการ ฉันพบวิธีแก้ไขปัญหาในส่วนขยายอื่นและฉันใช้เป็นจุดเริ่มต้นของฉัน ดังนั้นฉันมีรหัสเช่นนี้:

ในsystem.xml:

<showcases translate="label">
    <label>Showcases</label>
    <frontend_type>text</frontend_type>
    <sort_order>10</sort_order>
    <show_in_default>1</show_in_default>
    <show_in_website>1</show_in_website>
    <show_in_store>1</show_in_store>
    <fields>
        <showcase translate="label">
            <label>Showcases</label>
            <frontend_type>select</frontend_type>
            <frontend_model>awesomehome/adminhtml_showcases</frontend_model>
            <backend_model>adminhtml/system_config_backend_serialized</backend_model>
            <sort_order>410</sort_order>
            <show_in_default>1</show_in_default>
            <show_in_website>1</show_in_website>
            <show_in_store>1</show_in_store>
        </showcase>
    </fields>
</showcases>

และในNamespace/Awesomehome/Block/Adminhtml/Showcases.php:

class Namespace_Awesomehome_Block_Adminhtml_Showcases 
    extends Mage_Adminhtml_Block_System_Config_Form_Field
{
    protected $_addRowButtonHtml = array();
    protected $_removeRowButtonHtml = array();

    protected function _getElementHtml(Varien_Data_Form_Element_Abstract $element)
    {
        $this->setElement($element);

        $html = '<div id="showcase_template" style="display:none">';
        $html .= $this->_getRowTemplateHtml();
        $html .= '</div>';

        $html .= '<ul id="showcase_container">';
        if ($this->_getValue('showcases')) {
            foreach (array_keys($this->_getValue('showcases')) as $row) {
                if ($row) {
                    $html .= $this->_getRowTemplateHtml($row);
                }
            }
        }
        $html .= '</ul>';
        $html .= $this->_getAddRowButtonHtml(
            'showcase_container',
            'showcase_template', $this->__('Add new showcase')
        );

        return $html;
    }

    protected function _getRowTemplateHtml($row = 0)
    {
        $html = '<li><fieldset>';

        $html .= $this->_getShowcaseTypeHtml($row);

        $html .= $this->_getRemoveRowButtonHtml();
        $html .= '</fieldset></li>';

        return $html;
    }

    protected function _getShowcaseTypeHtml($row) {
        $html = '<label>' . $this->__('Showcase type:') . '</label>';

        $html .= '<select style="width:100%;" class="input-text" name="' . $this->getElement()->getName() . '[type][]">';
        $html .= '<option value="1" '
                . ($this->_getValue('type/' . $row) == "1" ? 'selected="selected"' : '') .'>'
                . $this->__("Simple") . "</option>";
        $html .= '<option value="2" '
                . ($this->_getValue('type/' . $row) == "2" ? 'selected="selected"' : '') .'>'
                . $this->__("With Image") . "</option>";

        $html .= '</select><br/>';
        return $html;
    }

มันทำงานได้ตามที่คาดหวังและมันเป็นเช่นนี้

ป้อนคำอธิบายรูปภาพที่นี่

ตอนนี้ฉันต้องการเพิ่มเขตข้อมูลการอัพโหลดรูปภาพไปยังชุดข้อมูลของฉัน ฉันควรทำอย่างไร

อัปเดต :

ฉันรู้ว่าในsystem.xmlคุณสามารถเขียนรหัสนี้เพื่อเพิ่มช่องภาพ:

<image translate="label">
    <label>Image</label>
    <frontend_type>image</frontend_type>
    <backend_model>adminhtml/system_config_backend_image</backend_model>
    <upload_dir config="system/filesystem/media" scope_info="1">awesomehome/topcategories</upload_dir>
    <base_url type="media" scope_info="1">awesomehome/topcategories</base_url>
    <sort_order>30</sort_order>
    <show_in_default>1</show_in_default>
    <show_in_website>1</show_in_website>
    <show_in_store>1</show_in_store>
    <comment>Allowed file types: jpeg, gif, png.</comment>
</image>

แต่ฉันไม่สามารถใช้วิธีการนี้ได้เนื่องจากฉันต้องการมีหลายฟิลด์ไม่ใช่หนึ่งรายการ

คำตอบ:


2
Add this in your system.xml

<logo translate="label comment">
<label>Logo</label>
<comment>Allowed file types: jpeg, gif, png.</comment>
<frontend_type>image</frontend_type>
<backend_model>adminhtml/system_config_backend_image</backend_model>
<upload_dir config="system/filesystem/media" scope_info="1">theme</upload_dir>
<base_url type="media" scope_info="1">theme</base_url>
<sort_order>1</sort_order>
<show_in_default>1</show_in_default>
<show_in_website>1</show_in_website>
<show_in_store>1</show_in_store>
</logo>

องค์ประกอบแสดงถึงตำแหน่งที่จะอัพโหลดรูปภาพ ในตัวอย่างด้านบนรูปภาพจะถูกบันทึกลงในโฟลเดอร์ย่อยภายใต้โฟลเดอร์สื่อ เช่น / media / theme /. องค์ประกอบที่ใช้ในการแสดงผลแท็ก ในการแสดงผลภาพจากตัวอย่างข้างต้นคุณสามารถใช้รหัสต่อไปนี้

echo Mage::getBaseUrl('media') . Mage::getStoreConfig('system_config_name/group/logo');

ฉันไม่สามารถใช้system.xmlในกรณีของฉัน โปรดอ่านคำถามของฉันอีกครั้ง
Pedram Behroozi

แต่ทำไมคุณไม่สามารถใช้งานได้
Vivek Khandelwal

เพราะวิธีการของคุณเพิ่มหนึ่งภาพฟิลด์เพื่อกำหนดค่าระบบ ฉันต้องการมีฟิลด์รูปภาพจำนวนแบบไดนามิก
Pedram Behroozi

ตกลง. ฉันจะบอกวิธีการที่แตกต่างให้กับคุณ
Vivek Khandelwal

1

ฉันลองสิ่งที่คล้ายกันและแก้ไขได้เพียงบางส่วนเท่านั้น

ครั้งแรกในเพื่อเพิ่มหลายประเภทของเขตข้อมูลในอาร์เรย์ / ลำดับตัวเลือกการตั้งค่าของคุณผมสร้างขึ้นเป็นรุ่นที่ขยายของชั้นMage_Adminhtml_Block_System_Config_Form_Field_Array_Abstractที่รวมประเภทselect, multiselectและfile(ขณะที่ฟังก์ชั่นเดิมที่ได้รับอนุญาตเท่านั้นคุณสามารถใช้textพิมพ์) ดูhttps: / /github.com/Genmato/Core/blob/master/app/code/community/Genmato/Core/Block/System/Config/Form/Field/Array/Abstract.php (ไฟล์มีขนาดค่อนข้างใหญ่ถึงรวมไว้ที่นี่)

ต่อไปฉันพบว่าการรวมประเภทไฟล์กับฟิลด์อื่น ๆ (เลือก / ข้อความ) ทำงานไม่ถูกต้อง เมื่อบันทึกข้อมูลเฉพาะรายละเอียดไฟล์หากมีและอาเรย์จะเลอะ ดังนั้นฉันเลือกใช้โซลูชันที่มีหนึ่งฟิลด์สำหรับบันทึกการอัปโหลด:

<templates translate="label comment">
                            <label>Templates</label>
                            <frontend_model>genmato_addresslabel/system_config_form_templates</frontend_model>
                            <backend_model>genmato_addresslabel/system_config_backend_storefile</backend_model>
                            <sort_order>1</sort_order>
                            <show_in_default>1</show_in_default>
                            <show_in_website>0</show_in_website>
                            <show_in_store>0</show_in_store>
                            <upload_dir config="system/filesystem/media" scope_info="1">addresslabel</upload_dir>
                            <base_url type="media" scope_info="1">addresslabel</base_url>
                            <comment>Label templates, to be used as background in the PDF (only PDF files are allowed)</comment>
                        </templates>

คลาสบล็อกที่สอดคล้องกัน:

class Genmato_AddressLabel_Block_System_Config_Form_Templates extends Genmato_Core_Block_System_Config_Form_Field_Array_Abstract
{
    public function __construct()
    {
        $this->addColumn('template', array(
            'label' => Mage::helper('genmato_addresslabel')->__('Template'),
            'style' => 'width:300px',
            'class' => '',
            'type' => 'file',
        ));

        $this->_addAfter = false;
        $this->_addButtonLabel = Mage::helper('genmato_addresslabel')->__('Add new item');
        $this->setTemplate('genmato/core/system/config/form/field/array.phtml');
        parent::__construct();
    }

}

และคลาสโมเดลแบ็กเอนด์:

class Genmato_AddressLabel_Model_System_Config_Backend_Storefile extends Mage_Adminhtml_Model_System_Config_Backend_File
{

    protected function _afterLoad()
    {
        $value = (string)$this->getValue();
        $this->setValue(empty($value) ? false : unserialize($value));
    }

    protected function _beforeSave()
    {

        $value = $this->getValue();

        // Load current template data
        $data = unserialize(Mage::getStoreConfig($this->getPath()));

        // Check for deleted records
        if (is_array($data)) {
            foreach ($data as $key => $val) {
                if (!isset($value[$key])) {
                    unset($data[$key]);
                }
            }
        }

        // check for new uploads.
        foreach ($value as $key => $val) {
            if (!is_array($val)) {
                continue;
            }
            foreach ($val as $filefield => $filevalue) {
                try {
                    if ($_FILES['groups']['tmp_name'][$this->getGroupId()]['fields'][$this->getField()]['value'][$key][$filefield]) {
                        $file = array();
                        $tmpName = $_FILES['groups']['tmp_name'];
                        $file['tmp_name'] = $tmpName[$this->getGroupId()]['fields'][$this->getField()]['value'][$key][$filefield];
                        $name = $_FILES['groups']['name'];
                        $file['name'] = $name[$this->getGroupId()]['fields'][$this->getField()]['value'][$key][$filefield];

                        if (isset($file['tmp_name']) || empty($file['tmp_name'])) {
                            $uploadDir = $this->_getUploadDir();

                            $uploader = new Mage_Core_Model_File_Uploader($file);
                            $uploader->setAllowedExtensions($this->_getAllowedExtensions());
                            $uploader->setAllowRenameFiles(true);
                            $result = $uploader->save($uploadDir);

                            $filename = $result['file'];
                            if ($filename) {
                                if ($this->_addWhetherScopeInfo()) {
                                    $filename = $this->_prependScopeInfo($filename);
                                }

                            }
                            $data[$key]['template'] = $filename;
                        } else {

                        }
                    }

                } catch (Exception $e) {
                    Mage::throwException($e->getMessage());
                    return $this;
                }
            }
        }

        $this->setValue(serialize($data));

        return $this;
    }

}

และฟิลด์ที่สองที่ฉันเก็บการกำหนดค่าของฉัน:

<config translate="label comment">
                            <label>Label configurations</label>
                            <frontend_model>genmato_addresslabel/system_config_form_config</frontend_model>
                            <backend_model>genmato_pdflib/system_config_backend_storeserial</backend_model>
                            <sort_order>2</sort_order>
                            <show_in_default>1</show_in_default>
                            <show_in_website>0</show_in_website>
                            <show_in_store>0</show_in_store>
                            <comment>Label configuration, you can create multiple label configurations for different usages</comment>
                        </config>

และคลาสบล็อกที่ใช้:

class Genmato_AddressLabel_Block_System_Config_Form_Config extends Genmato_Core_Block_System_Config_Form_Field_Array_Abstract
{
    public function __construct()
    {

        $this->addColumn('name', array(
            'label' => Mage::helper('genmato_addresslabel')->__('Name'),
            'style' => 'width:100px',
        ));

        $this->addColumn('template', array(
            'label' => Mage::helper('genmato_addresslabel')->__('Use template'),
            'style' => 'width:100px',
            'type' => 'select',
            'options' => Mage::getModel('genmato_addresslabel/system_config_source_templates')->getTemplates(),
        ));

        $this->addColumn('width', array(
            'label' => Mage::helper('genmato_addresslabel')->__('W (mm)'),
            'style' => 'width:40px'
        ));

        $this->addColumn('height', array(
            'label' => Mage::helper('genmato_addresslabel')->__('H (mm)'),
            'style' => 'width:40px'
        ));

        $this->addColumn('rotate', array(
            'label' => Mage::helper('genmato_addresslabel')->__('Rotate 90'),
            'type' => 'select',
            'options' => array("0" => "No", "1" => "Yes"),
            'style' => 'width:50px'
        ));

        $this->addColumn('multiple', array(
            'label' => Mage::helper('genmato_addresslabel')->__('Multiple labels'),
            'type' => 'select',
            'options' => array("0" => "No", "1" => "Yes"),
            'style' => 'width:50px'
        ));

        $this->addColumn('label_width', array(
            'label' => Mage::helper('genmato_addresslabel')->__('W (mm)'),
            'style' => 'width:40px'
        ));

        $this->addColumn('label_height', array(
            'label' => Mage::helper('genmato_addresslabel')->__('H (mm)'),
            'style' => 'width:40px'
        ));

        $this->_addAfter = false;
        $this->_addButtonLabel = Mage::helper('genmato_addresslabel')->__('Add new item');
        $this->setTemplate('genmato/core/system/config/form/field/array.phtml');
        parent::__construct();
    }

}

ที่นี่ฉันใช้ตัวเลือก select / dropdown เพื่อเลือกไฟล์ที่อัพโหลดต่อแถว config ซึ่งยังช่วยให้ฉันสามารถใช้ไฟล์เดียวกันในหลายแถว

นี่อาจไม่ใช่วิธีที่สมบูรณ์แบบสำหรับสถานการณ์ของคุณ แต่อาจเป็นจุดเริ่มต้นในการแก้ปัญหาของคุณ รู้สึกอิสระที่จะใช้ชิ้นส่วนของรหัสที่ใช้ในโมดูล Genmato_Core (ดูhttps://github.com/Genmato/Core ) โมดูลสำหรับวิธีการแก้ปัญหาของคุณเอง


ขอบคุณ ฉันจะลองวันนี้และจะแจ้งให้คุณทราบ ดูเหมือนว่ามีแนวโน้ม
Pedram Behroozi

@PedramBehroozi คุณลองแล้วมันใช้งานได้หรือเปล่า ฉันจะสนใจเช่นกัน :)
simonthesorcerer

@simonthesorcerer ยังไม่ได้ แต่ฉันควรจะจัดการกับมันก่อนวันเสาร์ จะอัปเดตในไม่ช้า
Pedram Behroozi

-1

แทนที่จะโพสต์ลิงก์โพสต์โค้ดบางส่วนในกรณีที่ลิงก์ไม่ทำงานอีกต่อไป
rob3000
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.