我安装了一个扩展,我想从我的模块中使用它的功能性。该扩展中的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
中定义)
$path
定义为"moduleName/controllerName"$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是您希望后操作使用的控制器。
希望它对你有用