Search code examples
phpmagentohttp-redirectobserver-patternmagento-1.7

Magento redirect from adminthtml page to a frontend action


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> 

Solution

  • 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.