问题: 我的优惠券网格新列在 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 已创建,我可以在数据库中看到它。接下来,为了向优惠券网格添加新列,我执行以下操作:
- 我在
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)
方法,但我不会包含该方法,因为它工作得很好。
但是!如果我执行ajax操作,例如请求网格的第二页或批量删除,我的列就会消失,并且网格包含其旧的列集。当然,如果我重新加载整个页面,date_used
列将返回网格。请参阅下文(图像已被裁剪,第 2 页上有 20 张优惠券):
我在 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/