4

私は実際に3つの可能な値「Frühjahr/Sommer」、「Herbst/Winter」、「」(空)を持つカスタム製品属性を持っています。

この値で製品コレクションを事前定義された順序で並べ替えたいと考えています。

これは交互です。空の値は常に最後にある必要がありますが、さらに値が来る可能性があるため、事前に定義された固定の順序である必要があります。

次の MySQL ORDER BY FIELD (saison、"Frühjahr/Sommer"、"Herbst/Winter"、"") を実行する必要があります。

問題は、Magento でこのコマンドを実行する方法がわからないことです。「->setOrder」メソッドは知っていますが、DESC や ASC を使用する代わりに固定順序をコミットする必要があります。

私はstackoverflowとgoogleでよく検索しますが、これまでのところ答えがありません.

あなたが私を助けてくれることを願っています

ありがとう

[magalter の回答に応答して編集]

残念ながら、私は以前に試しましたがうまくいきません:

$this->_collection->getSelect()->order(new Zend_Db_Expr("FIELD(season, 'Frühjahr/Sommer','Herbst/Winter','')"));

結果は「リクエストの処理中にエラーが発生しました。

$this->_collection->getSelect();

戻る:

SELECT `e`.*, `cat_index`.`position` AS `cat_index_position`, `price_index`.`price`, `price_index`.`tax_class_id`, `price_index`.`final_price`, IF(price_index.tier_price IS NOT NULL, LEAST(price_index.min_price, price_index.tier_price), price_index.min_price) AS `minimal_price`, `price_index`.`min_price`, `price_index`.`max_price`, `price_index`.`tier_price` FROM `catalog_product_entity` AS `e` INNER JOIN `catalog_category_product_index` AS `cat_index` ON cat_index.product_id=e.entity_id AND cat_index.store_id=1 AND cat_index.visibility IN(2, 4) AND cat_index.category_id='124' INNER JOIN `catalog_product_index_price` AS `price_index` ON price_index.entity_id = e.entity_id AND price_index.website_id = '1' AND price_index.customer_group_id = 0 ORDER BY FIELD(season, 'Frühjahr/Sommer','Herbst/Winter','')

この sql-statement を phpMyAdmin で実行すると、次のエラー メッセージが表示されます。

「季節」で注文する場合 DESC

$this->_collection->setOrder('season', 'DESC');

それは動作します...そして、次のSQLステートメントを生成します

SELECT `e`.*, `cat_index`.`position` AS `cat_index_position`, `price_index`.`price`, `price_index`.`tax_class_id`, `price_index`.`final_price`, IF(price_index.tier_price IS NOT NULL, LEAST(price_index.min_price, price_index.tier_price), price_index.min_price) AS `minimal_price`, `price_index`.`min_price`, `price_index`.`max_price`, `price_index`.`tier_price`, IF(season_option_value_t2.value_id IS NULL, season_option_value_t1.value, season_option_value_t2.value) AS `season` FROM `catalog_product_entity` AS `e` INNER JOIN `catalog_category_product_index` AS `cat_index` ON cat_index.product_id=e.entity_id AND cat_index.store_id=1 AND cat_index.visibility IN(2, 4) AND cat_index.category_id='124' INNER JOIN `catalog_product_index_price` AS `price_index` ON price_index.entity_id = e.entity_id AND price_index.website_id = '1' AND price_index.customer_group_id = 0 LEFT JOIN `catalog_product_entity_int` AS `season_t1` ON e.entity_id=season_t1.entity_id AND season_t1.attribute_id='180' AND season_t1.store_id=0 LEFT JOIN `catalog_product_entity_int` AS `season_t2` ON e.entity_id=season_t2.entity_id AND season_t2.attribute_id='180' AND season_t2.store_id='1' LEFT JOIN `eav_attribute_option_value` AS `season_option_value_t1` ON season_option_value_t1.option_id=IF(season_t2.value_id > 0, season_t2.value, season_t1.value) AND season_option_value_t1.store_id=0 LEFT JOIN `eav_attribute_option_value` AS `season_option_value_t2` ON season_option_value_t2.option_id=IF(season_t2.value_id > 0, season_t2.value, season_t1.value) AND season_option_value_t2.store_id=1 ORDER BY `season` DESC

