web-dev-qa-db-ja.com

Magento-追加された日付で並べ替え

Magentoでカタログ内の製品を追加された日付で並べ替えるにはどうすればよいですか?これは管理者のオプションではないため、コードのどこかで実行する必要があると推測します。

ありがとう。

19
a1anm

コアファイルの変更に問題がなければ(そうしてはいけません)、日付による並べ替えオプションを追加するのは非常に簡単です。以下の例のようにapp/code/core/Mage/Catalog/Model/Config.phpファイルを変更するだけです:

public function getAttributeUsedForSortByArray()
{
    $options = array(
        'position'  => Mage::helper('catalog')->__('Position'),

        // HERE IS OUR NEW OPTION
        'created_at' => Mage::helper('catalog')->__('Date')
    );
    foreach ($this->getAttributesUsedForSortBy() as $attribute) {
        /* @var $attribute Mage_Eav_Model_Entity_Attribute_Abstract */
        $options[$attribute->getAttributeCode()] = $attribute->getStoreLabel();
    }

    return $options;
}

コアファイルを変更することに慣れていない場合は、それほど簡単ではありません。その場合は、次の一連のファイルを作成する必要があります。

app/etc/modules/Stackoverflow_Catalog.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Stackoverflow_Catalog>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <Mage_Catalog />
            </depends>
        </Stackoverflow_Catalog>
    </modules>
</config>

app/code/local/Stackoverflow/Catalog/etc/config.xml

<?xml version="1.0"?>
<config>
    <global>
        <models>
            <catalog>
                <rewrite>
                    <config>Stackoverflow_Catalog_Model_Config</config>
                </rewrite>
            </catalog>
        </models>
    </global>
</config>

app/code/local/Stackoverflow/Catalog/Model/Config.php

<?php

class Stackoverflow_Catalog_Model_Config extends Mage_Catalog_Model_Config {
    public function getAttributeUsedForSortByArray() {
        $options = parent::getAttributeUsedForSortByArray();
        if (!isset($options['created_at'])) {
            $options['created_at'] = Mage::helper('catalog')->__('Date');
        }
        return $options;
    }
}

ヒント:クリーンな方法を選択してください。長期的に見れば効果があります。

43

このコードをlocal.xmlに配置すると、Magentoコアファイルをオーバーライドする必要はありません。

今後のアップグレードでMagentoコアファイルを上書きすると、問題が発生します

<layout>
<catalog_category_default>
    <reference name="product_list">
        <action method="setAvailableOrders" json="value">
            <value><![CDATA[
                           {"created_at" : "Latest","price":"Price"}
                   ]]>
            </value>
        </action>
    </reference>
    <reference name="product_list_toolbar">
        <action method="setDefaultDirection">
            <dir>desc</dir>
        </action>
    </reference>
</catalog_category_default>
</layout>
14
user1553711

App/code/core/Mage/Catalog/Block/Product /List.phpをapp/code/localにコピーし、その_getProductCollection()メソッドの最後にソートコードを追加することでこれを解決しました。

// sort by created_at date or entity_id
if(!isset($_GET['order'])) {
    $this->_productCollection->getSelect()->reset( Zend_Db_Select::ORDER );
    $this->_productCollection->getSelect()->order('e.entity_id desc');
}
return $this->_productCollection;

どちらかを使用できます'e.entity_id desc'または'e.created_at desc' 整理する。

13
enru

このような

$_newest_productCollection = Mage::getResourceModel('reports/product_collection')
->addAttributeToSelect('*')
->addAttributeToFilter('visibility', $visibility)
->setOrder('created_at', 'desc')
$_newest_productCollection->load();
11
Marlon Creative

更新のためのYust(Mage 1.7.0.2で動作):独自のモジュールのセットアップスクリプト内:

$installer = $this;
$installer->startSetup();

$productEntityTypeId = Mage::getModel('catalog/product')->getResource()->getEntityType()->getId();

//lets change created_at properties
//////////////////////////////////////////////////
$installer->updateAttribute($productEntityTypeId, 'created_at', array(
    'visible_on_front' => true,
    'used_in_product_listing' => true
    'used_for_sort_by' => 1,
    'frontend_label' => 'Created at'
));

$installer->endSetup();

// mark index as "reindex required"
$indexerCodes = array(
    'catalog_product_flat'
);
$indexer = Mage::getModel('index/process');
foreach ($indexerCodes as $code) {
    $indexer->load($code, 'indexer_code')
        ->changeStatus(Mage_Index_Model_Process::STATUS_REQUIRE_REINDEX);
}

そしてcatalog.xmlレイアウトハンドルで:

<block type="catalog/product_list_toolbar" name="product_list_toolbar" template="catalog/product/list/toolbar.phtml">
...
<action method="setDefaultDirection"><dir>desc</dir></action>
</block>

この後、システム構成またはカテゴリ表示設定で、デフォルトのソートとしてcreated_atを選択できます。

2
Marcel Lange

コアコードを掘り下げることなく、それを行う簡単な方法があるかどうかはわかりません。しかし、私はこれを試していませんが、うまくいくはずです:

新しい日付属性を作成します。属性オプションの下部に、「製品リストでの並べ替えに使用」というオプションがあることがわかります。その場合は[はい]を選択します。次に、それを属性グループに追加します。次に、製品を追加するときに、現在の日付を選択するだけで、それを並べ替えに使用できるようになります。デフォルトを設定するには、[システム] >> [構成] >> [カタログ] >> [フロントエンド]に移動すると、[商品リストの並べ替え]オプションに属性が表示されます。

うまくいきますように。

1
Prattski

私はクラスを書き直すことでそれを行いました:

Mage_Catalog_Model_Category_Attribute_Source_Sortby

そして機能:

public function getAllOptions()
{
    if (is_null($this->_options)) {
        $this->_options = array(array(
            'label' => Mage::helper('catalog')->__('Best Value'),
            'value' => 'position'
        ));
        $this->_options = array(array(
            'label' => Mage::helper('catalog')->__('Created At'),
            'value' => 'created_at'
        ));
        foreach ($this->_getCatalogConfig()->getAttributesUsedForSortBy() as $attribute) {
            $this->_options[] = array(
                'label' => Mage::helper('catalog')->__($attribute['frontend_label']),
                'value' => $attribute['attribute_code']
            );
        }
    }
    return $this->_options;
}
0
ahe_borriglione

以下で試すことができます

_app/code/core/mage/catalog/model/resource/eav/mysql4/product/collection.php
_

public function addAttributeToSort($attribute, $dir='asc')」で

_$this->getSelect()->order("cat_index_position {$dir}");
_

これを追加

_$this->getSelect()->order("e.entity_id desc");
_
0
Yasar Kunduz

私は、トリックを実行し、インストールと使用が非常に簡単な無料の拡張機能を開発しました。それをダウンロードするために無料の人を倒した。

https://magento.mdnsolutions.com/extensions/mdn-sort-by-date.html

乾杯、

0
medina