【问题标题】:Magento - Convert a module using <rewrite> to use Events for the Sales > Order GridMagento - 使用 <rewrite> 转换模块以将事件用于销售 > 订单网格
【发布时间】:2012-04-19 07:40:02
【问题描述】:

我制作了一个简单的模块,可以向 销售 > 订单网格 添加额外的字段。它工作得很好,但问题是我们正在使用另一个模块&lt;rewrites&gt; 订单网格将他们的字段添加到网格中。我想尝试将其更改为使用 Events(此外,这是一种更好的方法)...

问题是我一直在尝试,但我就是无法实现。 (也许我还不能掌握事件/观察者的概念......)

这是我当前的模块结构:

app/code/local/Artizara/OrderGridAdditions/
app/code/local/Artizara/OrderGridAdditions/Block/Sales/Order/Grid.php
app/code/local/Artizara/OrderGridAdditions/etc/config.xml
app/code/local/Artizara/OrderGridAdditions/controllers [empty]
app/code/local/Artizara/OrderGridAdditions/Helper [empty]
app/code/local/Artizara/OrderGridAdditions/Model [empty]

在我的 Grid.php 文件中,我已将主 Grid.php 文件内容复制到我的 Grid.php 文件中,并编辑了 _getCollectionClass()_prepareCollection()_prepareColumns() 函数。

我已将_getCollectionClass() 更改为:

//return 'sales/order_grid_collection';
return 'sales/order_collection';

我已将 _prepareCollection() 更改为:

$collection = Mage::getResourceModel($this->_getCollectionClass());

$collection->getSelect()->joinLeft(array('sfog' => 'sales_flat_order_grid'),'main_table.entity_id = sfog.entity_id',array('sfog.shipping_name','sfog.billing_name'));
$collection->getSelect()->joinLeft(array('sfo'=>'sales_flat_order'),'sfo.entity_id=main_table.entity_id',array('sfo.customer_email','sfo.weight','sfo.discount_description','sfo.increment_id','sfo.store_id','sfo.created_at','sfo.status','sfo.base_grand_total','sfo.grand_total','shipping_description','sfo.total_item_count'));
$collection->getSelect()->joinLeft(array('sfoa'=>'sales_flat_order_address'),'main_table.entity_id = sfoa.parent_id AND sfoa.address_type="shipping"',array('sfoa.street','sfoa.city','sfoa.region','sfoa.postcode','sfoa.telephone'));
//$collection->getSelect()->joinLeft(array('sfop' => 'sales_flat_order_payment'),'main_table.entity_id = sfop.entity_id',array('sfop.method'));

$this->setCollection($collection);

return parent::_prepareCollection();

我已经像这样向_prepareColumns() 添加了列(此处仅添加了一个作为示例):

$this->addColumn('total_item_count', array(
            'header' => Mage::helper('sales')->__('Total Items'),
            'index' => 'total_item_count',
            'filter_index' => 'sfo.total_item_count',
            'width' => '50px',
    ));

在我的config.xml 文件中,我有一个简单的&lt;rewrite&gt;

<modules>
    <Artizara_OrderGridAdditions>
        <version>0.1.0</version>
    </Artizara_OrderGridAdditions>
</modules>

<global>
    <blocks>
        <adminhtml>
            <rewrite>
                <sales_order_grid>Artizara_OrderGridAdditions_Block_Sales_Order_Grid</sales_order_grid>
            </rewrite>
        </adminhtml>
        <ordergridadditions>
            <class>Artizara_OrderGridAdditions_Block</class>
        </ordergridadditions>
    </blocks>

</global>

将其更改为事件/观察者

我一直在尝试将其更改为使用 Event 的模块,但我遇到了困难。我一直在尝试在此处遵循其他一些答案(那些不是重写的答案,但他们使用不同的方法将自定义表从数据库添加到网格中)。我希望使用我已有的相同设置

我添加了 /Helper/Data.php 容器,其中包含:

class Artizara_OrderGridAdditions_Helper_Data extends Mage_Core_Helper_Abstract{ }

