Si vous souhaitez utiliser un attribut tel created_at
qu'il ne se trouve pas dans le produit admin-> stores -> (attribute), car les attributs définis dans admin ont le paramètre Sorting in Product Listing = Yes/No
, vous devez travailler avec ces deux fichiers:
\vendor\magento\module-catalog\Block\Product\ProductList\Toolbar.php
\vendor\magento\module-catalog\Model\Config.php
En Toolbar.php
vous pouvez voir
$this->_availableOrder = $this->_catalogConfig->getAttributeUsedForSortByArray();
il appelle à getAttributeUsedForSortByArray()
partir de ce Config.php
qui renvoie un tableau d'attributs disponibles pour trier la collection de listes.
Maintenant, vous devez ajouter votre created_at
attribut ici. Comment? Je l'ai fait avec un plugin
/**
* Add sort order option created_at to frontend
*/
public function afterGetAttributeUsedForSortByArray(
\Magento\Catalog\Model\Config $catalogConfig,
$options
) {
$options['created_at'] = __('New');
return $options;
}
Vous avez inséré created_at
les attributs disponibles pour trier, il ne vous reste plus qu'à créer votre collection personnalisée pour l'utiliser. Ici, je choisis de passer outre \vendor\magento\module-catalog\Block\Product\ProductList\Toolbar.php
au mien Toolbar.php
et de passer outresetCollection()
/**
* Set collection to pager
*
* @param \Magento\Framework\Data\Collection $collection
* @return $this
*/
public function setCollection($collection) {
$this->_collection = $collection;
$this->_collection->setCurPage($this->getCurrentPage());
// we need to set pagination only if passed value integer and more that 0
$limit = (int)$this->getLimit();
if ($limit) {
$this->_collection->setPageSize($limit);
}
// switch between sort order options
if ($this->getCurrentOrder()) {
// create custom query for created_at option
switch ($this->getCurrentOrder()) {
case 'created_at':
if ($this->getCurrentDirection() == 'desc') {
$this->_collection
->getSelect()
->order('e.created_at DESC');
} elseif ($this->getCurrentDirection() == 'asc') {
$this->_collection
->getSelect()
->order('e.created_at ASC');
}
break;
default:
$this->_collection->setOrder($this->getCurrentOrder(), $this->getCurrentDirection());
break;
}
}
// echo '<pre>';
// var_dump($this->getCurrentOrder());
// var_dump((string) $this->_collection->getSelect());
// die;
return $this;
}
C'est tout, pour moi ça marche comme un charme.
} elseif ( $this->getCurrentDirection() == 'asc' ) {
à} else {
.$block->addOrderToAvailableOrders('created_at', 'New')
dans votre modèle de tri.created_at
avec votre code d'attribut de prix personnaliséNous pouvons y parvenir en utilisant des plugins. Veuillez créer les fichiers suivants dans votre module.
app / code / Package / CustomToolbar / etc / di.xml
app / code / Package / CustomToolbar / Plugin / Model / Config.php
app / code / Package / CustomToolbar / Plugin / Product / ProductList / Toolbar.php
Cela fonctionne bien pour moi sans réécrire aucune classe Magento.
la source
Si vous souhaitez utiliser uniquement l' attribut Créer à , vous pouvez activer cet attribut dans le panneau d'administration dans les options de tri.
Exemple:
Ce code de Setup / UpgradeData.php , mais sera préférable d'utiliser InstallData.php à la place.
la source
Étape 1 : Vous devez d'abord créer registration.php
Nom du vendeur: Arun
Nom du module: NewSorting
Étape 2 : vous créez module.xml
Étape 3 : vous créez un plugin
Étape 4 : puis créez config.php
Étape 5 : remplacer le Toolbar.php ***
ça marche parfaitement
la source
Le chemin n'a pas besoin d'écrire des codes
Recherchez l'
created_at
attribut de produit dans la table DBeav_attribute
, définissez sa colonnefrontend_label
surCreated At
(la valeur par défaut est null).Recherchez l'
created_at
attribut de produit dans la table DBcatalog_eav_attribute
, définissez sa colonneused_for_sort_by
sur1
(la valeur par défaut est 0).Nettoyez le cache du site et cela fonctionne.
Exemple: changer la table par mysql
la source
attribute_id
.