在Magento中扩展/覆盖扩展


Extending / overriding extension in Magento

我安装了一个扩展,我想从我的模块中使用它的功能性。该扩展中的postAction就是一切发生的地方。它使用youtube API来检索视频信息,并将其保存在Magento EAV数据模型的几个表中。

我已经创建了一个功能模块来测试youtube API函数,只需使用一个按钮和一个文本框来发送一些搜索词。但现在我想自动使用扩展函数来进行调用并填写必要的表,而不是从代码中手动完成所有操作。

所以我需要(或者想要?或者必须?)设置对postAction的调用,或者扩展或覆盖它。我在这里迷路了,我是Magento和PHP的新手,所以我不清楚该怎么做。

这是我想要调用的类:

/**
 * Youtube Upload Controller
 */
class AW_Vidtest_YoutubeController extends Mage_Core_Controller_Front_Action {
.....
}

里面有postAction函数:

/**
 * Get customer video
 */
public function postAction() {
    $data = new Varien_Object($this->getRequest()->getPost());
....
}

我已经阅读了这些链接上的信息,但我不清楚我到底应该做什么。遵循Observer模式?也许只是自己创建一个post调用,并以某种方式添加$data结构,以便在调用中使用它?感谢

  • 如何覆盖/扩展抽象类
  • 避免扩展冲突
  • 来自两个不同模块的块超控
  • 在多个模块中覆盖magento块

编辑:这是我到目前为止的代码,由@Francesco提出建议。函数printVideoEntry是从另一个函数调用的,位于for each内部,该函数目前遍历目录上的前3个产品。

<?php
class Dts_Videotestimonials_Model_SearchVideo extends Mage_Core_Model_Abstract
{
    public $search_term;
    private $productModel;
    function printVideoEntry($videoEntry, $_product, $tabs = "")
    {
        # get user data
        $user = Mage::getSingleton('admin/session');
        $userName = $user->getUser()->getFirstname();
        $userEmail = $user->getUser()->getEmail();
        $data = array(
            "ProductId" => $_product->getId(),
                        "AuthorEmail" => $userEmail,
                        "AuthorName" => $userName,
                        "VideoLink" => $videoEntry->getVideoWatchPageUrl(),
                        "VideoType"  => "link",
                        "Title" => $videoEntry->getVideoTitle(),
                        "Comment" => "this is a comment"
        );
        $actionUrl = Mage::getUrl('vidtest/youtube/post');
        Mage::app()->getResponse()->setRedirect($actionUrl, $data);
    }
}

要给出一个明确的答案并不容易。。。这个问题还不清楚,因为我们不知道youtube扩展是如何工作的。(代码是加密的还是打开的?)

调用控制器的操作

如果只想调用postAction,可以使用_redirect($path, $arguments=array())方法。(在Mage/Core/Controller/Varien/Action.php中定义)

  1. $path定义为"moduleName/controllerName"
  2. $arguments=array()定义为偶参数Name=>Value

示例

$this->_redirect('checkout/cart', array('Pname' => $pValue, ... );

只有当你从控制器调用它时,这才会起作用。。。

你可以在这里找到更多关于_redirect的信息:参数为+或/的magento_redirect

如果你想从一个模型或任何不同的文件中进行重定向,你需要用这种方式调用url:

Mage::app()->getResponse()->setRedirect(Mage::getUrl($path, $arguments=array()));

所以上面的例子是:

Mage::app()->getResponse()->setRedirect(Mage::getUrl('checkout/cart', array('Pname' => $pValue, ... ));

观察员

使用观察器意味着向模块(观察器)添加一个新模型,并在这个类中编写一个方法,在某些事件下执行操作,可能您想调用yt扩展的一些模型/方法。

然后你必须在config.xml中声明这些东西,将你的观察者方法绑定到某个事件(任何预定义的,即使是在Magento中也适合你,或者如果你需要,你应该创建自己的重写Magento类…)

观察员示例

  • PackageName/ModuleName/Model/Observer.php

    class PackageName_ModuleName_Model_Observer {
        public function myActionMethod(Varien_Event_Observer $observer) {
            // Code ... 
            // just a very indicative example
            $model = Mage::getModel('youtubeExtension/Model....').method();
        }
    }
    

  • PackageName/ModuleName/etc/config.xml

    <config>
    ....
    <global>
        <events>
            <EventName>
                <observers>
                    <moduleName_observer>
                        <type>singleton</type>
                        <class>PackageName_ModuleName_Model_Observer</class>
                        <method>myActionMethod</method>
                    </moduleName_observer>                         
                </observers>
            </EventName>
        </events>
    </global>
    ....
    

显然,根据您的包/模块/方法名称更改EventName和所有假名

最困难的是找到适合你的活动。。。每当你在magento代码中看到类似Mage::dispatchEvent('EventName', Parameters);的东西时,这就是一个事件。

你可以在这里找到默认Magento事件的列表

我希望它能帮助你

只需尝试扩展您的模块类

class AW_Vidtest_YoutubeController extends Mage_Core_Controller_Front_Action {
.....
}

示例类AW1_Vidtest1_YoutubeController1扩展AW_Vidtest_YoutubeController{。。。。。}

其中AW1_Vidtest1_YoutubeController1 AW1是命名空间Vidtest1是您的模块名称YoutubeController1是您希望后操作使用的控制器。

希望它对你有用