在覆盖现有模块路由器时如何创建Magento Helper

时间:2014-04-29 16:37:56

标签: magento helper

我已覆盖'customer'前缀,以使我的自定义模块页面显示为/ customer / my-page-action /。当我这样做时,无法找到我的助手课程:

Warning: include(Mage/FranchiseSelect/Helper/Data.php): failed to open stream: No such file or directory

这是我的扩展配置:

<?xml version="1.0" encoding="utf-8" ?>
<config>
  <modules>
    <Rhino_FranchiseSelect>
      <active>true</active>
      <codePool>local</codePool>
    </Rhino_FranchiseSelect>
  </modules>
</config>

这是我的模块配置:

<?xml version="1.0" encoding="utf-8" ?>
<config>
  <modules>
    <Rhino_FranchiseSelect>
      <version>0.1.0</version>
    </Rhino_FranchiseSelect>
  </modules>
  <frontend>
    <routers>
      <customer>
        <args>
          <modules>
            <franchise before="Mage_Customer">Rhino_FranchiseSelect</franchise>
          </modules>
        </args>
      </customer>
    </routers>
    <events>
      <customer_session_init>
        <observers>
          <sessioninit_handler>
            <type>singleton</type>
            <class>Rhino_FranchiseSelect_Model_Observer</class>
            <method>redirectToFranchise</method>
          </sessioninit_handler>
        </observers>
      </customer_session_init>
      <controller_action_predispatch_customer_account_create>
        <observers>
              <handler>
                    <type>singleton</type>
                    <class>Rhino_FranchiseSelect_Model_Observer</class>
                    <method>checkForRegion</method>
              </handler>
        </observers>
      </controller_action_predispatch_customer_account_create>
      </events>
  </frontend>
  <global>
    <resources>
      <helpers>
          <what_should_this_tag_name_be>
              <class>Rhino_FranchiseSelect_Helper</class>
          </what_should_this_tag_name_be>
        </helpers>
    </resources>
  </global>
</config>

我的助手位于: /app/code/local/Rhino/FranchiseSelect/Helper/Data.php

我试图像这样实例化它:

$helper = Mage::helper("what-should-this-path-be");

我不确定配置帮助程序别名标记名称或帮助程序路径名称应该是什么,以使其工作。你能帮我确定一下这个结构吗?

1 个答案:

答案 0 :(得分:0)

我不是100%肯定这是触发此错误的额外路由器配置 - 在我的脑海中,控制器调度进程中没有任何实例化帮助程序。

Magento自动实例化帮助程序的最常见原因是配置文件中的modules="helperalias"属性。这间接调用了助手的__本地化方法。

在不知道为什么你的Magento系统想要实例化帮助器的情况下,不可能知道别名应该是什么。如果我是你,我会暂时将一些调试代码添加到以下文件

#File: app/Mage.php
public static function helper($name)
{ 
    //poor man's logging
    file_put_contents('/tmp/test.log',"$name\n",FILE_APPEND);

    // PHP's equivalent of printf debugging
    var_dump($name);

    $registryKey = '_helper/' . $name;
    if (!self::registry($registryKey)) {
        $helperClass = self::getConfig()->getHelperClassName($name);
        self::register($registryKey, new $helperClass);
    }
    return self::registry($registryKey);
}

这将告诉你帮助器的别名是什么,这就是你应该为你正在寻找的配置节点命名的。

更新:根据以下评论,您需要

<global>
    <helpers>
        <franchiseselect>
            <class>Rhino_FranchiseSelect_Helper</class>
        </franchiseselect>
    </helpers>
</global>

当你说

Mage::helper('franchiseselect');

你真正说的是

Mage::helper('franchiseselect/data');

Magento自动替换data字符串。 franchiseselect字符串是别名组名称,data字符串是别名模型名称。将节点<franchiseselect> / <what_should_this_tag_name_be/>始终添加到XML时,您将定义别名组名称。

此外,您的XML在<resources/>节点下有一个额外的节点<helpers/> - 您不需要它。

至于为什么Magento在Mage下寻找一个类 - 如果Magento找不到已配置的别名,它会自动猜测该请求是针对Mage命名空间下的一个类。这个猜测是原始核心团队的一些偏执编程,以确保他们自己的模块中的任何错误配置都不会触发错误。当Magento找不到您的framework帮助程序时,它尝试实例化Mage_Framework...类。

相关问题