Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在Magento中扩展/覆盖扩展_Php_Class_Magento_Magento 1.7 - Fatal编程技术网

Php 在Magento中扩展/覆盖扩展

Php 在Magento中扩展/覆盖扩展,php,class,magento,magento-1.7,Php,Class,Magento,Magento 1.7,我安装了一个扩展,我想从我的模块中使用它的功能性。该分机中的postAction是所有发生的地方。它使用youtube API检索视频信息,并将其保存在Magento EAV数据模型的多个表中 我已经创建了一个功能模块来测试youtube API函数,只需使用一个按钮和一个文本框来发送一些搜索词。但是现在我想使用扩展函数自动地进行调用并填充必要的表,而不是从代码中手动完成所有操作 所以我需要(或想要?或必须?)设置对该postAction的呼叫,或扩展或覆盖它。我在这里迷路了,我是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());
....
}
我已经阅读了这些链接上的信息,但我不清楚我到底要做什么。是否遵循
观察者
模式?也许只是自己创建一个
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);
    }
}

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

调用控制器的操作

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

  • $path
    定义为“moduleName/controllerName”
  • $arguments=array()
    被定义为耦合参数name=>Value Ex.

    $this->_redirect('checkout/cart', array('Pname' => $pValue, ... );
    
    只有当您从控制器调用它时,它才会工作

    您可以在此处找到有关_重定向的更多信息:

    如果要从模型或控制器的任何不同文件执行重定向,则需要以以下方式调用url:

    Mage::app()->getResponse()->setRedirect(Mage::getUrl($path, $arguments=array()));
    
    因此,上述示例becames:

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

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

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

    观察员示例

    • PackageName/ModuleName/Model/Observer.php

    • 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>
      ....
      
      
      ....
      独生子女
      包装名称模块名称模型观察者
      myActionMethod
      ....
      

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

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

    您可以找到默认Magento事件的列表


    我希望它能帮助您扩展模块类

    class AW_Vidtest_YoutubeController extends Mage_Core_Controller_Front_Action {
    .....
    }
    
    范例 类AW1_Vidtest1_YouTube控制器1扩展了AW_Vidtest_YouTube控制器{ ..... }

    在哪里 AW1_Vidtest1_YoutubeController1 AW1是命名空间Vidtest1是您的模块名YoutubeController1是您希望post操作使用的控制器


    希望它对您有用

    您希望使用的YouTube API扩展是什么?我下载了,它的工作没有任何抱怨。但我想要的是使用它的功能,这样我就可以使用新视频自动更新产品的视频属性,而无需用户干预。使用事件观察者而不是重写其类有什么用?视频证明代码是开放的,所以我可以毫无问题地看一看。我再次检查了,看看我是否可以使用这种方法。我会尝试看看你的建议是否也符合我的需要。嗯…一句话:我想从我的代码中重用扩展上的postAction,以避免在扩展代码或数据库表更改时重复代码和将来的bug。操作与控制器相关,所以它们是URL。。。如果要调用操作,必须使用重定向方法调用url:
    $this->\u redirect('moduleName/controllerName')例如,
    $this->_重定向('checkout/cart')
    重定向
    似乎很有用。如何填写通过
    post
    操作传递的数据?在本例中,数据是youtube url、标题和用户名称(在本例中,它可以是任何内容,因为此过程将使用cron作业自动运行)测试…但我有一个错误,当使用重定向调用扩展模块时,因为我在模块上,它抛出一个错误
    无效方法
    。我想我应该在类的某个地方添加
    include
    ,或者修改配置(或其他文件?),以便能够从模块中调用扩展名,对吗?如果是,那么你能提供一个样本或链接到哪里去查看吗?我现在要做一个搜索。。。也许这会有所帮助?看来最终的解决方案是使用观察者模式的扩展。
    class AW_Vidtest_YoutubeController extends Mage_Core_Controller_Front_Action {
    .....
    }