Làm cách nào để thêm trường Hình ảnh vào các trường động tùy chỉnh của tôi trong cấu hình hệ thống?


10

Tôi muốn cho phép người dùng quản trị tạo nhiều trường như anh ấy / cô ấy muốn. Tôi tìm thấy một giải pháp trong một phần mở rộng khác và tôi đã sử dụng nó làm điểm khởi đầu của mình. Vì vậy, tôi có một mã như thế này:

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

Và trong 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;
    }

Nó hoạt động như mong đợi và nó như thế này:

nhập mô tả hình ảnh ở đây

Bây giờ tôi muốn thêm một trường tải lên hình ảnh vào bộ trường của tôi. Tôi nên làm thế nào?

Cập nhật :

Tôi biết rằng trong system.xmlbạn có thể viết mã này để thêm các trường hình ảnh:

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

Nhưng tôi không thể sử dụng phương pháp này vì tôi muốn có nhiều lĩnh vực chứ không phải một lĩnh vực.

Câu trả lời:


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>

Phần tử đại diện cho vị trí mà hình ảnh sẽ được tải lên. Trong ví dụ trên, hình ảnh sẽ được lưu vào thư mục con trong thư mục phương tiện. ví dụ / phương tiện / chủ đề /. Phần tử được sử dụng để hiển thị thẻ. Để xuất hình ảnh từ ví dụ trên, bạn có thể sử dụng đoạn mã sau

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

Tôi không thể sử dụng system.xmltrong trường hợp của tôi. Xin vui lòng đọc câu hỏi của tôi một lần nữa.
Pedram Behroozi

Nhưng tại sao bạn không thể sử dụng nó
Vivek Khandelwal

Bởi vì cách tiếp cận của bạn thêm một trường hình ảnh vào cấu hình hệ thống. Tôi muốn có số lượng trường hình ảnh động.
Pedram Behroozi

Được chứ. Tôi sẽ nói với bạn một cách tiếp cận khác
Vivek Khandelwal

1

Tôi đã thử một cái gì đó tương tự và chỉ có nó được giải quyết một phần.

Đầu tiên, để thêm nhiều loại trường trong lựa chọn mảng / đăng cấu hình của bạn, tôi đã tạo ra một phiên bản mở rộng của lớp Mage_Adminhtml_Block_System_Config_Form_Field_Array_Abstractbao gồm các loại select, multiselectfile(như chức năng ban đầu chỉ cho phép bạn sử dụng các textloại), xem https: / /github.com/Genmato/Core/blob/master/app/code/community/Genmato/Core/Block/System/Config/Form/Field/Array/Abstract.php (tập tin là một chút để lớn để bao gồm ở đây).

Tiếp theo tôi phát hiện ra rằng việc kết hợp loại tệp với các trường (chọn / văn bản) khác không hoạt động đúng. Khi lưu dữ liệu, chỉ có các chi tiết tệp ở nơi có sẵn và mảng bị rối. Vì vậy, tôi đã chọn giải pháp để có một trường để lưu các video tải lên:

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

Lớp khối tương ứng:

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

}

Và lớp mô hình phụ trợ:

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

}

Và một trường thứ hai nơi tôi lưu trữ cấu hình của mình:

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

Và lớp khối được sử dụng:

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

}

Ở đây tôi sử dụng tùy chọn chọn / thả xuống để chọn tệp được tải lên trên mỗi hàng cấu hình, điều này cũng cho phép tôi sử dụng cùng một tệp trên nhiều hàng.

Đây có thể không phải là giải pháp hoàn hảo cho tình huống của bạn, nhưng có thể là điểm khởi đầu để giải quyết vấn đề của bạn. Vui lòng sử dụng các phần của mã được sử dụng trong mô-đun Genmato_Core (Xem https://github.com/Genmato/Core ) cho giải pháp của riêng bạn.


Cảm ơn. Tôi sẽ thử nó ngay hôm nay và sẽ cho bạn biết. Có vẻ đầy hứa hẹn.
Pedram Behroozi

@PedramBehroozi bạn đã thử chưa, và nó có hoạt động không? Tôi cũng sẽ quan tâm :)
simonthesorcerer 10/11/2015

@simonthesorcerer chưa, nhưng tôi nên giải quyết nó trước thứ bảy. Sẽ cập nhật sớm.
Pedram Behroozi

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.