magento - 批量操作或页面切换后管理网格列发生变化 - Magento 1.9

标签 magento layout grid coupon adminhtml

问题: 我的优惠券网格新列在 AJAX 分页或删除调用后消失。

我的目标: 我想通过添加一些列来扩展购物车规则编辑页面中的优惠券网格。

如何: 如果您创建购物车规则并将“自动生成优惠券”复选框设置为 true 并保存,之后您将能够转到“管理优惠券”选项卡并从那里为此规则生成优惠券。

我的 magento 商店使用的优惠券只能使用一次,因此我需要保存何时使用特定优惠券的记录。由于 magento 优惠券没有该属性,我使用安装脚本在 salesrule_coupon 表中添加了一列 date_used:

<?php
$installer = $this;

$installer->startSetup();

$installer->run("
  ALTER TABLE {$this->getTable('salesrule_coupon')} ADD date_used DATE NULL after created_at;
");

$installer->endSetup();

date_used 已创建,我可以在数据库中看到它。接下来,为了向优惠券网格添加新列,我执行以下操作:

  1. 我在 code/core/Mage/Adminhtml/Block/Promo/Quote/Edit/Tab/Coupons/Grid.php 处扩展了 Grid block 类,并创建了自己的 code/local/Company/Coupons/Block/Adminhtml/Promo/Quote/Edit/Tab/Coupons/Grid.php

这是代码:

<?php

class Company_Coupons_Block_Adminhtml_Promo_Quote_Edit_Tab_Coupons_Grid extends Mage_Adminhtml_Block_Promo_Quote_Edit_Tab_Coupons_Grid {
    protected function _prepareColumns() {
        parent::_prepareColumns();

        // adding a column with date_used index
        $this->addColumn('date_used', array(
            'header' => Mage::helper('salesrule')->__('Date Used'),
            'index'  => 'date_used',
            'width'  => '50',
            'type'   => 'date',
        ));
        return $this;
    }
}
  • 创建布局文件 coupons.xml 并将其放置在设计 design/adminhtml/company/default/layout/coupons.xml 中。在此布局中,我将自己的优惠券网格 block 添加为 company_coupons/adminhtml_promo_quote_edit_tab_coupons_grid 并删除 magento 的 promo_quote_edit_tab_coupons_grid。如您所见,一切都发生在 adminhtml_promo_quote_edit block 内。
  • 布局文件:

    <!-- adding own grid block and removing magento core grid from this block-->
    <layout>
        <adminhtml_promo_quote_edit>
            <reference name="promo_quote_edit_tab_coupons">
                <block type="company_coupons/adminhtml_promo_quote_edit_tab_coupons_grid" name="coupongrid" after="promo_quote_edit_tab_coupons_grid"/>
                <remove name="promo_quote_edit_tab_coupons_grid"/>
            </reference>
        </adminhtml_promo_quote_edit>
    </layout>
    
  • 最后,我在 etc/config.xml 文件中注册这些更改。
  • 配置文件:

    <?xml version="1.0"?>
    <config>
        <modules>
            <Company_Coupons>
                <version>0.1.2</version>
            </Company_Coupons>
        </modules>
        <global>
            <helpers>
                <company_coupons>
                    <class>Company_Coupons_Helper</class>
                </company_coupons>
            </helpers>
            <blocks>
                <company_coupons>
                    <class>Company_Coupons_Block</class>
                </company_coupons>
            </blocks>
            <models>
                <company_coupons>
                    <class>Company_Coupons_Model</class>
                </company_coupons>
            </models>
            <resources>
                <coupons_setup>
                    <setup>
                        <module>Company_Coupons</module>
                    </setup>
                    <connection>
                        <use>core_setup</use>
                    </connection>
                </coupons_setup>
                <coupons_write>
                    <connection>
                        <use>core_write</use>
                    </connection>
                </coupons_write>
                <coupons_read>
                    <connection>
                        <use>core_read</use>
                    </connection>
                </coupons_read>
            </resources>
            <events>
                <sales_order_place_after>
                    <observers>
                        <coupons>
                            <class>company_coupons/observer</class>
                            <method>saveCouponUsageInfo</method>
                        </coupons>
                    </observers>
                </sales_order_place_after>
            </events>
        </global>
        <adminhtml>
            <layout>
                <updates>
                    <coupons>
                        <file>coupons.xml</file>
                    </coupons>
                </updates>
            </layout>
        </adminhtml>
    </config> 
    
  • 我还在 Model/Observer.php 中添加了 saveCouponUsageInfo(Varien_Event_Observer $observer) 方法,但我不会包含该方法,因为它工作得很好。

  • 我的解决方案有效,我可以清楚地看到网格中的新列: Coupon grid in Rule Edit page, Manage Coupons tab

    但是!如果我执行ajax操作,例如请求网格的第二页或批量删除,我的列就会消失,并且网格包含其旧的列集。当然,如果我重新加载整个页面,date_used 列将返回网格。请参阅下文(图像已被裁剪,第 2 页上有 20 张优惠券):

    enter image description here


    我在 PhpStorm 中使用了调试器,注意到批量删除后,优惠券网格 html 的请求是:

    /index.php/admin/promo_quote/couponsGrid/id/64/key/1eccc1c40033fa8bf64007738a22dc1a?ajax=true&isAjax=true
    

    用于分页的相同请求,但将页码添加到 URL 中:

    /index.php/admin/promo_quote/couponsGrid/id/64/key/1eccc1c40033fa8bf64007738a22dc1a/page/2/?ajax=true&isAjax=true
    

    正如您可能从 URL 中猜到的那样,在这些调用期间,会触发 Mage_Adminhtml_Promo_QuoteController 中的 couponsGridAction() 方法。问题是我的 _prepareColumns() 实现从未被调用,正如调试器所显示的那样。因此,不再包含 date_used 列。

    以前有人遇到过这个问题吗?我花了一整天的时间研究这个小错误,并且非常感谢任何提示或指导。谢谢。

    最佳答案

    如果您查看执行的 Controller 操作,即 Mage_Adminhtml_Promo_QuoteController::couponsGridAction(),您会发现它执行了通常的 $this->loadLayout()->renderLayout() ;,这意味着有为此 AJAX 操作定义的布局。
    打开app/design/adminhtml/default/default/layout/promo.xml,您将在底部看到为此特定操作定义的布局:

        <adminhtml_promo_quote_couponsgrid>
            <block type="core/text_list" name="root" output="toHtml">
                <block type="adminhtml/promo_quote_edit_tab_coupons_grid" name="promo_quote_edit_tab_coupons_grid" />
            </block>
        </adminhtml_promo_quote_couponsgrid>
    

    因此,您需要在布局 coupons.xml 文件中定义此操作的句柄,如下所示:

        <adminhtml_promo_quote_couponsgrid>
            <block type="core/text_list" name="root" output="toHtml">
                <block type="company_coupons/adminhtml_promo_quote_edit_tab_coupons_grid" name="promo_quote_edit_tab_coupons_grid" />
            </block>
        </adminhtml_promo_quote_couponsgrid>
    

    如您所见,我只是在 block 的类型声明中将 adminhtml 更改为 company_coupons ,并更新了模块类的路径,并且它实际上有效(正如您的问题有很好的文档记录,我实际上可以在本地重现它,并且该代码实际上已经过测试),就这么简单:)

    关于magento - 批量操作或页面切换后管理网格列发生变化 - Magento 1.9,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36127647/

    相关文章:

    html - 如何在图片右侧放置文字?

    user-interface - jQuery Masonry 和 UI 可排序

    html - 正确排列 float 的 HTML 元素

    magento - Magento 中 < payment_action> 标签的用途是什么?

    magento - 一个可以在 Magento Community Edition 上托管多个商店吗?

    Magento 负载平衡 - 附加许可证

    css - 为什么 li 中的 float 项会在其他缩放级别用 chrome 包裹?

    wpf - 如何将列高限制为另一个?

    javascript - 从网格按钮访问 TitleBar 关闭事件

    database - Magento 如何快速填充搜索词