php - Magento 从 adminthtml 页面重定向到前端操作

标签 php magento redirect observer-pattern magento-1.7

已关注 this post我终于成功地通过扩展 Magento_Adminhtml_Controller_Action 来捕获事件并在其之前执行一些操作。但现在我正在尝试改进它,以便我可以捕获管理面板上触发的另一个事件,并从那里通过 request 变量将数组传递到前端的另一个事件。我有这些问题/答案,herehere但我无法实现我所需要的。我已经使用 die() 测试了观察者代码,以确保执行线程进入正确的调用并且一切正常。我正在使用 AlanStorm 的 CommerceBug,以防它可以用来阐明这个问题。

这是我的 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> 

最佳答案

这就是正在发生的事情。您的管理 Controller 配置错误。将 Controller 包含在管理部分的正确方法是这样的(您需要更改模块名称以匹配您的名称):

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

然后,在您的路由器中(在获取 Controller 操作之前不需要调用 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,因为它只会在后端触发(非常非常小的性能差异)。

另外,作为一个小旁注,我在您的 config.xml 中看到您在那里指定了菜单项/acl。您可能不知道,但这是已弃用的功能,这些项目应该放在 adminhtml.xml 中。

关于php - Magento 从 adminthtml 页面重定向到前端操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12364478/

相关文章:

css - Magento local.xml 引用名称 ="head"到根目录中的 addItem

magento - 安装程序脚本给我 'Wrong Entity ID' Magento 错误

cakephp - nginx 正在从一个虚拟主机重定向到另一个

php - 为什么修复 GD 的 png 透明度问题的解决方案不起作用?

javascript - 如何清空数组?

PHP MySQL PDO::exec 不会引发或抛出多命令脚本的错误

asp.net-mvc - 从 ASP.NET MVC Controller 重定向到外部 URI

php - 反转和反转数组的数组

Magento 管理网格将数据从 Action 发送到 Controller

c - 使用 dup2 系统调用重定向输出的奇怪问题