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 数据导入sku自动增长

近来由于业务需要研究了下Magento的数据导入模块,只能说很好很强大。起初的目的是为了业务组的一些BT要求(此处对业务组500字的谴责…):要求导入产品的时候根据产品的id自动生成sku,忽略sku的意义。在粗略的研究了导入模块的源码之后,用了一个不是很优雅的方法实现。唉,每个优雅的接口都有个龌龊的实现。

Magento的导入模块从csv中读取数据后,会把数据序列化后存在表importexport_importdata中。之后导入的时候会从表里读取数据,这样办法就有了。我们在序列化之前,修改导入产品的sku,然后存到数据库中就ok了。
具体实现如下

//app/code/local/Mage/ImportExport/Model/Import/Entity/Abstract.php
 /**
     * Import product sku
     *
     * @var int
     */
    protected $_sku = 0;
 
/**
     * Change row data before saving in DB table.
     *
     * @param array $rowData
     * @return array
     */
    protected function _prepareRowForDb(array $rowData)
    {
        /**
         * Convert all empty strings to null values, as
         * a) we don't use empty string in DB
         * b) empty strings instead of numeric values will product errors in Sql Server
         */
        foreach ($rowData as $key => $val) {
            if ($val === '') {
                $rowData[$key] = null;
            }
        }
        //add product sku auto increment
        $key = Mage_ImportExport_Model_Import_Entity_Product::COL_SKU;
        $type = Mage_ImportExport_Model_Import_Entity_Product::COL_TYPE;
        $set = Mage_ImportExport_Model_Import_Entity_Product::COL_ATTR_SET;
        if( $rowData[$key] &&  ( $rowData[$type] == 'simple' && $rowData[$set] == 'Default' || $rowData[$type] == 'configurable' ) ) {
            if(!$this->_sku){
                //get last product entity id
                $res = Mage::getSingleton('core/resource');
                $readConnection = $res->getConnection('core_read');
                $table = $res->getTableName('catalog_product_entity');
                $this->_sku = Mage::getResourceHelper('importexport')->getNextAutoincrement("{$table}");
            }
            $rowData[$key] = strval($this->_sku);
        }
        return $rowData;
    }

就这样子吧。