Magento - 按添加日期排序

时间:2010-02-10 14:37:19

标签: magento

如何在产品目录中添加Magento产品?这不是管理员的选项,因此猜测它需要在代码中完成。

感谢。

8 个答案:

答案 0 :(得分:42)

如果您可以(不应该)修改核心文件,则可以很容易地添加按日期排序选项。只需修改 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;
}

如果您不修改核心文件,那就不那么容易了。在这种情况下,您必须创建这一堆文件:

应用的/ etc /模块/ 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>

应用/代码/本地/#1 /目录的/ etc / config.xml中

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

应用/代码/本地/#1 /目录/型号/ 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;
    }
}

提示:采取干净的方式,从长远来看会付出代价。

答案 1 :(得分:13)

将此代码放入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>

答案 2 :(得分:12)

我通过将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'进行排序。

答案 3 :(得分:11)

喜欢这个

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

答案 4 :(得分:2)

Yust for update(适用于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);
}

并在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作为默认排序 设置

答案 5 :(得分:1)

我不确定是否有一种简单的方法可以做到这一点,而无需深入研究核心代码。但是,我没有试过这个,但它似乎应该有效:

创建一个新的Date属性。您将看到属性选项底部有一个名为“用于在产品列表中排序”的选项。选择是。然后将其添加到属性组。然后,当您添加产品时,只需选择当前日期,您就可以使用它进行排序。要设置默认值,请进入系统&gt;&gt;配置&gt;&gt;目录&gt;&gt;前端,您将在“产品列表排序依据”选项中看到您的属性。

希望能帮到你。

答案 6 :(得分:0)

您可以尝试以下

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");

答案 7 :(得分:0)

我是通过改写课程来完成的:

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