草庐IT

php - magento sales_order_place_after 观察者

coder 2023-06-15 原文

我正在尝试编写一个观察器,它会在下订单时导出订单数据。我以前没有写过任何模块。基于本文的实现:http://www.magentocommerce.com/wiki/5_-_modules_and_development/0_-_module_development_in_magento/customizing_magento_using_event-observer_method

到目前为止,我只是试图触发一些伪代码来写入文件。我的日志中没有显示任何内容,文件也没有被修改。 apache 用户具有该目录的权限。我在 Magento 设置中禁用了配置缓存。我对一些命名约定有点困惑;我只是试着按照这个例子。任何人都知道我要去哪里错了吗?

在 magento/app/etc/modules/Feed.xml 中:

<?xml version="1.0"?>
<config>
    <modules>
        <Feed_Sales>
            <codePool>local</codePool>
            <active>true</active>
        </Feed_Sales>
    </modules>
</config>

在 magento/app/code/local/Feed/Sales/etc/config.xml 中:

<?xml version="1.0"?>
<config>
    <global>
        <models>
            <feedsales>
                <class>Feed_Sales_Model</class>
            </feedsales>
        </models>
        <events>
            <sales_order_place_after>
                <observers>
                    <feed_sales_order_observer>
                        <type>singleton</type>
                        <class>sales/order_observer</class><!-- I've also tried Feed_Sales_Model_Order_Observer here -->
                        <method>export_new_order</method>
                    </feed_sales_order_observer>
                </observers>
            </sales_order_place_after>
        </events>
    </global>
</config>

在 magento/app/code/local/Feed/Sales/Model/Order/Observer.php 中:

<?php
class Feed_Sales_Model_Order_Observer
{
    public function __contruct()
    {

    }

    /**
     * Exports new orders to an xml file
     * @param Varien_Event_Observer $observer
     * @return Feed_Sales_Model_Order_Observer
     */
    public function export_new_order($observer)
    {
        Mage::log("reached export_new_order");
        try
        {
            $dumpFile = fopen('/home/jorelli/new_orders/testdump', 'w+');
            fwrite($dumpFile, 'this is a test!');
        }
        catch (Exception $e)
        {
            Mage::log("order export failed.\n");
        }
        return $this;
    }
}
?>  

Debian Lenny 上的 Magento 1.4 和 Apache2,如果出于任何原因需要的话。

最佳答案

阅读my articles ,它们将帮助您从命名约定的角度理解发生了什么,并让您了解 Magento 的一些约定/假设。

看看上面的示例,您有一些不太正确的地方。

首先,你的etc文件夹中的文件命名错误

magento/app/etc/modules/Feed.xml

这个文件需要命名为Packagename_Modulename,所以你可能想要

magento/app/etc/modules/Feed_Sales.xml

查看系统 -> 配置 -> 高级,看看你的模块是否出现。如果是,则您已正确命名此文件。否则,您创建的模块不会被加载到系统中,您的代码也永远没有机会运行。

接下来,您错误地指定了类。你说

sales/order_observer

但 URI 的第一部分(销售)不正确。您将模型部分定义为

    <models>
        <feedsales> <!-- this is your model part -->
            <class>Feed_Sales_Model</class>
        </feedsales>
    </models>

这意味着你想要

feedsales/order_observer

检查 Class/URI tab of Commerce Bug并尝试输入一些 URI(如 sales/order)以更好地了解这里发生的事情。

另一个快速提示,当您尝试设置处理程序时,请为每次页面加载时触发的事件执行此操作。然后,一旦调用了您的方法,您就可以将其切换到您想要的特定事件,而不必经历整个购买过程。

最后,我意识到您正在复制示例,请考虑将您的模块放在一个名为 Sales 以外的文件夹中。我发现模仿 Magento 核心文件夹的名称只会增加一层额外的困惑,这不是您在学习该系统时所需要的。

关于php - magento sales_order_place_after 观察者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3154071/