しかし、これはDESCによる注文であり、私が欲しいような事前定義された順序ではなく、使用できません。

私が必要とするのは、上記のSQLステートメントです

ORDER BY FIELD(season, 'Frühjahr/Sommer','Herbst/Winter','')

代わりは

ORDER BY `season` DESC

別のアイデア???

4

4 に答える 4

6

MagentoのsetOrderメソッドではなく、Zend_DB_Selectorderを使用してみてください

$colection->getSelect()->order(..)

例:

->order(array('line_items_per_product DESC',
                       'product_id'));

その他の例については、 http://framework.zend.com/manual/1.12/ru/zend.db.select.html#zend.db.select.building.orderを参照 してください。

于 2013-01-20T10:49:23.430 に答える
3

最後に、解決策を見つけました。たぶん別のユーザーがそれを必要とするので、ここにあります:

(おそらく最善の解決策ではありませんが、うまくいきます)

新しいモジュールを作成し、Mage_Catalog_Block_Product_List_Toolbar を拡張します。次に、このように「setCollection」メソッドをオーバーライドします

public function setCollection($collection)
{
    $this->_collection = $collection;

    $this->_collection->setCurPage($this->getCurrentPage());

    // we need to set pagination only if passed value integer and more that 0
    $limit = (int)$this->getLimit();
    if ($limit) {
        $this->_collection->setPageSize($limit);
    }
    if ($this->getCurrentOrder()) {
        $mySource = $this->_collection->getEntity()->getAttribute('season');

        $mySource = $this->_collection->getEntity()->getAttribute('season')->getSource(); //Mage_Eav_Model_Entity_Attribute_Source_Table
        $collection = $this->_collection;
        $valueTable1    = 'season_t1';
        $valueTable2    = 'season_t2';

        $collection->getSelect()
            ->joinLeft(
                array($valueTable1 => $mySource->getAttribute()->getBackend()->getTable()),
                "e.entity_id={$valueTable1}.entity_id"
                . " AND {$valueTable1}.attribute_id='{$mySource->getAttribute()->getId()}'"
                . " AND {$valueTable1}.store_id=0",
                array()
            )
            ->joinLeft(
                array($valueTable2 => $mySource->getAttribute()->getBackend()->getTable()),
                "e.entity_id={$valueTable2}.entity_id"
                . " AND {$valueTable2}.attribute_id='{$mySource->getAttribute()->getId()}'"
                . " AND {$valueTable2}.store_id='{$collection->getStoreId()}'",
                array()
            );
        $valueExpr = $collection->getSelect()->getAdapter()
        ->getCheckSql("{$valueTable2}.value_id > 0", "{$valueTable2}.value", "{$valueTable1}.value");

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

        $sortBySeason = "FIELD(IF(season_option_value_t2.value_id IS NULL, season_option_value_t1.value, season_option_value_t2.value), ";


        $getSelectedSeason = Mage::getStoreConfig('sortproductsbyseason_options/general/current_season');

        if($getSelectedSeason == "herbst_winter"){
            $sortBySeason .= "'Frühjahr/Sommer', 'Herbst/Winter' ,''";
        }else{
            $sortBySeason .= "'Herbst/Winter', 'Frühjahr/Sommer' ,''";
        }
        $sortBySeason .= ") DESC";

        $this->_collection->getSelect()->order(new Zend_Db_Expr($sortBySeason));

        $this->_collection->setOrder($this->getCurrentOrder(), $this->getCurrentDirection());
    }

    return $this;
}   
于 2013-01-25T17:09:07.063 に答える
0

これはどうですか??

$collection = Mage::getModel('catalog/category')->load($categoryId)
    ->getProductCollection()
    ->addAttributeToSort('name', 'ASC');
于 2013-01-20T12:25:33.977 に答える