1

我安装了一个扩展,我想从我的模块中使用它的功能。该扩展中的 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结构以便可以在呼叫中使用它?谢谢

编辑: 这是我到目前为止的代码,由@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);
    }
}
4

2 回答 2

1

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

调用控制器的动作

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

  1. $path定义为“模块名称/控制器名称”
  2. $arguments=array()定义为对参数名称 => 值。

前任。

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

仅当您从 Controller 调用它时,这才有效...

您可以在此处找到有关 _redirect 的更多信息:magento _redirect with parameters that have + or /

如果您想从模型或任何不同的文件从控制器进行重定向,您将需要以这种方式调用 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();
    
        }
    
    }
    
  • 包名/模块名/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 事件列表

希望对你有帮助

于 2012-09-03T09:46:19.337 回答
1

试着扩展你的模块类

class AW_Vidtest_YoutubeController extends Mage_Core_Controller_Front_Action {
.....
}

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

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

希望它对你有用

于 2012-09-03T10:51:08.740 回答