Magento的Module layout update

在Magento中xml是模块配置的利器,有时开发一个Magento的模块时,需要添加模块的layout update。

添加前台的layout XML需要在模块的config.xml添加frontend节点。

<frontend>
    <layout>
        <updates>
	    <name><!-- 模块的名字一般模块命名moduleNameSpace_moduleName,主要这里是moduleName。-->
	        <file>name.xml</file><!-- layout Xml命名自定义-->
	    </name>
	</updates>
    </layout>
</frontend>

添加后台的layout xml需要在config.xml添加adminhtml节点

<adminhtml>
    <layout>
        <updates>
	    <name><!-- 模块的名字一般模块命名moduleNameSpace_moduleName,主要这里是moduleName。-->
	        <file>name.xml</file><!-- layout Xml命名自定义-->
	    </name>
	</updates>
    </layout>
</adminhtml>

需要注意的是name.xml的位置,Magento 查找layout文件的顺序为

/app/design/frontend/default/default/layout/name.xml
/app/design/frontend/base/default/layout/name.xml

推荐放在

/app/design/frontend/default/default/layout/name.xml

即可。

在name.xml文件中可以修改页面的布局。

<?xml version="1.0" encoding="UTF-8"?>
<layout>
    <customer_account_create>
        <reference name="head">
	    <action method="addItem" ifconfig="customer/address/enabled"><type>skin_js</type><name>js/name.js</name><params/></action>
	</reference>
    </customer_account_create>
</layout>

在这个name.xml中向head添加了一段js。神奇的地方在于可以在xml里自定义加载条件,如ifconfig属性。

Magento解析到该模块的layout xml时会判断ifconfig属性的值为true or false。根据ifconfig的值来决定是否执行addItem方法。

换成php语言的逻辑如下:

 
if(customer/address/enabled == true){
//exe addItem method
//add name.js to head
}

注意name.js的路径和name.xml的类似,同样是从查找顺序为:

/skin/frontend/default/default/js/name.js
 
/skin/frontend/base/default/js/name.js

Magento Sales Grid Filter bug

当你使用Sales Order的filter时有时会莫名其妙的出现

就会出现下面Magento经典的报错页面。

在var/report/找到这个报告,显示

SQLSTATE[42S22]: Column not found: 1054 Unknown column ‘ordercomment’ in ‘where clause’

你的错误可能会是下面这样子的:
SQLSTATE[42S22]: Column not found: 1054 Unknown column ‘create_at’ in ‘where clause’

更可能会是这个:
SQLSTATE[42S22]: Column not found: 1054 Unknown column ‘status’ in ‘where clause’

从core复制文件app/code/core/Mage/Adminhtml/Block/Sales/Order/Grid.php到app/code/local/Mage/Adminhtml/Block/Sales/Order/Grid.php.。

找到create_at,这一栏的addColumn函数

$this->addColumn('created_at', array(
            'header' => Mage::helper('sales')->__('Purchased On'),
            'index' => 'created_at',
            'type' => 'datetime',
            'width' => '100px',
 ));

添加filterindex属性,给表字段添加miantable。这样filter就能找到对应的表了,一般这种情况是安装了一些插件,重写salesresource下的ordergrid_collection这个类,导致filter会找不到对应的字段。当然,造成这个bug是因为我安装了Magemaven OrderComment这个插件。

$this->addColumn('created_at', array(
            'header' => Mage::helper('sales')->__('Purchased On'),
            'index' => 'created_at',
            'type' => 'datetime',
            'width' => '100px',
            'filter_index' => 'main_table.created_at'
        ));
 
// Add order comment to grid
        $this->addColumn('ordercomment', array(
            'header' => Mage::helper('ordercomment')->__('Order Comment'),
            'index' => 'ordercomment',
            'filter_index' => 'ordercomment_table.comment',
        ));

以上代码在Magento CE 1.6.2 测试通过。
参考

How to extend Magento Order Grid

Magento 设置Grid per page size

Magento后台的Grid pagesize默认最大值为200,已经远远不能满足用户们的需要了。在后台实在是找不到可以设置pagesize 的地方,只好自己手动Hack了。

magento set grid per page size

打开app/design/adminhtml/default/default/template/widget/grid.phtml,找到

<select name="<?php echo $this->getVarNameLimit() ?>" onchange="<?php echo $this->getJsObjectName() ?>.loadByElement(this)">
    <option value="20"<?php if($this->getCollection()->getPageSize()==20): ?> selected="selected"<?php endif; ?>>20</option>
    <option value="30"<?php if($this->getCollection()->getPageSize()==30): ?> selected="selected"<?php endif; ?>>30</option>
    <option value="50"<?php if($this->getCollection()->getPageSize()==50): ?> selected="selected"<?php endif; ?>>50</option>
    <option value="100"<?php if($this->getCollection()->getPageSize()==100): ?> selected="selected"<?php endif; ?>>100</option>
    <option value="200"<?php if($this->getCollection()->getPageSize()==200): ?> selected="selected"<?php endif; ?>>200</option>
</select>

按照模板的格式,添加一个500的option即可。

<option value="200"<?php if($this->getCollection()->getPageSize()==200): ?> selected="selected"<?php endif; ?>>200</option>
<option value="500"<?php if($this->getCollection()->getPageSize()==500): ?> selected="selected"<?php endif; ?>>500</option>

以上在Magento CE 1.6.2上测试通过。