После этого сообщения мне удалось захватить событие, расширив Magento_Adminhtml_Controller_Action
и выполнив перед ним некоторые действия. Но теперь я пытаюсь улучшить его, чтобы захватить другое событие, запущенное на панели администратора, и оттуда передать массив через переменную request
в другое событие на интерфейсе. У меня есть эти вопросы и ответы, здесь и здесь, но никак не могу добиться того, что мне нужно. Я проверил observer code
с помощью die()
чтобы убедиться, что поток выполнения переходит в правильный вызов, и все в порядке. Я использую CommerceBug от AlanStorm, в случае, если его можно использовать для освещения этой проблемы.
Это мой код Observer.php.
<?php class Dts_Videotestimonials_Model_Observer { public function hookToAdminhtmlControllerActionPreDispatch($observer) { if($observer->getEvent()->getControllerAction()->getFullActionName() == 'videotestimonials_adminhtml_videotestimonialsbackend_post') { // dispatching our own event before action upload video is run and sending parameters we need Mage::dispatchEvent("upload_video_before", array('request' => $observer->getControllerAction()->getRequest())); } } public function hookToUploadVideoBefore($observer) { //Hooking to our own event $request = $observer->getEvent()->getRequest()->getParams(); // do something with product $user = Mage::getSingleton('admin/session'); $userName = $user->getUser()->getFirstname(); $userEmail = $user->getUser()->getEmail(); $request['product_id'] = "16"; #$_product->getId(), $request['author_email'] = $userEmail; $request['author_name'] = $userName; $request['video_link'] = "http://www.youtube.com/watch?v=y435u6kfExA&feature=youtube_gdata_player"; $request['video_type'] = "link"; $request['title'] = "AT&T Phone Nokia 2610"; $request['comment'] = "this is a comment"; Mage::dispatchEvent("vidtest_youtube_post", $request); } }
Редакция:
Вот полный config.xml
<?xml version="1.0"?> <config> <modules> <Dts_Videotestimonials> <version>0.1.0</version> </Dts_Videotestimonials> </modules> <global> <models> <videotestimonials> <class>Dts_Videotestimonials_Model</class> <resourceModel>videotestimonials_mysql4</resourceModel> </videotestimonials> </models> <events> <controller_action_predispatch> <observers> <controller_action_before> <type>singleton</type> <class>videotestimonials/observer</class> <method>hookToAdminhtmlControllerActionPreDispatch</method> </controller_action_before> </observers> </controller_action_predispatch> <upload_video_before> <observers> <upload_video_before> <type>singleton</type> <class>videotestimonials/observer</class> <method>hookToUploadVideoBefore</method> </upload_video_before> </observers> </upload_video_before> </events> <helpers> <videotestimonials> <class>Dts_Videotestimonials_Helper</class> </videotestimonials> </helpers> <blocks> <videotestimonials> <class>Dts_Videotestimonials_Block</class> </videotestimonials> </blocks> </global> <admin> <routers> <videotestimonials> <use>admin</use> <args> <module>Dts_Videotestimonials</module> <frontName>videotestimonials</frontName> </args> </videotestimonials> </routers> </admin> <adminhtml> <menu> <videotestimonials module="videotestimonials"> <title>Videotestimonials</title> <sort_order>100</sort_order> <children> <videotestimonialsbackend module="videotestimonials"> <title>VideoTestimonials_Admin</title> <sort_order>0</sort_order> <action>videotestimonials/adminhtml_videotestimonialsbackend</action> </videotestimonialsbackend> <pending_video translate="title"> <title>Videos pendientes</title> <sort_order>20</sort_order> <action>videotestimonials/adminhtml_pendingvideos/pending</action> </pending_video> </children> </videotestimonials> </menu> <acl> <resources> <all> <title>Allow Everything</title> </all> <admin> <children> <videotestimonials translate="title" module="videotestimonials"> <title>Videotestimonials</title> <sort_order>1000</sort_order> <children> <videotestimonialsbackend translate="title"> <title>VideoTestimonials_Admin</title> </videotestimonialsbackend> <pending_video translate="title"> <title>Videos pendientes</title> <sort_order>20</sort_order> </pending_video> </children> </videotestimonials> </children> </admin> </resources> </acl> <layout> <updates> <videotestimonials> <file>videotestimonials.xml</file> </videotestimonials> </updates> </layout> </adminhtml> <crontab> <jobs> <videotestimonials_videotestimonialscron> <schedule><cron_expr>59 0 * */1 0</cron_expr></schedule> <run><model>videotestimonials/cron::VideoTestimonialscron</model></run> </videotestimonials_videotestimonialscron> </jobs> </crontab> </config>
в<?xml version="1.0"?> <config> <modules> <Dts_Videotestimonials> <version>0.1.0</version> </Dts_Videotestimonials> </modules> <global> <models> <videotestimonials> <class>Dts_Videotestimonials_Model</class> <resourceModel>videotestimonials_mysql4</resourceModel> </videotestimonials> </models> <events> <controller_action_predispatch> <observers> <controller_action_before> <type>singleton</type> <class>videotestimonials/observer</class> <method>hookToAdminhtmlControllerActionPreDispatch</method> </controller_action_before> </observers> </controller_action_predispatch> <upload_video_before> <observers> <upload_video_before> <type>singleton</type> <class>videotestimonials/observer</class> <method>hookToUploadVideoBefore</method> </upload_video_before> </observers> </upload_video_before> </events> <helpers> <videotestimonials> <class>Dts_Videotestimonials_Helper</class> </videotestimonials> </helpers> <blocks> <videotestimonials> <class>Dts_Videotestimonials_Block</class> </videotestimonials> </blocks> </global> <admin> <routers> <videotestimonials> <use>admin</use> <args> <module>Dts_Videotestimonials</module> <frontName>videotestimonials</frontName> </args> </videotestimonials> </routers> </admin> <adminhtml> <menu> <videotestimonials module="videotestimonials"> <title>Videotestimonials</title> <sort_order>100</sort_order> <children> <videotestimonialsbackend module="videotestimonials"> <title>VideoTestimonials_Admin</title> <sort_order>0</sort_order> <action>videotestimonials/adminhtml_videotestimonialsbackend</action> </videotestimonialsbackend> <pending_video translate="title"> <title>Videos pendientes</title> <sort_order>20</sort_order> <action>videotestimonials/adminhtml_pendingvideos/pending</action> </pending_video> </children> </videotestimonials> </menu> <acl> <resources> <all> <title>Allow Everything</title> </all> <admin> <children> <videotestimonials translate="title" module="videotestimonials"> <title>Videotestimonials</title> <sort_order>1000</sort_order> <children> <videotestimonialsbackend translate="title"> <title>VideoTestimonials_Admin</title> </videotestimonialsbackend> <pending_video translate="title"> <title>Videos pendientes</title> <sort_order>20</sort_order> </pending_video> </children> </videotestimonials> </children> </admin> </resources> </acl> <layout> <updates> <videotestimonials> <file>videotestimonials.xml</file> </videotestimonials> </updates> </layout> </adminhtml> <crontab> <jobs> <videotestimonials_videotestimonialscron> <schedule><cron_expr>59 0 * */1 0</cron_expr></schedule> <run><model>videotestimonials/cron::VideoTestimonialscron</model></run> </videotestimonials_videotestimonialscron> </jobs> </crontab> </config>
Вот что происходит. Неправильная конфигурация контроллера администратора. Правильный способ включить ваш контроллер в раздел администратора – это (вам нужно будет изменить название модуля, чтобы оно соответствовало вашим):
<?xml version="1.0" ?> <config> <modules> <Video_Awesome> <version>0.0.1</version> </Video_Awesome> </modules> <global> <models> <Video_Awesome> <class>Video_Awesome_Model</class> <!-- No resource model used currently --> </Video_Awesome> </models> <events> <controller_action_predispatch> <observers> <controller_action_before> <type>singleton</type> <class>Video_Awesome/Observer</class> <method>controllerActionPredispatch</method> </controller_action_before> </observers> </controller_action_predispatch> <upload_video_before> <observers> <Video_Awesome> <type>singleton</type> <class>Video_Awesome/Observer</class> <method>uploadVideoBefore</method> </Video_Awesome> </observers> </upload_video_before> </events> </global> <admin> <routers> <adminhtml> <!-- we are not creating our own router, but tapping into the adminhtml router --> <args> <modules> <!-- Your module name, and then the path to the controller (minus the controllers folder name). So, in this instance, I put the router in a "Adminhtml" folder inside of the controllers folder, like thus: Video/Awesome/controllers/Adminhtml/videotestimonialsController.php --> <Video_Awesome before="Mage_Adminhtml">Video_Awesome_Adminhtml</Video_Awesome> </modules> </args> </adminhtml> </routers> </admin> </config>
И затем, в вашем маршрутизаторе (вам не нужно вызывать getEvent
перед тем, как получить действие контроллера):
public function controllerActionPredispatch ($observer) { if($observer->getControllerAction()->getFullActionName() == 'adminhtml_videotestimonials_post') { // dispatching our own event before action upload video is run and sending parameters we need Mage::dispatchEvent("upload_video_before", array('request' => $observer->getControllerAction()->getRequest())); } }
И, наконец, это звучит не так, как если бы у вас была отладочная настройка для разработки Magento. Я бы очень рекомендовал его. Я использую PHPStorm (у меня нет доли в компании – это не реклама :), и она работает потрясающе. Установите контрольную точку там, чтобы увидеть, какие переменные есть.
Я бы также рекомендовал использовать adminhtml_controller_action_predispatch_start
, а не глобальный controller_action_predispatch
, поскольку он будет запускаться только в бэкэнд (очень маленькая разница в производительности).
Кроме того, в качестве небольшого sidenote, который я видел в вашем файле config.xml
, вы указывали пункты меню / acl. Вы, вероятно, не знали, но это устаревшая функциональность, и эти элементы должны быть помещены в adminhtml.xml
.