Comment puis-je faire trier les produits Magento dans le catalogue par la date à laquelle ils ont été ajoutés? Ce n’est pas une option de l’administrateur, il faut donc deviner quelque chose dans le code quelque part.
Merci.
Il est assez facile d'ajouter une option de tri par date si vous êtes prêt (vous ne devriez pas l'être) avec la modification de fichiers de base. Modifiez simplement le fichier app/code/core/Mage/Catalogue/Model/Config.php comme dans l'exemple ci-dessous:
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;
}
Ce n'est pas si facile, si vous n'êtes pas en train de modifier des fichiers core. Dans ce cas, vous devez créer ce groupe de fichiers:
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/Catalogue/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/Catalogue/Modèle/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;
}
}
CONSEIL: Optez pour une méthode propre, cela vous rapportera à long terme.
Placez ce code dans votre fichier local.xml sans qu'il soit nécessaire de remplacer les fichiers de base de Magento.
Si vous remplacez des fichiers de base de Magento lors d'une future mise à niveau, un problème surviendra
<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>
J'ai résolu ce problème en copiant app/code/core/Mage/Catalogue/Block/Product/List.php dans app/code/local et en ajoutant du code de tri à la fin de sa méthode _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;
Vous pouvez utiliser 'e.entity_id desc'
ou 'e.created_at desc'
pour trier.
Comme ça
$_newest_productCollection = Mage::getResourceModel('reports/product_collection')
->addAttributeToSelect('*')
->addAttributeToFilter('visibility', $visibility)
->setOrder('created_at', 'desc')
$_newest_productCollection->load();
Yust for update (fonctionne avec Mage 1.7.0.2): Dans un script d'installation d'un propre module:
$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);
}
et dans le descripteur de mise en page 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>
Ensuite, vous pouvez sélectionner created_at comme tri par défaut dans la configuration du système ou dans les paramètres de l’affichage de la catégorie .
Je ne suis pas sûr qu'il existe un moyen facile de le faire, sans fouiller dans le code principal. Cependant, je n'ai pas essayé cela, mais il semble que cela devrait fonctionner:
Créez un nouvel attribut Date. Vous verrez qu'il existe une option au bas des options d'attribut intitulée "Utilisé pour le tri dans la liste de produits". Sélectionnez Oui pour cela. Puis ajoutez-le à votre groupe d'attributs. Ensuite, lorsque vous ajoutez un produit, sélectionnez simplement la date du jour et vous devriez pouvoir l'utiliser pour le tri. Pour définir la valeur par défaut, accédez à Système >> Configuration >> Catalogue >> Frontend et votre attribut apparaît dans l'option "Tri de la liste des produits par".
J'espère que ça marche pour vous.
Je l'ai fait en réécrivant le cours:
Mage_Catalog_Model_Category_Attribute_Source_Sortby
et fonction:
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;
}
Vous pouvez essayer ci-dessous
app/code/core/mage/catalog/model/resource/eav/mysql4/product/collection.php
dans "public function addAttributeToSort($attribute, $dir='asc')
"
après
$this->getSelect()->order("cat_index_position {$dir}");
ajoute ça
$this->getSelect()->order("e.entity_id desc");
J'ai développé une extension gratuite qui fait l'affaire et qui est assez facile à installer et à utiliser. Tombez les gars libres pour le télécharger.
https://magento.mdnsolutions.com/extensions/mdn-sort-by-date.html
À votre santé,