Magento - сортировка по дате добавления - PullRequest
18 голосов
/ 10 февраля 2010

Как я могу сортировать продукты Magento в каталоге по дате их добавления? Это не вариант в админке, так что угадать это нужно где-то в коде.

Спасибо.

Ответы [ 8 ]

42 голосов
/ 26 августа 2011

Довольно просто добавить опцию сортировки по дате, если вы в порядке (не должны) с изменением основных файлов. Просто измените файл 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;
}

Это не так просто, если вы не хотите изменять файлы ядра. В этом случае вы должны создать эту группу файлов:

приложение / и т.д. / модули / 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>

Приложение / код / ​​местные / Stackoverflow / Каталог / и т.д. / config.xml

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

Приложение / код / ​​местные / Stackoverflow / Каталог / Модель / 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;
    }
}

СОВЕТ: Идите чистым путем, это окупится в долгосрочной перспективе.

13 голосов
/ 26 июля 2012

Поместите этот код в ваш 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>
12 голосов
/ 03 февраля 2012

Я решил эту проблему, скопировав 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' для сортировки.

11 голосов
/ 26 февраля 2010

Как это

$_newest_productCollection = Mage::getResourceModel('reports/product_collection')
->addAttributeToSelect('*')
->addAttributeToFilter('visibility', $visibility)
->setOrder('created_at', 'desc')
$_newest_productCollection->load();
2 голосов
/ 26 июля 2013

Юст для обновления (работает с Mage 1.7.0.2): в setupscript собственного модуля:

$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);
}

и в дескрипторе layout.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>

После этого вы можете выбрать create_at как сортировку по умолчанию в конфигурации системы или на дисплее категории Настройки

1 голос
/ 24 февраля 2010

Я не уверен, что есть простой способ сделать это, не копаясь в коде ядра. Тем не менее, я не пробовал это, но похоже, что это должно работать:

Создать новый атрибут даты. Вы увидите, что в нижней части опций атрибута есть опция, которая называется «Используется для сортировки в списке товаров». Выберите Да для этого. Затем и добавьте его в свою группу атрибутов. Затем, когда вы добавляете товар, просто выберите текущую дату, и вы сможете использовать ее для сортировки. Чтобы установить его по умолчанию, перейдите в Система >> Конфигурация >> Каталог >> Внешний интерфейс, и вы увидите свой атрибут в опции «Сортировка по списку продуктов».

Надеюсь, у вас получится.

0 голосов
/ 07 ноября 2014

Я сделал это, переписав класс:

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 голосов
/ 20 сентября 2011

Вы можете попробовать ниже

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");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...