Подтвердить что ты не робот

Magento - добавьте кнопку system.xml с прикрепленным к ней способом

Я создал модуль, который имеет метод "export like", который работает регулярно, как определено в моей области cron модуля файла config.xml. Но я хотел бы дать пользователю возможность запускать этот метод экспорта по требованию, добавив в конфигурацию системы кнопку "Запустить сейчас", используя файл system.xml.

Кажется, что кнопка "frontend type" может работать, как я пытался, и добавляет крошечную кнопку для клика в разделе конфигурации. Но я не могу прикрепить метод и метку на самой кнопке.

Я подумал о добавлении кнопки в файле "Grid.php" модуля, но это не то, что я хотел бы сделать, так как он подходит для моего acl.

Ниже представлен мой файл system.xml с видом интерфейса "button".

Кто-нибудь знает, как:

  • добавить метку/значение к кнопке
  • добавить класс к кнопке
  • добавить метод вызова при нажатии кнопки

Большое спасибо за вашу помощь!

    <?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>
4b9b3361

Ответ 1

Примечание: с этого вопроса 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().

Хьюг.

edit: я удалил кепки edit: исправлена ​​ошибка орфографии

Ответ 2

Ответы Hugues сделали трюк. Однако стоит обратить внимание на то, что действие frontend_model не должно иметь заглавных букв.

Это должно быть

<frontend_model>bar/button</frontend_model>

вместо

<frontend_model>bar/button</frontend_model>

Итак, вот что я сделал, чтобы все это работало в процессе администрирования.

1) Следуя инструкциям, изложенным Hugues (еще раз, не забудьте закрыть шапки в вызове frontend_model)

2) В app/code/local/Foo/Bar/Block/Button.php изменилось определение $url, чтобы заставить его вызвать контроллер администратора модуля Foo_Bar

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

3) Создал/отредактировал действие контроллера контроллера Foo_Bar, в котором я назвал желаемый метод с помощью

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

и добавил перенаправление в область adminhtml, к которой я хотел, чтобы пользователь был перенаправлен (раздел несущих конфигурации config в моем случае):

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

И все течет!

Еще раз спасибо...!