【问题标题】:Creating Hello world event dispatcher(observer) in Magento?在 Magento 中创建 Hello world 事件调度程序(观察者)?
【发布时间】:2011-04-20 06:13:27
【问题描述】:

我正在尝试在 Magento 中创建一个事件调度程序(应在将产品添加到购物车后调用它)。

到目前为止我做了什么:

我在 Google 上搜索了这个并找到了 this 链接。我按照此链接中指定的说明进行操作。我配置了 config.xml 文件并在 mymodule/model 文件夹下创建了一个 Observer.php 文件。但是,我看不到任何结果。

(我在示例中使用的 config.xml 和 Observer.php 文件的代码可以在http://goo.gl/O7dBy 下找到,我的自定义模块名称是 Crossdata 并且包名称是 MyModule - 我做错了吗?)

简单的 helloworld 事件调度程序示例的任何其他链接都会有所帮助。

谢谢, 巴兰

【问题讨论】:

  • 您的代码未在 SO 上显示的原因可能是您在整个代码中使用了不寻常的空格(NO-BREAK SPACEs,0xC2 0xa0)。尝试减少到​​正常的空格和制表符,它应该会显示出来。
  • 中断和空格会影响代码吗?
  • 对于语法着色,我可以想象它会。功能性?我不这么认为,但从未检查过,因为我从不使用空格和制表符以外的其他空格来格式化。

标签: magento


【解决方案1】:

查看从http://goo.gl/O7dBy 下载的代码,您定义:

<events>
    <add_to_cart_after>
        <observers>
            <add_to_cart_after>
                <class>dispatcher/observer</class>
                <method>hookToAddToCartAfter</method>
            </add_to_cart_after>
        </observers>
    </add_to_cart_after>
</events>

并将dispatcher的模型别名定义为:

<models>
    <dispatcher>
        <class>MyPackage_Crossdata_Dispatcher_Model</class>
    </dispatcher>
</models>

生成的类名将是MyPackage_Crossdata_Model_Dispatcher_Model_Observer,但您的观察者类名为MyPackage_Crossdata_Dispatcher_Model_Observer,缺少CrossdataDispatcher 之间的Model

我建议放弃上面的整个 dispatcher 模型定义,只使用您已经在 config.xml 中定义的另一个模型别名 crossdata

<crossdata>
    <class>MyPackage_Crossdata_Model</class>
    <resourceModel>crossdata_mysql4</resourceModel>
</crossdata>   

然后将事件定义改为:

<add_to_cart_after>
    <class>crossdata/observer</class>
    <method>hookToAddToCartAfter</method>
</add_to_cart_after>

创建一个文件/app/code/local/MyPackage/Crossdata/Model/Observer.php 并在其中定义您的观察者类:

class MyPackage_Crossdata_Model_Observer
{
    public function hookToAddToCartAfter($observer)
    {
        // your observer code
    }
}

【讨论】:

    【解决方案2】:

    您为 Observer.php 添加了一个文件夹,还是一个文件?您可以发布您为此编写的代码,以便我们更好地帮助您调试吗?该教程非常简单明了。

    【讨论】:

    • 我的自定义模块“Crossdata”放在包“MyPackage”下。所以我复制了 MyPackage/Crossdata/Model/Observer.php 下的 Observer.php 文件。是这样吗?有关更多信息,我已在fileflyer.com/view/gzhf5Bo 下上传了两个文件 config.xml 和 Observer.php 文件
    • 我猜是我应该将 Observer.php 文件放在错误的位置,或者我弄乱了 config.xml 文件中教程中指定的事件和模型。仅供参考:所有其他我的 config.xml 文件中的部分是工作代码。
    • 我无法打开您的文件传单内容。使用相关代码编辑帖子,以便将来的人可以从这里的问题/答案中受益。
    • 由于今天之后没有其他人可以访问该链接,请将相关代码放入您的帖子中。
    【解决方案3】:
    1. 在您的config.xml 中,您的模块和模型的简称为crossdata。然而该事件使用别名dispatcher/observer,您尚未定义名称dispatcher。这可能需要crossdata/observer

    2. Incho 示例将其称为模块Inchoo_Dispatcher,模型为Inchoo_Dispatcher_Model_Observer。您的模块是MyPackage_Crossdata,这意味着别名crossdata/observer 将尝试加载MyPackage_Crossdata_Model_Observer。但是你的观察者被错误地称为MyPackage_Crossdata_Dispatcher_Model_Observer

    3. 如果您粘贴的代码未在 Stack Overflow 中显示,请将其缩进四个空格或使用 {} 按钮对其进行格式化。这是显示代码的最佳方式。

    【讨论】:

    • 他实际上确实config.xml的最底部定义了一个名为dispatcher的别名(至少在http://goo.gl/O7dBy的来源中),但不清楚他是否真的想要使用dispatcher 别名,或者crossdata 别名,因为他的类名为MyPackage_Crossdata_Dispatcher_Model_Observer
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-19
    • 1970-01-01
    • 1970-01-01
    • 2012-10-19
    • 1970-01-01
    • 2013-03-23
    相关资源
    最近更新 更多