问题: 在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 已创建,我可以在数据库中看到它。接下来,为了向优惠券网格添加新列,我执行以下操作:
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
以下是代码:
<?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;
}
}
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
块内。布局文件:
<!-- 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>
saveCouponUsageInfo(Varien_Event_Observer $observer)
中添加了Model/Observer.php
方法,但我不会将其包含在内,因为它的工作正常。 但是!如果我执行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
正如您可能已经从网址中猜到的那样,在couponsGridAction()
期间,Mage_Adminhtml_Promo_QuoteController
中的方法会被触发。问题在于调试器显示,我永远不会调用_prepareColumns()
的实现。因此,不再包括date_used
列。
之前有人遇到过这个问题吗?我花了一整天的时间来研究这个小虫子,对于任何暗示或指导都非常感激。感谢。
答案 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
并更新了模块类的路径,它实际上可以正常工作(如你的问题记录很清楚我实际上可以在本地重现它,这个代码实际上已经过测试了),就像那样简单:)