在自定义模块上的system.xml中添加日期选择器

时间:2010-09-07 16:57:25

标签: magento

如主题中所述,我正在尝试在系统>中添加日期字段及其日期选择器。自定义模块的配置区域(因此使用etc / system.xml)。

我试图从以下主题中获取灵感: Magento - Add a button to system.xml with method attached to it

但没有成功。

我确定这是一个创建正确的块或方法来创建自定义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 个答案:

答案 0 :(得分:15)

编辑02/19/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] / Namespace / 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();
    }
}

答案 1 :(得分:2)

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 /文件夹或app / Mage / Core /文件夹中不是为Magento创建自定义代码的最佳方法。这些文件夹用于核心代码,而不是自定义代码。

此方法创建的代码量最少,并且不会更改任何核心文件。因此,在lib /文件夹中有额外的文件没有任何危害。但是你需要记住你在lib /.

中有你的模块的额外文件

希望这有帮助