代码之家  ›  专栏  ›  技术社区  ›  Hervé Guétin

Magento-向system.xml添加一个附加了方法的按钮

  •  13
  • Hervé Guétin  · 技术社区  · 14 年前

    我创建了一个模块,该模块有一个“类似导出”的方法,按照config.xml文件的模块cron区域中的定义定期运行。但是我想通过在系统配置中添加一个“runnow”按钮,从而使用system.xml文件,让用户能够按需运行这个导出方法。

    似乎“frontendtype”按钮可以像我尝试的那样工作,它在config部分添加了一个小的可点击按钮。但我无法在按钮本身上附加方法或标签。

    我想在模块的“Grid.php”文件中添加一个按钮,但这不是我想做的,因为它确实适合我的acl。

    下面是带有“button”前端类型的system.xml文件。

    有人知道如何:

    • 向按钮添加标签/值
    • 添加单击按钮时要调用的方法

    非常感谢你的帮助!

        <?xml version="1.0" encoding="UTF-8"?>
        <config>
         ...
             <fields>
              ...
              <run translate="label">
               <label>Run now</label>
               <frontend_type>button</frontend_type>
               <backend_model>SOME BACKEND MODEL</backend_model>
               <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>
    
    2 回复  |  直到 14 年前
        1
  •  18
  •   liquidity    10 年前

    注:从这个问题开始,Magento就进化了。请注意,此解决方案在当前版本中可能不起作用。

    你应该尝试添加一个 <frontend_model></frontend_model> . 例如:

        <?xml version="1.0" encoding="UTF-8"?>
        <config>
         ...
             <fields>
              ...
              <run translate="label">
               <label>Run now</label>
               <frontend_type>button</frontend_type>
               <frontend_model>bar/button</frontend_model>
               <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>
    

    然后创建app/code/local/Foo/Bar/Block/Button.php,在其中复制:

    <?php 
    class Foo_Bar_Block_Button extends Mage_Adminhtml_Block_System_Config_Form_Field
    {
    
        protected function _getElementHtml(Varien_Data_Form_Element_Abstract $element)
        {
            $this->setElement($element);
            $url = $this->getUrl('catalog/product'); //
    
            $html = $this->getLayout()->createBlock('adminhtml/widget_button')
                        ->setType('button')
                        ->setClass('scalable')
                        ->setLabel('Run Now !')
                        ->setOnClick("setLocation('$url')")
                        ->toHtml();
    
            return $html;
        }
    }
    ?>
    

    感谢phy4me。

    要更好地了解发生了什么,请阅读核心资料: app/code/core/Mage/Adminhtml/Block/System/Config/Form.php initForm() 功能和 initFields() 功能。

    胡格斯。

    编辑:纠正拼写错误

        2
  •  5
  •   VijayS91    9 年前

    胡格斯的回答起了作用。 但需要注意的一点是,前端模型动作不能有caps。

    这一定是

    <frontend_model>bar/button</frontend_model>
    

    而不是

    <frontend_model>Bar/Button</frontend_model>
    

    1) 遵循Hugues的指示(再一次,注意不要在前端模型调用中使用大写字母)

    2) 在app/code/local/Foo/Bar/Block/Button.php中,更改了$url定义,使其能够调用Foo\u Bar模块的管理控制器

    $url = $this->getUrl('bar/adminhtml_controller/action');
    

    3) 创建/编辑Foo_Bar管理控制器的操作,在该操作中,我使用

    Mage::getModel('bar/block')->method();
    

    并添加了一个重定向到adminhtml区域,我希望将用户重定向到该区域(在我的示例中是config的carriers部分):

    $this->_redirect('adminhtml/system_config/edit/section/carriers');
    

    一切都在流动!