3

商品検索の並べ替えリストに、商品を最高価格から最低価格の順に並べて、最後にゼロ価格の商品を表示する方法はありますか。

通常の並べ替えは正常に機能しますが(低から高、または高から低)、最後にゼロ価格の商品を含める機能が本当に必要です。リストされる方法の例は次のとおりです。

製品1:£3

製品2:£18

製品3:£0

製品4:£0

ここやGoogleで検索する方法をまだ見つけておらず、Magentoにあまり詳しくないので、これをどこで変更するかわかりません。誰かが答えを持っているか、自分で編集するためのクエリまたは正しいファイルを教えてくれる場合は、自分で行ってもかまいません。

ここからのヘルプと他の質問を使用して_getProductCollection()、ファイル内のメソッドを編集し/app/code/core/Mage/Catalog/Block/Product/List.php(ローカルにコピーしたことを心配しないでください)、次の数行を追加しました。

$orderFilterType = $this->getRequest()->getParam('order');
$dirFilterType = $this->getRequest()->getParam('dir');

if( isset( $orderFilterType ) && $orderFilterType == 'price' && isset( $dirFilterType ) && $dirFilterType == 'asc' ) {

$this->_productCollection = $layer->getProductCollection()->addAttributeToSort( 'price', 'DESC' );


} else { 

$this->_productCollection = $layer->getProductCollection();

}

これは、このコード内で私が行うことは、誰かが昇順オプションでorderby価格ドロップダウンを選択した場合にのみ実行されることを意味します。

$this->_productCollection = $layer->getProductCollection();問題は、このリターンを希望どおりに返すための値に影響を与えるために何をすべきかわからないことです。

4

4 に答える 4

1

私が知っているパーティーに4年遅れましたが、私が見つけた他の解決策よりもはるかに良い方法でこれを解決したので、誰かを助けるかもしれません。

Catalog / Block / Product / List/Toolbar.phpで置換

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

$zeroPriceLast = new Zend_Db_Expr('`price_index`.`price` = 0 ASC, `price_index`.`price`  ASC');

$this->_collection->getSelect()->order($zeroPriceLast);

条件付きでラップして、価格で並べ替えるときにのみ新しいロジックが適用されるようにします。

于 2017-04-20T15:52:13.873 に答える
0

この質問をここで見てください:Magento、カスタム製品リストこれはあなたのニーズに合うかもしれません

于 2013-03-30T23:19:50.543 に答える
0

生のSQLでこれを行うには、次のようになります。

SELECT main.*, price.value as price FROM catalog_product_entity AS main
    JOIN catalog_product_entity_decimal AS price ON price.entity_id = main.entity_id
    JOIN eav_attribute AS attr_price ON attr_price = 'price' AND price.attribute_id = attr_price.attribute_id
ORDER BY price == 0, price

ORDER BY price ==0, price句を機能させるには、コアブロックをオーバーライドする必要がある場合があります。

于 2013-03-31T05:50:12.403 に答える
0

このようなものが必要だと思います

  1. 各製品リストのオブザーバーを作成します。

    <events> <catalog_block_product_list_collection> <observers> <rebuild_collection> <type>singleton</type> <class>XXX_YYY_Model_Catalog_Observer</class> <method>rebuildCollection</method> </rebuild_collection> </observers> </catalog_block_product_list_collection></events>

ここで、XXX-名前空間YYY-モジュール

  1. phpファイルを作成する

    <?php
    class XXX_YYY_Model_Catalog_Observer extends Mage_Catalog_Model_Observer
    {
    public function rebuildCollection($observer)
    {
    $event = $observer->getEvent();
    /** @var $collection Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection */
    $collection = $event->getCollection();
    
    $toolbar = Mage::getBlockSingleton('catalog/product_list_toolbar');
    
            // here you can add some attributes to collection but it's not required
            // ex. $collection->addAttributeToSelect('brand')
            //    ->addAttributeToSelect('style');
            // you can also force visibility filter Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($collection);
    
             // and here is main part for your logic
            // getting current sort order
            $arr = $collection->getSelect()->getPart(Zend_Db_Select::ORDER);
            // probably here you will need to add condition like  IF ORDERING BY PRICE
            $r = Mage::app()->getRequest()->getRequestString();
    
            $order_field = 'new_price_for_sort';
            $collection->getSelect()->joinLeft(array('a' => 'catalog_product_entity_price'), // or here you will need Price Index Table Name if you have Groupped or configurable products. But need to remember that non-simple products always have 0 price and MAX_PRICE/MIN_PRICE should be used then 
                            'a.product_id=e.entity_id AND a.attibute_id=PRICE or SPECIAL PRICE ATTRIBUTE ID', // or here you will not require attribute_id condition if you are using INDEX TABLE
                            array(
                                'new_price_for_sort' => new Zend_Db_Expr('IF(a.value > 0,a.value, 9999999)'), // which mean that in new field we will have price if it's not 0, and will have big integer is real price is zero. 
                            ));
                    }
    // now we are reseting current order by
                    $collection->getSelect()->reset(Zend_Db_Select::ORDER);
    
    // and creating new order by new field, but with saving direction of order
    $dir = $arr['dir'];
                    if (!$collection->isEnabledFlat()) {
                        $collection->setOrder($order_field, $dir);
                    } else {
                        $collection->getSelect()->order($order_field . ' ' . $dir);
                    }
    
    
                }
          //check in log if collection real built well
            Mage::log((string)$collection->getSelect(), null, 'selects.log');
          // add collection to list toolbar
            $toolbar->setCollection($collection);
        }
    return $collection;
    }
    }
    

PS申し訳ありませんが、このコードを適切に再チェックしていませんが、実際に機能しているオブザーバーからほとんどのコードをコピーしました。しかし、いくつかのミスタイプまたはミスした文字が存在する可能性があります)

于 2013-03-31T11:45:10.587 に答える