Magento Adminhtml覆盖模块无法正常工作

时间:2013-02-19 01:51:04

标签: magento override adminhtml

来自my last question,我难以尝试覆盖。我正在做的是MudithaE的回答here

我想在文件_prepareColumns()中找到我自己的app/code/core/Mage/Adminhtml/Block/Sales/Order/Grid.php。我设置了我的模块的目录和文件,如下所示。在研究时,我看到很多开发人员都喜欢Dev_Module_Block_Adminhtml_blah,所以我尝试在代码中的每个地方更改目录结构和类名。没变。我的Cycleworks_SalesGridImproved模块出现在System - >中。配置 - >高级列表也是。

文件: app/code/local/Cycleworks/SalesGridImproved/Adminhtml/Block/Sales/Order/Grid.php

<?php
class Cycleworks_SalesGridImproved_Adminhtml_Block_Sales_Order_Grid  extends Mage_Adminhtml_Block_Sales_Order_Grid {
    protected function _prepareColumns() // tried public too
    {
                    parent::_prepareColumns();
        ...
        ...
        $this->addColumn('created_at', array(
            'header' => Mage::helper('sales')->__('Purchased On'),
            'index' => 'created_at',
             'type' => 'datetime',
             'format' => 'MMM d, h:mm a',
            'width' => '165px', 
        ));
        ...
        ...
        return $this; 
    }
}

app/code/local/Cycleworks/SalesGridImproved/etc/config.xml

<?xml version="1.0"?>
<config>
    <modules>
        <!-- also tried: Cycleworks_SalesGridImproved -->
        <Cycleworks_Adminhtml>
            <version>0.0.01</version>
        </Cycleworks_Adminhtml>
    </modules>

    <global>
        <blocks>
            <adminhtml>
                <salesgridimproved>
                      <class>Cycleworks_SalesGridImproved_Adminhtml_Block_Sales_Order_Grid</class>
                </salesgridimproved>
                <rewrite>
                    <sales_order_grid>Cycleworks_SalesGridImproved_Adminhtml_Block_Sales_Order_Grid</sales_order_grid>
                </rewrite>
            </adminhtml>
        </blocks>        
    </global>

</config>

/app/etc/modules/Cycleworks_SalesGridImproved.xml

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

请告诉我看到我错过了什么......谢谢!


更新

刚刚发现扩展名EM_DeleteOrder也覆盖了我所在的同一销售订单网格类。他的扩展配置比我的更复杂,因为他的设置是在Mage核心之前调用的。 config.xml肯定很忙!

<?xml version="1.0"?>
<config>
    <modules>
        <EM_DeleteOrder>
            <version>1.0.0</version>
        </EM_DeleteOrder>
    </modules>
    <global>
        <rewrite>
        <em_emadmin_adminhtml_sales_order>
            <from><![CDATA[#/admin/sales_order/#]]></from>
            <to>/emadmin/adminhtml_sales_order/</to>
        </em_emadmin_adminhtml_sales_order>
        </rewrite>

        <blocks>
            <adminhtml>
                <rewrite>
                    <sales_order_grid>EM_DeleteOrder_Block_Adminhtml_Sales_Order_Grid</sales_order_grid>
                </rewrite>
            </adminhtml>
        </blocks>       
    </global>
    <admin>
        <routers>
            <em_deleteorder>
                <use>admin</use>
                <args>
                    <module>EM_DeleteOrder</module>
                    <frontName>emadmin</frontName>
                </args>
            </em_deleteorder>           
            <adminhtml>
                <args>
                  <modules>
                    <EM_DeleteOrder_Adminhtml before="Mage_Adminhtml">EM_DeleteOrder_Adminhtml</EM_DeleteOrder_Adminhtml>
                  </modules>
                </args>
            </adminhtml>
        </routers>
    </admin>
</config>

您是否有任何想法如何使用类似的语法并让我的模块工作而不必破解他的代码?与after="Mage_Adminhtml"一样?


最终更新 可悲的是,下面的3个答案不是答案,而是延伸冲突。我会回答我自己的问题并将其标记为已回答。

4 个答案:

答案 0 :(得分:3)

我刚试过这个并且它有效。我想通过回复parent::_prepareColumns()它忽略了你的改变。在函数顶部添加它然后返回$this对我来说很好。

<?php
class Cycleworks_SalesGridImproved_Adminhtml_Block_Sales_Order_Grid  extends Mage_Adminhtml_Block_Sales_Order_Grid {
protected function _prepareColumns() // tried public too
{
//       ...
  //     ...

parent::_prepareColumns();



    $this->addColumn('created_at', array(
        'header' => Mage::helper('sales')->__('Purchased On'),
        'index' => 'created_at',
         'type' => 'datetime',
         'format' => 'MMM d, h:mm a',
        'width' => '165px',
    ));
 //   ...
   // ...
    return $this; #parent::_prepareColumns();
}
}

答案 1 :(得分:2)

我正在回答自己,因为这是扩展冲突及其解决方案的一个重要教训。此外,我学到了很多关于我们特定安装的知识,以及粗略的扩展如何破坏一切。

在更新中, EM_DeleteOrder 覆盖了Adminhtml Block Sales Order Grid(absog)。我还使用了扩展名 MDN_ExtensionConflict ,虽然它没有检测到我的确切冲突,但它确实向我显示EM_DeleteOrder正在使用absog。我搜索了可以在不使用absog的情况下删除订单的扩展程序,这必须是简单的方法。

扩展程序 Asperience_DeleteAllOrders 设法在不覆盖整个页面的情况下执行此操作,而是在路由器中捕获内容。它config.xml对我来说是抽象艺术,所以如果你是一名高级开发人员,我认为你比他更欣赏他的工作。

最终,我找到了 MageWorx_ExtendedOrders ,它用自己的网格替换了整个absog,并且可以配置其他列。包括自定义运费,订单编辑,订单删除和订单存档。 149美元的延期令我印象深刻。我还要删除用 MageWorx_ExtendedOrders 替换的多个扩展程序。我正在攻击他们的扩展程序代码,将列按照我们想要的顺序排列并更新日期格式(我将与他们分享我的更改作为功能建议)。

答案 2 :(得分:1)

_prepareColumns()protected,而不是public

答案 3 :(得分:1)

尝试将adminhtml文件夹放在块文件夹中,即app/code/local/Cycleworks/SalesGridImproved/Block/Adminhtml/Sales/Order/Grid