/etc/config.xml 我尝试了很多东西。这是我最近的尝试:

<modules>
    <Artizara_OrderGridAdditions>
        <version>0.1.0</version>
    </Artizara_OrderGridAdditions>
</modules>

<adminhtml>
    <events>
        <adminhtml_block_html_before>
            <observers>
                <Artizara_OrderGridAdditions_Observer>
                    <class>Artizara_OrderGridAdditions_Model_Observer</class>
                    <method>addAdditionsToGrid</method>
                </Artizara_OrderGridAdditions_Observer>
            </observers>
        </adminhtml_block_html_before>
    </events>
</adminhtml>

<global>


    <models>
        <Artizara_OrderGridAdditions>
            <class>Artizara_OrderGridAdditions_Model</class>
        </Artizara_OrderGridAdditions>
    </models>

    <blocks>
        <Artizara_OrderGridAdditions>
            <class>Artizara_OrderGridAdditions_Block</class>
        </Artizara_OrderGridAdditions>
    </blocks>

    <helper>
        <Artizara_OrderGridAdditions>
            <class>Artizara_OrderGridAdditions_Helper</class>
        </Artizara_OrderGridAdditions>
    </helper>


</global>

然后在/Model/Observer.php 我有:

class Artizara_OrderGridAdditions_Model_Observer {

    public function addAdditionsToGrid(Varien_Event_Observer $observer) {
            // code here
        }
}

addAdditionsToGrid() 内部,我尝试了许多 不同的方法,包括复制整个Grid.php 文件,但似乎没有任何效果(错误):(

请帮助指导我使用 Events 重新制作这个简单的模块!

【问题讨论】:

    标签: events magento magento-1.5


    【解决方案1】:

    没有(好的)方法可以使用观察者将列添加到销售订单网格,因为没有事件调用。亲自查看Mage::dispatchEvent 内的Mage_Adminhtml_Block_Sales_Order_Grid 和所有超类。

    我认为最好的做法是像这样扩展网格类:

    class Artizara_OrderGridAdditions_Block_Sales_Grid extends Mage_Adminhtml_Block_Sales_Order_Grid {
        protected function _prepareColumns() {
            $this->addColumn(/* your definition here */);
        }
    }
    

    如果你真的需要观察者这样做,你可以观看adminhtml_block_html_before事件并挖掘出路,但是很多块也会调用这个事件。

    【讨论】:

    • 所以你是说唯一的方法(或“最好的方法”)就是像我已经做过的那样扩展网格类?与其他扩展的冲突怎么办(因此我为什么要尝试这个......)?我想我需要“寻找出路”的帮助,因为我似乎无法完成这项工作......
    • 您可以简单地将Mage_Adminhtml_Block_Sales_Order_Grid 复制到app/code/local 并在您需要的地方添加Mage::dispatchEvent 调用,调用您自己的观察者。但是,这样你以后升级 Magento 可能会遇到麻烦。
    • 感谢您一直以来的帮助。我知道您可以使用 (core_block_abstract_prepare_layout_before) 作为向下拉列表(在销售 > 订单网格区域)添加批量操作选项的事件。我已经尝试过使用它,但我似乎仍然无法让它工作,我认为这是因为我在某处丢失了一些东西——比如文件/代码——而不是 Event 本身。我正在查看事件/观察者挂钩备忘单 (nicksays.co.uk/magento_events_cheat_sheet)
    • 正如我首先回答的那样,Magento Admin 没有特定的观察者。我在这里测试了一些东西,并在观察adminhtml_block_html_before 时向管理销售订单网格添加了一个列:if ($observer-&gt;getBlock() instanceof Mage_Adminhtml_Block_Sales_Order_Grid) { $observer-&gt;getBlock()-&gt;addColumn(/* column definition */); }。这不是一个好方法,但可以使事情变得更容易。我会继续寻找更好的方法来做到这一点。
    • 我认为这不是使用core_block_abstract_prepare_layout_before 的好方法,因为它也是从前端调用的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多