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

时间:2016-03-21 09:49:04

标签: magento layout grid coupon adminhtml

问题: 在AJAX分页或删除调用之后,我的Coupon网格新列将消失。

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

如何: 如果您创建购物车规则并将“自动生成优惠券”复选框设置为真并保存,则您可以在之后转到“管理优惠券”标签,并从此处为此规则生成优惠券。

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

<?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块类并创建我自己的code/local/Company/Coupons/Block/Adminhtml/Promo/Quote/Edit/Tab/Coupons/Grid.php
  2. 以下是代码:

    <?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;
        }
    }
    
    1. 创建一个布局文件coupons.xml并将其放在设计design/adminhtml/company/default/layout/coupons.xml中。在这个布局中,我将自己的coupongrid块添加为company_coupons/adminhtml_promo_quote_edit_tab_coupons_grid并删除magento的promo_quote_edit_tab_coupons_grid。如您所见,所有内容都发生在adminhtml_promo_quote_edit块内。
    2. 布局文件:

      <!-- 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>
      
      1. 最后,我在etc/config.xml文件中注册了这些更改。
      2. 配置文件:

        <?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> 
        
        1. 我还在saveCouponUsageInfo(Varien_Event_Observer $observer)中添加了Model/Observer.php方法,但我不会将其包含在内,因为它的工作正常。
        2. 我的解决方案有效,我可以清楚地看到网格中的新列: 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
          

          正如您可能已经从网址中猜到的那样,在couponsGridAction()期间,Mage_Adminhtml_Promo_QuoteController中的方法会被触发。问题在于调试器显示,我永远不会调用_prepareColumns()的实现。因此,不再包括date_used列。

          之前有人遇到过这个问题吗?我花了一整天的时间来研究这个小虫子,对于任何暗示或指导都非常感激。感谢。

1 个答案:

答案 0 :(得分:2)

如果查看执行的控制器操作,即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>

正如您所看到的,我只是在块的类型声明中使用adminhtml更改了company_coupons并更新了模块类的路径,它实际上可以正常工作(如你的问题记录很清楚我实际上可以在本地重现它,这个代码实际上已经过测试了),就像那样简单:)