Magento - 更改属性排序
Posted
技术标签:
【中文标题】Magento - 更改属性排序【英文标题】:Magento - Changing attribute sorting 【发布时间】:2012-10-02 07:46:28 【问题描述】:我正在尝试更改我的产品的排序方式。
我想使用按选项排序的属性,而不是按名称排序,而是按“管理属性”中给出的位置排序。但只有当有一个位置时(当全部为 0 时,它应该按名称排序)。
为此,我需要知道在哪个文件中将排序应用于产品集合。我在 app\code\core\Mage\Catalog\Model\Config.php 和 app\code\core\Mage\Catalog\Block\Product\List.php 中进行了搜索,但都没有找到任何关于排序的信息。也许还有一些代码建议。
Google 也没有帮助我解决这个问题,所以我在这里尝试一下。也许有人可以帮我解决这个问题。
谢谢
编辑:
我们以“颜色”属性为例,它是一个下拉属性。
“管理属性”里面的表格是这样的:
Valuename | Position
========================
light blue | 1
blue | 2
dark blue | 3
light red | 4
red | 5
dark red | 6
在前端我按属性“颜色”排序,我的产品将以这种方式列出:
blue
dark blue
dark red
light blue
light red
red
但我希望它像这样列出:
light blue
blue
dark blue
light red
red
dark red
EDIT2:
public function getAllOptions($withEmpty = true, $defaultValues = false)
$storeId = $this->getAttribute()->getStoreId();
if (!is_array($this->_options))
$this->_options = array();
if (!is_array($this->_optionsDefault))
$this->_optionsDefault = array();
if (!isset($this->_options[$storeId]))
$collection = Mage::getResourceModel('eav/entity_attribute_option_collection')
->setPositionOrder('asc')
->setAttributeFilter($this->getAttribute()->getId())
->setStoreFilter($this->getAttribute()->getStoreId())
->load();
$this->_options[$storeId] = $collection->toOptionArray();
$this->_optionsDefault[$storeId] = $collection->toOptionArray('default_value');
$options = ($defaultValues ? $this->_optionsDefault[$storeId] : $this->_options[$storeId]);
if ($withEmpty)
array_unshift($options, array('label' => '', 'value' => ''));
return $options;
【问题讨论】:
您好,您说的是按属性值名称而不是按产品属性位置对产品进行排序? 我说的是按产品属性位置而不是属性值名称排序。目前它按属性值名称而不是属性位置排序。 【参考方案1】:如果您想使用实际的 color 属性,这几乎是不可能实现的。 产品集合可以从 EAV 结构中获取每种颜色的文本值,并基于它进行排序。但是属性选项表没有加入到集合中,因此它无法知道您为选项设置的位置。
我会为此制定一个解决方法,也许不是最好的整体解决方案,但你会得到你想要的。
使用 sorting_color 之类的代码和标签 Color 以及数字选项(例如 1、2、3)创建一个属性。并为每个产品分配适当的值(因此“浅蓝色”为 1,“蓝色”为 2 - 依此类推)。然后从排序中删除实际的 color 属性,并添加新创建的 sorting_color。
正如我所说的,不是确切的解决方案,但如果您选择搞乱产品集合排序,您可能会陷入麻烦。
【讨论】:
有没有办法使用“admin-name”而不是“storeview-name”对属性进行排序?所以我可以使用它并将数字添加到管理员名称中。 @ShogunArts.de 否 - 为具体商店加载集合,它将仅加载该商店的所有属性值【参考方案2】:我也遇到了同样的问题,并通过使用一些自定义代码解决了它: 我想在这里分享,以便有人从中得到想法: 首先,我得到了所有按位置排序的颜色属性选项
$attribute = Mage::getSingleton('eav/config')->getAttribute('catalog_product', 'color');
if ($attribute->usesSource())
$options = $attribute->getSource()->getAllOptions('positions');
foreach($options as $val)
$color_attr_array[] = $val['label'];
我得到了所有按位置排序的颜色属性选项
foreach($childProducts as $_childProduct)
//get the attribute option of a particular product and find itd key from the attributes array
$color_attr_val = $_childProduct->getAttributeText('color');
$color_pos = array_search($color_attr_val,$color_attr_array);
//make a new array with key indexes of attribute options
$_childproduct_final_arr[$color_pos] = $_childProduct;
ksort($_childproduct_final_arr);
//这是按属性选项位置排序的最终产品数组
【讨论】:
【参考方案3】:我发现 Mage_Eav_Model_Entity_Attribute_Source_Table 中的 addValueSortToCollection 函数定义了排序顺序。通过将 LEFT JOIN 添加到表 eav_attribute_option
并拉入 sort_order
字段,我能够按属性的 adminhtml 位置进行排序。我尚未完全测试,但它似乎可以满足我的要求。
我创建了一个单独的模块来重写这个类,唯一的修改是添加ValueSortToCollection,在这一行下面:
Mage::getResourceModel('eav/entity_attribute_option')
->addOptionValueToCollection($collection, $this->getAttribute(), $valueExpr);
我添加了以下 Join,并修改了 getSelect 语句以按位置第 1 位排序,然后按字母顺序第 2 位:
// add join here to pull in sort_order for attribute
$collection->getSelect()->joinLeft(
array($this->getAttribute()->getAttributeCode() . '_option' => 'eav_attribute_option'), "$this->getAttribute()->getAttributeCode()_option_value_t1.option_id=" . $this->getAttribute()->getAttributeCode() . "_option.option_id"
);
$collection->getSelect()
->order("sort_order $dir") // Add sort_order to the select statement
->order("$this->getAttribute()->getAttributeCode() $dir");
return $this;
希望有人觉得这很有帮助。
【讨论】:
这是我多年来在 Magento 中发现的最好的隐藏宝石。这使得类别等可以按属性排序位置进行排序,从而使整洁的目录更容易一些。【参考方案4】:de
只要打开这个文件 Mage/Eav/Model/Entity/Attribute/Source/table.php 有一个函数 getAllOptions() 可以试试这个
$collection = Mage::getResourceModel('eav/entity_attribute_option_collection')
->setPositionOrder('asc')
->setAttributeFilter($this->getAttribute()->getId())
->setStoreFilter($this->getAttribute()->getStoreId())
->load();
或
请尝试查看app/code/core/Mage/Catalog/Model/Config.php中是否有评论:
public function getAttributeUsedForSortByArray()
$options = array(
**‘position’ => Mage::helper(‘catalog’)->__(‘Position’)**
);
foreach ($this->getAttributesUsedForSortBy() as $attribute)
/* @var $attribute Mage_Eav_Model_Entity_Attribute_Abstract */
$options[$attribute->getAttributeCode()] = $attribute->getStoreLabel();
return $options;
希望对你有帮助
如果您仍然遇到任何问题,请告诉我
【讨论】:
请检查天气是否有任何其他扩展/模块可能会影响您的代码? 我从未安装过与此相关的扩展。只有语言包。但我会在我的问题中发布我的整个“getAllOptions()”函数。也许我需要删除一些 if 条件。但是“getAllOptions()”函数真的可以处理产品的排序顺序吗? 做一件事复制整个文件夹 Mage/Eav/Model/Entity/Attribute/Source/table.php 并将其放在 app/code/local 中,然后尝试它是否正常工作?跨度> 我为什么要评论按位置排序的选项? 哦,对不起,我的错误。我只是想让你检查一下天气,那条线上有没有评论?保存属性值后,您是否完成了索引和刷新捕获的一件事!以上是关于Magento - 更改属性排序的主要内容,如果未能解决你的问题,请参考以下文章
我们如何在 Magento2 中更改属性 Swatch 图像的大小