2

我正在尝试更改我的产品的排序方式。

我想使用按选项排序的属性,而不是按名称排序,而是按“管理属性”中给出的位置排序。但只有当有一个位置时(当全部为 0 时,它应该按名称排序)。

为此,我需要知道在哪个文件中将排序应用于产品集合。我在 app\code\core\Mage\Catalog\Model\Config.php 和 app\code\core\Mage\Catalog\Block\Product\List.php 中进行了搜索,但都没有找到任何关于排序的信息。也许还有一些代码建议。

谷歌也没有帮助我解决这个问题,所以我在这里尝试一下。也许有人可以帮我解决这个问题。

谢谢

编辑:

作为示例,我们采用“颜色”属性,它是一个下拉属性。

“管理属性”中的表格如下所示:

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

编辑2:

    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;
    }
4

4 回答 4

3

如果您想使用实际的颜色属性,这几乎是不可能实现的。产品集合可以从 EAV 结构中获取每种颜色的文本值,并基于它进行排序。但是属性选项表没有加入到集合中,因此它无法知道您为选项设置的位置。

我会为此制定一个解决方法,也许不是最好的整体解决方案,但你会得到你想要的。

使用类似排序颜色和标签颜色的代码和数字选项(例如 1、2、3)创建一个属性。并为每个产品分配适当的值(因此“浅蓝色”为 1,“蓝色”为 2 - 依此类推)。然后从排序中删除实际的颜色属性,并添加新创建的排序颜色

正如我所说的不是确切的解决方案,但如果您选择搞乱产品集合排序,您可能会陷入困境。

于 2012-10-02T12:21:54.033 回答
1

我发现 Mage_Eav_Model_Entity_Attribute_Source_Table 中的函数 addValueSortToCollection 定义了排序顺序。通过向表中添加 LEFT JOINeav_attribute_option并拉入sort_order字段,我能够按属性的 adminhtml 位置进行排序。我还没有完全测试,但它似乎做我想要的。

我创建了一个单独的模块来重写这个类,唯一的修改是添加ValueSortToCollection,在这一行下面:

Mage::getResourceModel('eav/entity_attribute_option')
        ->addOptionValueToCollection($collection, $this->getAttribute(), $valueExpr);

我添加了以下加入,并修改了 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;

}

希望有人觉得这很有帮助。

于 2014-05-13T19:59:03.437 回答
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); 

//这是按属性选项位置排序的最终产品数组

于 2012-11-21T10:50:22.063 回答
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();

或者

请尝试在 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;

}

这可能会帮助你

如果您仍然遇到任何问题,请告诉我

于 2012-10-02T08:01:26.290 回答