Добавление своего mass action в админке магазина magento.
Для добавления нового mass action в админке магазина можно воспользоваться двумя средствами:
1. переопределив Admin Grid
2. использовав событие (event)
Первый вариант в 99% случаев считаю неприемлемым, т.к. переопределение базового класса одним модулем повлечет за собой проблемы при использовании этого же класса другим модулем. Предпочтительней использовать события (подробнее о том что это здесь).
Рассмотрим на примере, предполагаем, что модуль у нас уже создан: необходимо добавить новый mass action в листинг продуктов (который будет делать что-то) и поможет нам в этом событие ‘core_block_abstract_prepare_layout_before‘, которое выбрасывается в методе setLayout блоков.
Сначала в файле app/code/local/Mycompany/MassactionModule/etc/config.xml
регистрируем событие и observer (наблюдателя) для него, добавляем следующий код
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<global> ... <events> <core_block_abstract_prepare_layout_before> <observers> <prepare_layout_before_observer> <type>singleton</type> <class>Mycompany_MassactionModule_Model_Observer</class> <method>addMassAction</method> </prepare_layout_before_observer> </observers> </core_block_abstract_prepare_layout_before> </events> ... </global> |
После чего создаем сам observer здесь /var/www/mymagento/site/app/code/local/Mycompany/MassactionModule/Model/Observer.php
.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
class Mycompany_MassactionModule_Model_Observer { public function addMassAction(Varien_Event_Observer $observer) { $block = $observer->getEvent()->getBlock(); if (in_array(get_class($block), array('Mage_Adminhtml_Block_Widget_Grid_Massaction')) && 'catalog_product' == $block->getRequest()->getControllerName()) { $block->addItem('recalculate_price', array( 'label' => 'Recalculate price', 'url' => Mage::getUrl('massactionmodule/massaction/customrecalculateprice/', array('_secure' => true)), )); } } } |
Здесь:
- проверяю имя контроллера на ‘catalog_product’, т.к. меня интересует именно список продуктов
- ‘recalculate_price‘ – значение (value) для option в селекте mass action
- ‘label‘ – то, что будет отображаться в селекте
- ‘url‘ – моего контроллера, который будет производить обработку massactionmodule – имя модуля
- ‘massaction‘ – имя контроллера
- ‘customrecalculateprice‘ – имя метода
Подробнее можно узнать здесь Mage_Adminhtml_Block_Widget_Grid_Massaction_Abstract::addItem.
Далее добавляем роуты в app/code/local/Mycompany/MassactionModule/etc/config.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<admin> ... <routers> <MassactionModule> <use>admin</use> <args> <module>Mycompany_MassactionModule</module> <frontName>massactionmodule</frontName> </args> </MassactionModule> </routers> ... </admin> |
Все, в mass actions теперь появился новый пункт. Если по кам-то причинам, новая опция в mass actions селекте отсутствует, рекомендую почистить кеш magento.
И сам контроллер, который буде выполнять желаемое действие, создаю его здесь app/code/local/Mycompany/MassactionModule/controllers/MassactionController.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php class Mycompany_MassactionModule_MassactionController extends Mage_Adminhtml_Controller_Action { /** * Custom recalculate price */ public function customrecalculatepriceAction() { $productIds = $this->getRequest()->getParam('product'); if (!is_array($productIds)) { $this->_getSession()->addError($this->__('Please select product(s).')); } // do something } } |
В $this->getRequest()->getParam(‘product’) получаю выделенные продукты, а дальше можно начинать совершать желаемое действие.
Вот и все.