zoukankan      html  css  js  c++  java
  • magento新增商品属性以及将属性加入Flat table

    magento的EAV模型非常强大且灵活,但是如果不做优化的话,性能会非常低,因为attributes都存放在附表里,要获取一个entity的attribute,需要表联结一次,如果需要获取多条attributes, 就会产生大量的表联结,势必会对数据库造成压力,对于访问量大的内容,比如catalog_product(商品)、商品列表(catalog_category),Magento core team使用了flat table这种策略来应对,简而言之,就是把需要的attributes的值收集起来,新建一个缓存表,Attribute code作为列名,attribute value作为列的值,这样通过一个SELECT就可以把很多attributes的值查询出来。

    缓存表是一把“双刃剑”,虽然解决了性能问题,却造成了一些负面影响:
    比如:
    1. 对系统做了修改,需要重新生成缓存表(reindex),假如商品较多,往往比较耗时
    2. 新增attribute时,如果要添加进缓存表比较麻烦,且需要reindex

    在这里简单介绍一下Magento在新增catalog_product的attribute时应该注意的地方,以及如何设置属性的排序、修改原有属性

    新增属性:

    新增商品属性主要使用的是addAttribute()这个方法。

     1 //file: appcodecoreMageEavModelEntitySetup.php
     2 /**
     3 * Add attribute to an entity type
     4 *
     5 * If attribute is system will add to all existing attribute sets
     6 *
     7 * @param string|integer $entityTypeId
     8 * @param string $code
     9 * @param array $attr
    10 * @return Mage_Eav_Model_Entity_Setup
    11 */
    12 public function addAttribute($entityTypeId, $code, array $attr){ ... }

    这里需要注意的是此函数的第三个参数$attr,它是一个数组,里面规定了新的attribute的各种属性:

    1. 'group' : 商品编辑页面左侧导航栏分组,
    2. 'type' : 字段在MySQL中的类型,例如VARCHAR
    3. 'label' : 该属性在商品编辑页面的label
    4. 'input' : 该属性在商品编辑页面的Input type
    4. 'source' : 如果该属性是(multi)select等类型,需要定义一个source类为它提供选项,如果该属性需要加入缓存表,除了提供选项之外,还需要注意提供该属性在缓存表中的字段名以及如果更新缓存表,后面还要详细说明(注1)
    5. 'global' : 代表属性的生效范围,分别有Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_GLOBAL | SCOPE_WEBSITE | SCOPE_STORE
    6. 'required' : 表示是否为必填项
    7. 'user_defined' : 表示是否为用户添加(相对与系统原有的而言)
    8. 'default' : 该属性的缺省值
    9. 'unique' : 表示该属性是否具有唯一性
    10. 'apply_to' : 表示该属性对哪种商品生效,比如'simple,configurable,bundle'表示该属性对simple和configurable两种商品生效
    11. 'used_in_product_listing' : 表示该属性会添加到缓存表中

    注1
    假如新增的attribute的input不是‘text’,例如select,则需要提过source类,该source类继承Mage_Eav_Model_Entity_Attribute_Source_Abstract,需要实现getAllOptions()方法为attributes提供选项;

    另外,如果新增的attribute将要添加到缓存表中,首先'used_in_product_listing'应该设置为1,除此之外,source类还需要实现getFlatColums()方法和getFlatUpdateSelect()方法,
    getFlatColums()方法规定attribute映射到缓存表中的字段的各项属性,包括 type,unsigned,length,nullable等
    getFlatUpdateSelect()方法规定缓存表中的值的更新方式,可参考系统中原有的source类来进行设置

    参考例子:

    //file: appcodecoreMageEavModelEntityAttributeSourceBoolean.php
    class Mage_Eav_Model_Entity_Attribute_Source_Boolean

    为属性重新设置排序

    新增了商品属性之后,同一个分组中的属性排序很混乱,可以使用addAttributeToGroup()方法重新设置排序:

     1 //file: appcodecoreMageEavModelEntitySetup.php
     2 /**
     3  * Add or update attribute to group
     4  *
     5  * @param int|string $entityType
     6  * @param int|string $setId
     7  * @param int|string $groupId
     8  * @param int|string $attributeId
     9  * @param int $sortOrder
    10  * @return Mage_Eav_Model_Entity_Setup
    11  */
    12 public function addAttributeToGroup($entityType, $setId, $groupId, $attributeId, $sortOrder = null){ ... }

    新增了attribute之后,往往需要重新生成缓存表,记得要在在magento中reindex一下

    修改原有属性:

     1 //file: appcodecoreMageEavModelEntitySetup.php
     2 /**
     3 * Update Attribute data and Attribute additional data
     4 *
     5 * @param mixed $entityTypeId
     6 * @param mixed $id
     7 * @param string $field
     8 * @param mixed $value
     9 * @param int $sortOrder
    10 * @return Mage_Eav_Model_Entity_Setup
    11 */
    12 public function updateAttribute($entityTypeId, $id, $field, $value = null, $sortOrder = null){ ... }

    注意: 这里的$field和addAttribute()方法第三个参数$attr所包含的项目不完全一致,请直接使用eav_attribute表的column名称。

    如果您觉得阅读本文对您有帮助,欢迎转载本文,但是转载文章之后必须在文章页面明显位置保留此段声明,否则保留追究法律责任的权利。

    作  者:blog.jpdou.top

    原文链接:http://blog.jpdou.top/add-attribute-in-magento/

  • 相关阅读:
    WPF游戏摘记地图编辑器(1)
    图片和视频操作核心代码
    WPF游戏摘记地图编辑器(2)
    序言
    Asp.Net 请求处理机制
    C#正则表达式
    ActiveX控件打包成Cab实现浏览器自动下载安装
    ios数据存储
    ARC 学习
    Ray's Learn Cocos2d 笔记(一)
  • 原文地址:https://www.cnblogs.com/jpdoutop/p/5854127.html
Copyright © 2011-2022 走看看