有关php - magento sales_order_place_after 观察者的更多相关文章

  1. ruby-on-rails - rails : check if the model was really saved in after_save - 2

    ActiveRecord用于在每次调用保存方法时调用after_save回调,即使模型没有更改并且没有生成插入/更新查询也是如此。这实际上是默认行为。在大多数情况下这没问题。但是一些after_save回调对模型是否实际保存的事情很敏感。有没有办法确定模型是否实际保存在after_save中?我正在运行以下测试代码:classStage 最佳答案 ActiveRecordusetocallafter_savecallbackeachtimesavemethodiscalledevenifthemodelwasnotchangedan

  2. ruby-on-rails - rails group by 和 order by column - 2

    在我的Controller中,我得到了按类别分组的所有Extras:defindex@categories=Extra.all.group_by(&:category)end结果类似于哈希数组:{#=>[#,#=>[#,#]}我想按类别“排序”列而不是id排序,它应该如下所示:{#=>[#,#=>[#,#]}当我尝试时:defindex@categories=Extra.all.group_by(&:category).sort_by{|s|s[:sort]}end我得到“没有将符号隐式转换为整数”。那是因为我在“sort_by”中使用了一个符号吗? 最佳答

  3. ruby-on-rails - rspec 测试 has_many :through and after_save - 2

    我有一个(我认为)相对简单的has_many:through与连接表的关系:classUser:user_following_thing_relationshipsendclassThing:user_following_thing_relationships,:source=>:userendclassUserFollowingThingRelationship还有这些rspec测试(我知道这些不一定是好的测试,这些只是为了说明正在发生的事情):describeThingdobefore(:each)do@user=User.create!(:name=>"Fred")@thing=

  4. ruby-on-rails - 在 Ruby 或 Rails 中,hash.merge({ :order => 'asc' }) can return a new hash with a new key. 什么可以返回带有已删除键的新散列? - 2

    在Ruby(或Rails)中,我们可以做到new_params=params.merge({:order=>'asc'})现在new_params是一个带有添加键:order的散列。但是是否有一行可以返回带有已删除key的散列?线路new_params=params.delete(:order)不会工作,因为delete方法返回值,仅此而已。我们必须分3步完成吗?tmp_params=paramstmp_params.delete(:order)returntmp_params有没有更好的方法?因为我想做一个new_params=(params[:order].blank?||para

  5. ruby 单元测试 : run some code after each failed test - 2

    在Test::Unit中的ruby​​单元测试断言失败后,在执行teardown之前,是否有一些简洁优雅的方法来立即执行我的代码?我正在做一些自动化的GUI测试,并希望在出现问题后立即截图。 最佳答案 如果您使用的是1.9,请不要使用Test::Unit::TestCase作为您的基类。对其进行子类化并覆盖#run_test以进行救援,截取屏幕截图并重新提出:classMyAbstractTestCase或者,我认为这实际上是最简洁的方法,您可以使用before_teardownHook:classMyTestCase这不适用于1.

  6. ruby-on-rails - Order Hash 并删除第一个键值对 - 2

    我有一个以时间戳为键的哈希。hash={"2016-05-31T22:30:58+02:00"=>{"path"=>"/","method"=>"GET"},"2016-05-31T22:31:23+02:00"=>{"path"=>"/tour","method"=>"GET"},"2016-05-31T22:31:05+02:00"=>{"path"=>"/contact_us","method"=>"GET"}}我订购了这个系列并得到了第一双这样的:hash.sort_by{|k,_|k}.first.first但是我该如何删除它呢?删除方法requiresyou知道key的准确

  7. ruby-on-rails - 这个 C 和 PHP 程序员如何学习 Ruby 和 Rails? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它

  8. ruby - 简单的 ruby 守卫观察者 - 2

    有没有办法制作一个简单的守卫watch?我想在特定目录中的文件更改时运行rake任务,并且完成所有这些步骤对于这个一次性任务来说太多了。https://github.com/guard/guard/wiki/Create-a-guard我尝试将它添加到Guardfile中,但它不起作用。guard:docdowatch(%r{^documentation}){"rakedoc:build"}endwatch("/documentation"){"rakedoc:build"}那么当文件更新为guard时,您是否知道一种运行rake任务的简单方法?? 最佳答案

  9. ruby-on-rails - after_save 回调将 updated_by 列设置为 current_user - 2

    我想使用after_save回调将updated_by列设置为current_user。但是current_user在模型中不可用。我应该怎么做? 最佳答案 需要在controller中处理。首先在模型上执行保存,然后如果成功则更新记录字段。例子classMyController另一种选择(我更喜欢这个)是在您的模型中创建一个自定义方法来包装逻辑。例如classRecord 关于ruby-on-rails-after_save回调将updated_by列设置为current_user,我

  10. ruby-on-rails - RSpec 中 spec 目录的 Before 和 After 钩子(Hook) - 2

    我们的RSpec测试套件中有相当多的测试。目录结构看起来像-spec/truncation/example1_spec.rbexample2_spec.rb...transaction/example1_spec.rbexample2_spec.rb...我想在transaction/文件夹中的所有规范文件运行之前恢复测试数据库转储,并在所有测试完成后将其清空。有办法吗?有before(:suite)和after(:suite)Hook,但它们适用于单个规范文件。有没有办法在RSpec中为目录提供前后Hook? 最佳答案 你在使用R

随机推荐