【问题标题】:Magento unable to override an action of a controllerMagento 无法覆盖控制器的操作
【发布时间】:2015-10-02 13:40:19
【问题描述】:

我需要覆盖code/core/Mage/ProductAlert/controllersAddController.php 中的stockAction()。所以我搜索了很多以了解如何进行,并得到了这个:

/etc/modules/Totem_ProductAlert.xml

<?xml version="1.0"?>
<config>
<modules>
    <Totem_ProductAlert>
        <active>true</active>
        <codepool>local</codepool>
    </Totem_ProductAlert>
</modules>
</config>

/code/local/Totem/ProductAlert/etc/config.xml

<?xml version="1.0" encoding="UTF-8"?>
<config>
<modules>
    <Totem_ProductAlert>
        <version>0.0.1</version>
    </Totem_ProductAlert>
</modules>

<frontend>
    <routers>
        <productalert>
            <args>
                <modules>
                    <Totem_ProductAlert before="Mage_ProductAlert">Totem_ProductAlert</Totem_ProductAlert>
                </modules>
            </args>
        </productalert>
    </routers>
</frontend>
</config>

/code/local/Totem/ProductAlert/controllers/AddController.php

class Totem_ProductAlert_AddController extends Mage_ProductAlert_AddController
{
  public function stockAction()
  {
    Mage::log('test', null, 'Test.log');
  }

但该操作未被覆盖,也没有创建任何 Test.log。

有人知道我在哪里搞砸了吗?

谢谢。

【问题讨论】:

  • /code/local/Totem/ProductAlert/controllers/AddController.php 是否包含对您要覆盖的 Mage 核心文件的引用?即 require_once Mage::getModuleDir('controllers', 'Mage_Product_Alert').DS.'AddController.php'; - 你确定你的模块正在加载吗? (清除缓存,添加 die() 等?)
  • 是的:require_once Mage::getModuleDir('controllers', 'Mage_ProductAlert').DS.'AddController.php'; 缓存已禁用,我如何确定我的模块已加载? (出现在System &gt; Configuration &gt; Advanced &gt; Advanced

标签: php magento magento-1.8


【解决方案1】:

你的代码有问题:

  • Totem_ProductAlert.xml 中的 syntax issue&lt;codepool&gt;应该 是&lt;codePool&gt; .p 应该是大写字母。

<?xml version="1.0"?>
<config>
<modules>
    <Totem_ProductAlert>
        <active>true</active>
        <codePool>local</codePool>
        <depends>Mage_ProductAlert</depends>
    </Totem_ProductAlert>
</modules>
</config>
  • 需要正确调用包括 Core AddController.phpTotem_ProductAlert_AddController

<?php

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Description of AddController
 *
 * @author work
 */
require_once Mage::getModuleDir('controllers', 'Mage_ProductAlert').DS.'AddController.php';
class Totem_ProductAlert_AddController extends Mage_ProductAlert_AddController
{
  public function stockAction()
  {
  
    Mage::log('test', null, 'Test.log',true);
  }
}

【讨论】:

  • 谢谢!我忘了在我的问题中复制粘贴 require_once,问题出在代码池/代码池上。非常感谢
【解决方案2】:

试试这个

<?xml version="1.0"?>
<config>
  <modules>
    <Totem_ProductAlert>
      <active>true</active>
      <codePool>local</codePool>
      <version>0.1.0</version>
    </Totem_Custom>
  </modules>
</config>

config.xml

<?xml version="1.0"?>
<config>
  <modules>
    <Totem_ProductAlert>
      <version>0.1.0</version>
    </Totem_ProductAlert>
  </modules>
  <frontend>
    <routers>
      <productalert>
        <use>standard</use>
          <args>
            <module>Totem_ProductAlert</module>
            <frontName>productalert</frontName>
          </args>
      </productalert>
    </routers>
  </frontend>
  <global>
        <rewrite>        
            <totem_productalert_productalert_addcontroller>
                <from><![CDATA[#^/productalert/add/#]]></from> <!-- Mage_ProductAlert_AddController  -->
                <to>/productalert/productalert_add/</to> <!-- Totem_ProductAlert_ProductAlert_AddController  -->
            </totem_productalert_productalert_addcontroller>
        </rewrite>
    <helpers>
      <productalert>
        <class>Totem_ProductAlert_Helper</class>
      </productalert>
    </helpers>
  </global>
  <admin>
    <routers>
      <productalert>
        <use>admin</use>
        <args>
          <module>Totem_ProductAlert</module>
          <frontName>admin_productalert</frontName>
        </args>
      </productalert>
    </routers>
  </admin>
</config> 

控制器

    <?php
    require_once "Mage/ProductAlert/controllers/AddController.php";  
    class Totem_ProductAlert_ProductAlert_AddController extends Mage_ProductAlert_AddController{
     public function stockAction(){
        Mage::log('test', null, 'Test.log');
     }
   }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多