我正在尝试更改我的产品的分类。
我想使用属性sort by options不按名称排序,而是按“管理属性”中给出的位置排序。但只有当有一个位置时(全部为0时,它应按名称排序)。
为此,我需要知道排序应用于产品集合的文件。我在app \ code \ core \ Mage \ Catalog \ Model \ Config.php和app \ code \ core \ Mage \ Catalog \ Block \ Product \ List.php里面搜索但是没有找到关于排序的任何内容。也许还有一些代码建议。
Google也没有帮我解决这个问题,所以我在这里试试。也许somone可以帮助我。
由于
修改
例如,我们采用“颜色”属性,它是一个下拉属性。
“管理属性”中的表格如下所示:
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;
}
答案 0 :(得分:3)
如果您想使用实际的颜色属性,这几乎是不可能实现的。 产品集合可以从EAV结构中获取每种颜色的文本值,并根据它进行排序。但属性选项表未加入集合,因此无法知道您为选项设置的位置。
我会为此做一个解决方法,也许不是最好的整体解决方案,但你会得到你想要的。
创建一个代码为smth的属性,如 sorting_color ,并标记 Color 和数字选项(例如1,2,3)。并为每个产品分配适当的值(因此“浅蓝色”将为1,“蓝色”为2 - 依此类推)。然后从排序中删除实际的颜色属性,并添加新创建的 sorting_color 。
正如我所说的不是确切的解决方案,但如果你选择搞乱产品系列分类,你可能会遇到麻烦。
答案 1 :(得分:1)
我也遇到了同样的问题,并使用一些自定义代码解决了这个问题: 我想在这里分享,以便有人从中得到这样的想法: 首先,我获得了按位置
排序的所有颜色属性选项$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);
//这是按属性选项位置
排序的最终产品数组答案 2 :(得分:1)
我发现Mage_Eav_Model_Entity_Attribute_Source_Table中的函数addValueSortToCollection定义了排序顺序。通过向表eav_attribute_option
添加LEFT JOIN并拉入sort_order
字段,我可以按属性的adminhtml位置进行排序。我还没有完全测试,但它似乎做了我想做的事。
我创建了一个单独的模块来重写这个类,唯一的修改是addValueSortToCollection,在这一行之下:
Mage::getResourceModel('eav/entity_attribute_option')
->addOptionValueToCollection($collection, $this->getAttribute(), $valueExpr);
我添加了以下Join,并修改了getSelect语句,按位置1st排序,然后按字母顺序排序第二:
// 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;
}
希望有人觉得这很有帮助。
答案 3 :(得分:0)
德
只需打开此文件 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();
OR
请尝试在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;
}
这可能会对你有所帮助
如果您仍然遇到任何问题,请告诉我