Magento redirect from adminthtml page to a frontend action

半城伤御伤魂 提交于 2019-12-12 20:23:08

问题


Following this post I've finally managed to capture an event by extending the Magento_Adminhtml_Controller_Action and carry out some actions before it. But now I'm trying to improve it so I can capture another event triggered on the admin panel and from there pass an array through the request variable to another event on the frontend. I've these SO questions/answers, here and here but no way I can achieve what I need. I've tested the observer code using die() to be sure that the execution thread goes into the correct call and it is ok. I'm using the CommerceBug from AlanStorm, in case it can be used to get some light on this issue.

This is my Observer.php code.

<?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);
    }
}

EDITED:

Here is the full 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> 

回答1:


Here is what is happening. Your configuration of the admin controller is wrong. The proper way to include your controller in the admin section is this (you'll need to change out the module name, to match yours):

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

And, then, in your router (you don't need to call getEvent before getting the controller action):

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()));
    }
}

And finally, it doesn't sound as if you have a debugging setup for your Magento development. I would highly recommend one. I use PHPStorm (I don't have any stake in the company - this is not an advertisement :), and it works awesome. Set a breakpoint there to see if what the variables are.

I would also recommend using adminhtml_controller_action_predispatch_start, instead of the global controller_action_predispatch, as it will only trigger in the backend (a very, very small performance difference).

Also, as a small sidenote, I saw in your config.xml, that you were specifying menu items/acl there. You probably didn't know, but that is deprecated functionality, and those items should be put it adminhtml.xml.



来源:https://stackoverflow.com/questions/12364478/magento-redirect-from-adminthtml-page-to-a-frontend-action

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!