【问题标题】:Magento - Add Mass Action to Sales > Orders GridMagento - 将批量操作添加到销售 > 订单网格
【发布时间】:2012-03-29 17:29:33
【问题描述】:

编辑 4/4/12

我还有一个问题:

我解决了我的问题,但它在列表顶部添加了我的选项。如何将其排序到列表底部的我的选项?

请查看我的工作config.xml文件内容的答案...


我在这里寻求深入的帮助,因为我已经在这方面工作了很长一段时间,但似乎一无所获。

背景
我希望为我们的客户制作可打印的 RMA 表格,以便他们更轻松地退货/换货。

我在此扩展程序的帮助下做到了这一点:http://www.magentocommerce.com/magento-connect/admin-order-printing-extension.html
(如果需要,请下载此文件以查看目录结构)

它在订单中添加了一个按钮,然后我进入并编辑了表单/表单布局,使其成为 RMA(或具有 RMA 内容)。

一切都很好,但是,我们必须进入每个订单并按下按钮才能打印。

我们确实需要Mass Action 以使其更高效和有用。

问题
我尝试了不同的方法来让它工作,但我真的需要帮助。最近我尝试使用events 的第二种方法来遵循本教程(http://www.blog.magepsycho.com/adding-new-mass-action-to-admin-grid-in-magento/)但我似乎无法让它工作。

有人可以更深入地解释一下(我尝试过的最后一种方法),以便我可以让它与这个模块一起工作???

我已经在config.xml中添加了这个(根据教程)

<events>
    <core_block_abstract_prepare_layout_before>
        <observers>
            <orderprint_core_block_abstract_prepare_layout_before>
                 <class>orderprint/observer</class>
                 <method>addRmaAction</method>
            </orderprint_core_block_abstract_prepare_layout_before>
        </observers>
    </core_block_abstract_prepare_layout_before>
 </events>

Nastnet/OrderPrint/Model/Observer.php 我已经添加了这个(根据教程)

<?php class Nastnet_OrderPrint_Model_Observer {
public function addRmaAction($observer) {
    $block = $observer->getEvent()->getBlock();
    if(get_class($block) =='Mage_Adminhtml_Block_Widget_Grid_Massaction'
        && $block->getRequest()->getControllerName() == 'sales_order')
    {
        $block->addItem('pdfrma_order', array(
            'label' => 'Print RMA',
            'url' => Mage::app()->getStore()->getUrl('nastnet/controller/action'),
        ));
    }
} }

(抱歉上面的代码乱七八糟 - 我可以让它突出显示的唯一方法)

编辑 1(2012 年 4 月 2 日) 这是我模块的 config.xml 文件。到目前为止,我不得不使用重写/覆盖方法(删除我使用事件的尝试)。如果你看到任何东西,包括它需要的确切结构,请告诉我......

减去&lt;config&gt; 标签:

<modules>
    <Nastnet_OrderPrint>
        <version>0.1.3</version>
    </Nastnet_OrderPrint>
</modules>

<global>
    <blocks>
        <adminhtml>
            <rewrite>
                <sales_order_grid>Nastnet_OrderPrint_Block_Sales_Order_Grid</sales_order_grid> <!-- WORKIING METHOD -->
                <sales_order_view>Nastnet_OrderPrint_Block_Sales_Order_View</sales_order_view>
            </rewrite>
        </adminhtml>
    </blocks>
    <rewrite>
        <Nastnet_OrderPrint_OrderController>
            <from><![CDATA[#/\w+/sales_order/print/#]]></from>
            <to>/orderprint/order/print/</to>
        </Nastnet_OrderPrint_OrderController>
    </rewrite>
    <models>
        <Nastnet_OrderPrint>
            <class>Nastnet_OrderPrint_Model</class>
        </Nastnet_OrderPrint>
    </models>
    <pdf>
        <order>
            <default>Nastnet_OrderPrint/order_pdf_items_order_default</default>
            <grouped>Nastnet_OrderPrint/order_pdf_items_order_grouped</grouped>
        </order>
    </pdf>
</global>
<admin>
    <routers>
        <Nastnet_OrderPrint>
             <use>admin</use>
            <args>
                <module>Nastnet_OrderPrint</module>
                <!-- This is used when "catching" the rewrite above -->
                <frontName>orderprint</frontName>
            </args>
        </Nastnet_OrderPrint>
    </routers>

【问题讨论】:

  • 确认你的模块是否被加载,同时检查你的模块是否有错误。
  • 你的类在 config.xml 中定义好了吗?将其粘贴在这里,以便我们检查是否有任何拼写错误
  • OSdave - 我在上面粘贴了我的 config.xml。到目前为止,我已经删除了对“事件”方法的尝试。我已经尝试了多种方法使用这个 (blog.magepsycho.com/…) 方法 2 和这个 (stackoverflow.com/questions/9034843/…)。没有人像我扩展它时那样在下拉列表中获得新标签(如上所述)......

标签: magento magento-1.5


【解决方案1】:

我已经找到了正确的句柄和一切,以便让它工作(在本文的帮助下:http://mydons.com/simple-example-using-magento-event-observer/

在 config.xml 文件中,我必须在 &lt;config&gt; 句柄之后创建新的 &lt;adminhtml&gt; 句柄。这让我找到了正确的“深度”。这是整个 config.xml 文件减去 &lt;config&gt; 句柄(因为它不会正确粘贴):

<modules>
    <Nastnet_OrderPrint>
        <version>0.1.3</version>
    </Nastnet_OrderPrint>
</modules>
<adminhtml>
    <events>
        <core_block_abstract_prepare_layout_before>
            <observers>
                <Nastnet_OrderPrint_Model_Observer>
                    <type>singleton</type>
                    <class>Nastnet_OrderPrint_Model_Observer</class>
                    <method>addRmaAction</method>
                </Nastnet_OrderPrint_Model_Observer>
            </observers>
        </core_block_abstract_prepare_layout_before>
    </events>
</adminhtml>
<global>
    <blocks>
        <adminhtml>
            <rewrite>
                <sales_order_view>Nastnet_OrderPrint_Block_Sales_Order_View</sales_order_view>
            </rewrite>
        </adminhtml>
    </blocks>
    <rewrite>
        <Nastnet_OrderPrint_OrderController>
            <from><![CDATA[#/\w+/sales_order/print/#]]></from>
            <to>/orderprint/order/print/</to>
        </Nastnet_OrderPrint_OrderController>
    </rewrite>
    <models>
        <Nastnet_OrderPrint>
            <class>Nastnet_OrderPrint_Model</class>
        </Nastnet_OrderPrint>
    </models>
    <pdf>
        <order>
            <default>Nastnet_OrderPrint/order_pdf_items_order_default</default>
            <grouped>Nastnet_OrderPrint/order_pdf_items_order_grouped</grouped>
        </order>
    </pdf>
</global>
<admin>
    <routers>
        <Nastnet_OrderPrint>
             <use>admin</use>
            <args>
                <module>Nastnet_OrderPrint</module>
                <!-- This is used when "catching" the rewrite above -->
                <frontName>orderprint</frontName>
            </args>
        </Nastnet_OrderPrint>
    </routers>
</admin>

这是我需要的部分,这里终于正确了:

<adminhtml>
    <events>
        <core_block_abstract_prepare_layout_before>
            <observers>
                <Nastnet_OrderPrint_Model_Observer>
                    <type>singleton</type>
                    <class>Nastnet_OrderPrint_Model_Observer</class>
                    <method>addRmaAction</method>
                </Nastnet_OrderPrint_Model_Observer>
            </observers>
        </core_block_abstract_prepare_layout_before>
    </events>
</adminhtml>

它在此处指向我的观察者文件(基于正确的事件):app/code/local/Nastnet/OrderPrint/Model/Observer.php。这显然是我的addRmaAction

我还有一个问题:

这将我的选项置于列表顶部。如何将其排序到列表底部的我的选项?

Observer.php的内容

<?php
class Nastnet_OrderPrint_Model_Observer
{
public function addRmaAction($observer)
{   
    $block = $observer->getEvent()->getBlock();
    if(get_class($block) =='Mage_Adminhtml_Block_Widget_Grid_Massaction'
        && $block->getRequest()->getControllerName() == 'sales_order')
    {
        $block->addItem('rmamassprint', array(
            'label' => 'Print Return/Exchange',
            'url' => Mage::app()->getStore()->getUrl('orderprint/order/pdfRma'),
        ));
    }
}
}

【讨论】:

  • 观察者方法是迄今为止最模块化的方法,特别是对于销售订单网格,因为有大约一千个扩展添加到该块。我建议不要在检查中使用 get_class($block) == '...' ,而是使用 $block instanceOf Mage_Adminhtml_Block_... 这样,如果另一个模块重写了该块,只要他们扩展了原始块,它应该仍然可以工作。
【解决方案2】:

首先,您是否确认您的观察者是否被调用?只需添加Mage::log("Observer called"); 并查看 system.log 文件..

【讨论】:

  • 我认为它甚至没有被调用,因为我将它放在 Observer.php 文件中,而 system.log 文件中没有任何显示。我最初认为config.xml 路径有问题,但我不知道 - 这就是我在这里发布的原因。还在用头撞桌子....
  • 按照本教程制作一个简单的观察者:magentocommerce.com/wiki/5_-modules_and_development/0-_module_development_in_magento/customizing_magento_using_event-observer_method。一旦您确定观察者正在工作,您就可以将事件修改为您想要的任何事件,并且您可以对方法执行相同操作,一旦确定正在调用它,就可以在方法中添加您想要的任何内容。
【解决方案3】:

这里是添加批量操作到销售 > 订单网格的工作教程: http://www.blog.magepsycho.com/adding-new-mass-action-to-admin-grid-in-magento/

尝试第二种方法(使用事件观察者方法),这似乎是更能证明升级的方法。
谢谢

【讨论】:

  • MagePsycho,我一直在尝试按照您的教程进行操作(上面链接在原始帖子中)。但是,我无法让它工作。它似乎根本没有抓住这个事件。您是否有任何解决问题的提示,或者您对它可能无法正常工作的原因有任何想法?
  • 确保在 ... 节点内有 块。
  • 是的,&lt;events&gt; 标签在 &lt;config&gt;&lt;global&gt;&lt;blocks&gt;&lt;adminhtml&gt; 标签内
  • 不,它应该在 而不是 的内部。没有深度,你会知道错误的。
  • 好的。现在我有&lt;config&gt;&lt;adminhtml&gt;&lt;events&gt;。还是不行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多