【问题标题】:Magento Adminhtml override module not workingMagento Adminhtml 覆盖模块不起作用
【发布时间】:2013-02-03 14:31:25
【问题描述】:

源于my last question,我很难尝试进行覆盖。我正在做的正是 MudithaE 的回答 here 所做的。

我想实现我自己的_prepareColumns(),在文件app/code/core/Mage/Adminhtml/Block/Sales/Order/Grid.php 中找到。我设置了模块的目录和文件,如下所示。在研究的过程中,我看到很多开发人员喜欢做Dev_Module_Block_Adminhtml_blah,所以我尝试在代码中随处更改目录结构和类名。不用找了。我的 Cycleworks_SalesGridImproved 模块也出现在系统 -> 配置 -> 高级列表中。

文件: 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 个答案不是答案,而是扩展冲突。我会回答我自己的问题并将其标记为已回答。

【问题讨论】:

  • 你确认你的块被调用了吗?
  • 我相信不是。顺便说一句,也试过return Mage_Adminhtml_Block_Widget_Grid::_prepareColumns();。还添加了 &lt;h1&gt; hello 和 exit();
  • 另外,注册文件应该在app/etc/modules/Cycleworks_SalesGridImproved.xml
  • 谢谢本,好眼力。刚刚回去仔细检查,在文件系统中是正确的,是我在这里发帖的一个错字。

标签: magento overriding adminhtml


【解决方案1】:

我刚试过这个,它有效。我认为通过返回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();
}
}

【讨论】:

  • 嗨,肖恩,感谢您的回答!它仍然不适合我。我试过你的改变。然后我也输入了exit;。我的代码根本没有被执行。
  • 我将您的代码完全复制到了 Magento 的开发副本中,这个 mod 对我有用。尝试从头开始安装 Magento 并准确复制您在问题中的模块。如果它没有执行,请仔细检查您的文件夹名称和案例。一定要清除你的缓存。
  • 挖掘这个 EM_DeleteOrder 会覆盖与我相同的 slaes 订单网格类。他的扩展配置比我的复杂。也许如果我使用与他相同的“技巧”,我可以让我的扩展名最后调用
【解决方案2】:

我在回答自己,因为这是关于扩展冲突及其解决的重要一课。此外,我学到了很多关于我们的特殊安装以及草率的扩展如何破坏一切。

在更新中,EM_DeleteOrder 覆盖了 Adminhtml 块销售订单网格 (absog)。我还使用了扩展MDN_ExtensionConflict,虽然它没有检测到我的确切冲突,但它确实告诉我EM_DeleteOrder 正在使用absog。我搜索了允许在不使用absog 的情况下删除订单的扩展,这一定是最简单的方法。

扩展 Asperience_DeleteAllOrders 设法做到这一点,而不会覆盖整个页面,而是在路由器中捕获一些东西。它的config.xml 对我来说是抽象艺术,所以如果你是高级开发人员,我想你会比我更欣赏他的作品。

最终,我发现 MageWorx_ExtendedOrders 将整个 absog 替换为自己的网格并具有可配置的附加列。包括自定义运费、订单编辑、订单删除和订单存档。我对这个 149 美元的扩展印象深刻。我还将删除被 MageWorx_ExtendedOrders 替换的多个扩展。我正在破解他们的扩展程序代码,以按照我想要的顺序排列列并更新日期格式(我将与他们分享我的更改作为功能建议)。

【讨论】:

    【解决方案3】:

    _prepareColumns()protected,而不是 public

    【讨论】:

    • 谢谢。改回来了。没有不同。那是我尝试过的另一件事。
    【解决方案4】:

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

    【讨论】:

    • 谢谢,这是我尝试过的方法之一,因为它似乎受到开发人员的欢迎。我很确定这是我需要使用 EM_DeleteOrder 扩展解决的路由器问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 2015-04-18
    相关资源
    最近更新 更多