मैं सिस्टम कॉन्फ़िगरेशन में अपने कस्टम डायनेमिक फ़ील्ड में छवि फ़ील्ड कैसे जोड़ूं?


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>

तत्व उस स्थान का प्रतिनिधित्व करता है जहां छवि को अपलोड किया जाएगा। उपरोक्त उदाहरण में, छवि को मीडिया फ़ोल्डर के तहत एक उप-फ़ोल्डर में सहेजा जाएगा। जैसे / मीडिया / थीम /। तत्व का उपयोग टैग को रेंडर करने के लिए किया जाता है। उपरोक्त उदाहरण से छवि को आउटपुट करने के लिए, आप निम्न कोड का उपयोग कर सकते हैं

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

मैं system.xmlअपने मामले में उपयोग नहीं कर सकता । कृपया मेरे प्रश्न को फिर से पढ़ें।
पेद्रम बेहारोजी

लेकिन आप इसका इस्तेमाल क्यों नहीं कर सकते
विवेक खंडेलवाल

क्योंकि आपका दृष्टिकोण सिस्टम कॉन्फ़िगरेशन में एक छवि फ़ील्ड जोड़ता है। मैं छवि क्षेत्रों की गतिशील संख्या रखना चाहता हूं।
पेद्राम बेहारोजी

ठीक है। मैं आपको एक अलग दृष्टिकोण बताऊंगा
विवेक खंडेलवाल

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();
    }

}

यहाँ मैं अपलोड की गई फाइल को प्रति विन्यास पंक्ति के चयन के लिए एक चयन / ड्रॉपडाउन विकल्प का उपयोग करता हूं, इससे मुझे कई पंक्तियों पर एक ही फाइल का उपयोग करने की अनुमति मिलती है।

यह आपकी स्थिति के लिए सही समाधान नहीं हो सकता है, लेकिन आपकी समस्या को हल करने के लिए एक प्रारंभिक बिंदु हो सकता है। अपने स्वयं के समाधान के लिए Genmato_Core ( https://github.com/Genmato/Core ) मॉड्यूल में उपयोग किए गए कोड के कुछ हिस्सों का उपयोग करने के लिए स्वतंत्र महसूस करें ।


धन्यवाद। मैं आज कोशिश करूँगा और आपको बता दूँगा। यह आशाजनक लगता है।
पैद्राम बेहारोजी

@PedramBehroozi क्या आपने इसे आज़माया, और यह काम किया? मैं भी रुचि :) होगा
simonthesorcerer

@simonthesorcerer अभी तक नहीं, लेकिन मुझे शनिवार से पहले इससे निपटना चाहिए। जल्द ही अपडेट होगा।
पेडराम बेहारोजी

-1

पोस्ट लिंक के बजाय कुछ कोड पोस्ट करते हैं, जब लिंक अब काम नहीं करते हैं
rob3000
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.