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: app\code\core\Mage\Eav\Model\Entity\Setup.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: app\code\core\Mage\Eav\Model\Entity\Attribute\Source\Boolean.php
class Mage_Eav_Model_Entity_Attribute_Source_Boolean

为属性重新设置排序

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

 //file: app\code\core\Mage\Eav\Model\Entity\Setup.php
/**
* Add or update attribute to group
*
* @param int|string $entityType
* @param int|string $setId
* @param int|string $groupId
* @param int|string $attributeId
* @param int $sortOrder
* @return Mage_Eav_Model_Entity_Setup
*/
public function addAttributeToGroup($entityType, $setId, $groupId, $attributeId, $sortOrder = null){ ... }

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

修改原有属性:

 //file: app\code\core\Mage\Eav\Model\Entity\Setup.php
/**
* Update Attribute data and Attribute additional data
*
* @param mixed $entityTypeId
* @param mixed $id
* @param string $field
* @param mixed $value
* @param int $sortOrder
* @return Mage_Eav_Model_Entity_Setup
*/
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/

magento新增商品属性以及将属性加入Flat table的更多相关文章

  1. Java生鲜电商平台-生鲜电商中商品类目、属性、品牌、单位架构设计与实战

    Java生鲜电商平台-生鲜电商中商品类目.属性.品牌.单位架构设计与实战 说明:Java生鲜电商平台-生鲜电商中商品类目.属性.品牌.单位架构设计与实战经验分享 凡是涉及到购物,必然是建立在商品的基础 ...

  2. html5中新增的form表单属性

    html5中新增两个表单属性,分别autocomplete和novalidate属性 1.autocomplete属性 该属性用于控制自动完成功能的开启和关闭.可以设置表单或者input元素,有两个属 ...

  3. HTML5新增video标签及对应属性、API详解

    知识说明: 比不上很牛的前端开发人员,但自始至终明白“万丈高楼平地起”,基础最重要,初学HTML5,稳固基础第一步,把最基本的整理下来,留下自己学习的痕迹.HTML5新增的video标签,将其属性以及 ...

  4. 疯狂的表单-html5新增表单元素和属性

    疯狂的表单 2015/11/27 16:44:07 从三方面来介绍html5表单的新特性 表单结构更灵活 要提交数据的控件可以布局在form标签之外,看下面的代码,表单元素可以写到form元素之外,只 ...

  5. Java操作属性文件,支持新增或更新多个属性

    Java操作属性文件.支持新增或更新多个属性 一.更新或新增单个属性的方法 /** * 写入properties信息 * @param filePath 绝对路径(包含文件名称和后缀名) * @par ...

  6. PHP.40-TP框架商城应用实例-后台15-商品属性与库存量1-不同商品(唯一属性、可选属性),属性类型

    思路: 1.不同商品属于不同的类型,如:手机.服装.电脑等类型 2.不同的类型有不同的属性,其中分为唯一属性和可选属性,如服装:可选属性{尺寸:S,M,L……;颜色:白色,黑色……}唯一属性:材质 首 ...

  7. Python类属性,实例属性

    1.Python类数据属性:定义在类里面但在函数外面的变量,它们都是静态的. #一段很简单的代码,但反应了很多 >>> class A(): a=1 #一个类里面有个属性a > ...

  8. 重新想象 Windows 8.1 Store Apps (77) - 控件增强: 文本类控件的增强, 部分控件增加了 Header 属性和 HeaderTemplate 属性, 部分控件增加了 PlaceholderText 属性

    [源码下载] 重新想象 Windows 8.1 Store Apps (77) - 控件增强: 文本类控件的增强, 部分控件增加了 Header 属性和 HeaderTemplate 属性, 部分控件 ...

  9. SQL反模式学习笔记6 支持可变属性【实体-属性-值】

    目标:支持可变属性 反模式:使用泛型属性表.这种设计成为实体-属性-值(EAV),也可叫做开放架构.名-值对. 优点:通过增加一张额外的表,可以有以下好处 (1)表中的列很少: (2)新增属性时,不需 ...

随机推荐

  1. 使用Meshlab软件将点云(Point Cloud)转换为模型(Mesh)

    使用Meshlab软件将点云(Point Cloud)转换为模型(Mesh) 启动Meshlab软件: 导入.ply点云文件: 接着点击: 弹出一个右侧边栏: 接着,计算每个点的法线: 输入100,点 ...

  2. 301ReidrectPages中重复记录导致的500 server error

    在Umbraco平台开发一个系统时,遇到一个问题,报错500 server error, system is currently unable to handle this request. 按下F1 ...

  3. Web应用之ActionForm

    看链接: 主要就是讲了一下form表单的传递,bean的工作原理. http://blog.csdn.net/java_pengjin/article/details/5987330

  4. Ubuntu下Apache2+Tomact7安装、配置及整合

    安装Apache2 命令:apt-get install apache2 cd  /etc/apache2 打开apache.conf 加入 ServerName localhostDirectory ...

  5. DataSet,DataTable,DataColumn,DataRow的常用操作

    DataSet 这个玩意没什么好讲的,当ado.net查询出有多张表集合的数据返回时,这个时候就会使用到DataSet. DataTable //表之间直接赋值 dt2=dt1; 两者指向同一内存空间 ...

  6. BK Componet Monitor

    Apache a) 启动服务前将监听地址改成0.0.0.0 b) 确认在文件“/etc/httpd/conf.modules.d/00-base.conf“中有加载mod_status模块 c) 新建 ...

  7. 第三方登录---微信(使用laravel插件)

    转发: https://www.jianshu.com/p/7be757655814 TP框架: http://www.php.cn/php-weizijiaocheng-363509.html

  8. GoWeb开发_Iris框架讲解(三):路由功能处理方式

    Context概念 Context是iris框架中的一个路由上下文对象,在iris框架中的源码路径定义为:{$goPath}\github.com\kataras\iris\context\conte ...

  9. uva1610 聚会游戏(细节处理)

    uva1610 聚会游戏(细节处理) 输入一个n(n<=1000且为偶数)个字符串的集合D,找一个长度最短的字符串(不一定要在D中出现)S,使得D中恰好一半字符串小于等于S,另一半大于S.如果有 ...

  10. 小R的棋子

    小R的棋子(dp) 数轴上有 n 个位置可以摆放棋子,标号为1,2,3...n.小 R 现在要在一些位置摆放棋子,每个位置最多摆放一个棋子,摆放棋子的总数没有限制.小 R 不希望他摆放的棋子过于拥挤, ...