Добавьте средство выбора даты в system.xml в пользовательском модуле - PullRequest
6 голосов
/ 07 сентября 2010

Как указано в теме, я пытаюсь добавить поле даты с его указателем даты в Системе> Область конфигурации для пользовательского модуля (таким образом, используя etc / system.xml).

Я пыталсячерпайте вдохновение из темы ниже: Magento - добавьте кнопку в system.xml с прикрепленным к ней методом

, но безуспешно.

Я уверен, что этоВопрос о создании правильного блока или метода для создания настраиваемого HTML-поля, но я не могу прочитать через матрицу Magento:)

Я застрял на этапе, когда мне нужно кодировать класс (Datefield.php):

    <?php
            class Namespace_Module_Block_Datefield extends Mage_Adminhtml_Block_System_Config_Form_Field {

             protected function _getElementHtml(Varien_Data_Form_Element_Abstract $element) {
    // ----> Am I wrong in calling ..._Abstract?  Should I call Varien_Data_Form_Element_Date? I've tried but no success either...

$this->setElement($element);

              $html = // ------------------> what to put here? Call a block or some other method?
                      ->setFormat('d-m-Y')
                      ->setLabel($this->__('Choose date'))
                      ->toHtml();

              return $html;
             }
            }    
            ?>

У вас есть хитрость, как это сделать?

Большое спасибо.Эрве

Ответы [ 2 ]

15 голосов
/ 02 мая 2012

РЕДАКТИРОВАНИЕ 19.02.2014: добавлено подтверждение

Я нашел более элегантный способ сделать это. На самом деле, методы satrun77 в порядке, но мы должны поместить файл в Varien / Data / Form / Element /, который можно перезаписать, если кто-то еще, работающий над проектом, использует то же имя файла / класса. Более того, этот метод помещает файл в каталоги модулей, что, я думаю, лучше, чем распространение файлов по всему дереву каталогов.

В system.xml:

<?xml version="1.0" encoding="UTF-8"?>
   <config>
   ....
       <fields>
       ...
          <run translate="label">
           <label>Date</label>
           <frontend_type>text</frontend_type> <!-- Use text instead of "myDateSelection" -->
           <frontend_model>module/adminhtml_system_config_date</frontend_model> <!-- Call a module specific renderer model -->
           <sort_order>20</sort_order>
           <show_in_default>1</show_in_default>
           <show_in_website>1</show_in_website>
           <validate>required-entry</validate> <!-- Optional -->
           <show_in_store>1</show_in_store>
          </run>
       </fields>
   ...
   </config>

Создать новый файл:

app / code / [local, community] / Пространство имен / Module / Block / Adminhtml / System / Config / Date

с содержанием ниже:

class Namespace_Module_Block_Adminhtml_System_Config_Date extends Mage_Adminhtml_Block_System_Config_Form_Field
{
    protected function _getElementHtml(Varien_Data_Form_Element_Abstract $element)
    {
        $date = new Varien_Data_Form_Element_Date;
        $format = Mage::app()->getLocale()->getDateFormat(Mage_Core_Model_Locale::FORMAT_TYPE_SHORT);

        $data = array(
            'name'      => $element->getName(),
            'html_id'   => $element->getId(),
            'image'     => $this->getSkinUrl('images/grid-cal.gif'),
        );
        $date->setData($data);
        $date->setValue($element->getValue(), $format);
        $date->setFormat(Mage::app()->getLocale()->getDateFormat(Mage_Core_Model_Locale::FORMAT_TYPE_SHORT));
        $date->setClass($element->getFieldConfig()->validate->asArray());
        $date->setForm($element->getForm());

        return $date->getElementHtml();
    }
}
2 голосов
/ 06 апреля 2011

Создать файл класса в app/code/local/Varien/Data/Form/Element/. Убедитесь, что в имени файла стоит префикс, который идентифицирует ваш модуль (это просто для того, чтобы отличить ваш пользовательский код от файлов ядра Magneto)

class Varien_Data_Form_Element_MyDateSelection extends Varien_Data_Form_Element_Date
{
    public function getElementHtml()
    {
        // define image url
        $this->setImage(Mage::getDesign()->getSkinUrl('images/grid-cal.gif'));
        // define date format
        $this->setFormat('yyyy-MM-dd');

        return parent::getElementHtml();
    }
}

Внутри вашего модуля system.xml

<?xml version="1.0" encoding="UTF-8"?>
   <config>
   ....
       <fields>
       ...
          <run translate="label">
           <label>Run now</label>
           <frontend_type>myDateSelection</frontend_type>
           <sort_order>20</sort_order>
           <show_in_default>1</show_in_default>
           <show_in_website>1</show_in_website>
           <show_in_store>1</show_in_store>
          </run>
       </fields>
   ...
   </config>

Размещение пользовательского кода внутри lib / folder или app / Mage / Core / folder - не лучший способ создания пользовательского кода для Magento. Эти папки предназначены для основного кода, а не для пользовательского кода.

Этот подход создает наименьшее количество кода и не меняет файлы ядра. Таким образом, нет никакого вреда от наличия дополнительного файла в папке lib /. Но вы должны помнить, что у вас есть дополнительный файл для вашего модуля в lib /.

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...