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

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

4 に答える 4

3

実際の属性を使用する場合、これを実現することはほとんど不可能です。製品コレクションは、EAV構造から各色のテキスト値を取得し、それに基づいて並べ替えを実行できます。ただし、属性オプションテーブルはコレクションに結合されていないため、オプションに設定した位置を知る方法はありません。

私はそのための回避策を作成しますが、おそらく最良の全体的な解決策ではありませんが、あなたはあなたが望むものを手に入れるでしょう。

sort_colorやlabelColorなどのコードsmthと、数値オプション(1、2、3など)を使用して属性を作成します。そして、各製品に適切な値を割り当てます(つまり、「水色」は1、「青」は2など)。次に、実際の属性を並べ替えから削除し、新しく作成したsorting_colorを追加します。

正確な解決策ではありませんが、商品コレクションの並べ替えを台無しにすると、問題が発生する可能性があります。

于 2012-10-02T12:21:54.033 に答える
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 に答える
1

Mage_Eav_Model_Entity_Attribute_Source_Tableの関数addValueSortToCollectionが、並べ替え順序を定義するものであることがわかりました。テーブルにLEFTJOINを追加eav_attribute_optionし、フィールドをプルするsort_orderことで、属性のadminhtml位置で並べ替えることができました。私は完全にテストしていませんが、それは私が望むことをしているようです。

このクラスを書き直すために別のモジュールを作成しました。唯一の変更は、この行の下にあるaddValueSortToCollectionです。

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;

}

誰かがこれがお役に立てば幸いです。

于 2014-05-13T19:59:03.437 に答える
0

de

このファイルMage/Eav / Model / Entity / Attribute / Source / table.phpを開くだけで、これを試すgetAllOptions()という関数が1つあります。

 $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 に答える