Sistem yapılandırmasındaki özel dinamik alanlarıma Görüntü alanını nasıl eklerim?


10

Yönetici kullanıcının istediği kadar alan oluşturmasına izin vermek istiyorum. Başka bir uzantıda bir çözüm buldum ve başlangıç ​​noktam olarak kullandım. Yani böyle bir kod var:

İçinde 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>

Ve içinde 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;
    }

Beklendiği gibi çalışır ve şöyle:

resim açıklamasını buraya girin

Şimdi alan setime bir Resim yükleme alanı eklemek istiyorum. Bunu nasıl yapmalıyım?

Güncelleme :

system.xmlİçinde görüntü alanları eklemek için bu kodu yazabilirsiniz biliyorum :

<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>

Ama bu yaklaşımı kullanamıyorum çünkü bir alan değil birden çok alanım var.

Yanıtlar:


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>

Öğe, görüntünün yükleneceği konumu temsil eder. Yukarıdaki örnekte, resim medya klasörünün altındaki bir alt klasöre kaydedilecektir. örneğin / media / theme /. Öğe, etiketi oluşturmak için kullanılır. Yukarıdaki örnekte görüntü çıktısı almak için aşağıdaki kodu kullanabilirsiniz

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

system.xmlBenim durumumda kullanamam . Lütfen sorumu tekrar okuyun.
Pedram Behroozi

Ama neden kullanamıyorsun
Vivek Khandelwal

Çünkü yaklaşımınız sistem yapılandırmasına bir görüntü alanı ekliyor. Dinamik sayıda görüntü alanına sahip olmak istiyorum.
Pedram Behroozi

Tamam. Size farklı bir yaklaşım anlatacağım
Vivek Khandelwal

1

Benzer bir şey denedim ve sadece kısmen çözdüm.

Öncelikle, dizi / tefrika yapılandırma seçeneği alanların birden türleri eklemek için, ben sınıfın uzun versiyonunu yarattı Mage_Adminhtml_Block_System_Config_Form_Field_Array_Abstracttürleri dahil select, multiselectve file(orijinal işlevi yalnızca kullanım izni olarak texttürünü), bkz https: / /github.com/Genmato/Core/blob/master/app/code/community/Genmato/Core/Block/System/Config/Form/Field/Array/Abstract.php (burada dosya eklemek biraz daha büyüktür).

Sonra, dosya türünü diğer (select / text) alanlarıyla birleştirmenin düzgün çalışmadığını öğrendim. Verileri kaydederken yalnızca dosya ayrıntıları ve dizinin dağılması. Bu yüzden yüklemeleri kaydetmek için bir alana sahip bir çözüm seçtim:

<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>

Karşılık gelen blok sınıfı:

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

}

Ve arka uç model sınıfı:

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

}

Ve yapılandırmamı sakladığım ikinci bir alan:

<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>

Ve blok sınıfı kullanıldı:

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

}

Burada, yapılandırma satırı başına yüklenen dosyayı seçmek için bir seçme / açılır seçeneği kullanıyorum, bu da aynı dosyayı birden fazla satırda kullanmama izin veriyor.

Bu, durumunuz için mükemmel bir çözüm olmayabilir, ancak sorununuzu çözmek için bir başlangıç ​​noktası olabilir. Kendi çözümünüz için Genmato_Core (bkz. Https://github.com/Genmato/Core ) modülünde kullanılan kodun parçalarını kullanmaktan çekinmeyin .


Teşekkürler. Bugün deneyeceğim ve size bildireceğim. Umut verici görünüyor.
Pedram Behroozi

@PedramBehroozi denediniz ve çalıştı mı? Ben de ilgilenirim :)
simonthesorcerer

@simonthesorcerer henüz değil, ancak Cumartesi'den önce ilgilenmeliyim. Yakında güncellenecek.
Pedram Behroozi

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.