Magento的属性可以用来放在产品列表页给产品进行排序,要用来排序的属性只需要在后台属性管理的地方选择应用于排序,默认情况下是name和price这两个属性可以在前台用来排序(Position是例外)。
那么现在有个简单的尝试,就是新增一个属性,只允许填写数字,然后前台的产品可以按照数字的大小来对产品进行排序。看起来很合理的需求,尝试起来却遇到了麻烦。
首先要决定这个属性的输入类型,magento允许的输入类型如下图所示,看上去既能手动输入又能限制输数字的就只能是文本框了。
所以先尝试了用文本框输入类型,然后限制只能输入整数,如下图
新增这个属性后,选择将这个属性应用于列表页的排序,然后给几个产品的这个属性分别赋不同的值(数字),现在前台就可以尝试用这个属性来排序了。
问题来了,当我按序号降序排列时,序号为96的产品确实排在序号为97的产品的后面,但却同时发现原本应该排在最前面的序号为198的产品却排在了后面,甚至序号为20的产品都在它的前面,这是怎么回事?
检查数据库后发现,凡是文本框类型的属性,在数据库中保存的都是varchar类型的数据,限制输入整数也只是在填写该属性时多了一层整数的验证,也就是说前台用这个属性进行排序时,实际上是一些字符串进行对比之后在排序,字符串排序会优先检查首字母,这也就是为什么降序时序号为20的产品会排在序号为198的产品的前面。
那么Magento就没有办法用某个属性的数值大小来对产品进行排序了吗?也不尽然,检查数据库的时候会发现价格属性在数据库里是按数字类型保存的(这个好像是理所当然的),前台自带的按价格排序也验证了价格类型的属性排序是确实是按数字的大小来排的,而不是比较字符串。
所以现在尝试新增一个属性,输入类型选择价格型,应用于前台排序,用来管理商品时填写某种需要用到的数字(虽然是价格型属性,但不是拿来填价格的)。同预料的一样,这样前台按这个新属性排序是就是完全按数字的大小来排了。
不知道以这种方式来实现需求是不是最合理的方式,对Magento来说,至少我自己先这么用着了。