Wenn Sie ein Attribut verwenden möchten, created_at
das sich nicht in admin-> stores -> (attribute) product befindet, da in admin definierte Attribute die Einstellung haben Sorting in Product Listing = Yes/No
, müssen Sie mit diesen beiden Dateien arbeiten:
\vendor\magento\module-catalog\Block\Product\ProductList\Toolbar.php
\vendor\magento\module-catalog\Model\Config.php
In können Toolbar.php
Sie sehen
$this->_availableOrder = $this->_catalogConfig->getAttributeUsedForSortByArray();
es ruft getAttributeUsedForSortByArray()
von Config.php
diesem Array von verfügbaren Attributen zum Sortieren der Auflistungssammlung auf.
Jetzt müssen Sie hier Ihr created_at
Attribut hinzufügen . Wie? Ich habe es mit einem Plugin gemacht
/**
* Add sort order option created_at to frontend
*/
public function afterGetAttributeUsedForSortByArray(
\Magento\Catalog\Model\Config $catalogConfig,
$options
) {
$options['created_at'] = __('New');
return $options;
}
Sie haben created_at
in die verfügbaren Attribute zum Sortieren eingefügt. Jetzt müssen Sie nur noch Ihre benutzerdefinierte Sammlung erstellen, um sie zu verwenden. Hier entscheide ich mich \vendor\magento\module-catalog\Block\Product\ProductList\Toolbar.php
mit meinem zu überschreibenToolbar.php
und zu überschreibensetCollection()
/**
* 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;
}
Das ist alles, für mich wirkt es wie ein Zauber.
} elseif ( $this->getCurrentDirection() == 'asc' ) {
zu} else {
.$block->addOrderToAvailableOrders('created_at', 'New')
in Ihrer Sortiervorlage verwenden.created_at
mit Ihrem benutzerdefiniertenWir können es erreichen, indem wir Plugins verwenden. Bitte erstellen Sie folgende Dateien in Ihrem Modul.
app / code / Package / CustomToolbar / etc / di.xml
app / code / Package / CustomToolbar / Plugin / Model / Config.php
app / code / Package / CustomToolbar / Plugin / Product / ProductList / Toolbar.php
Dies funktioniert gut für mich, ohne eine Magento-Klasse neu zu schreiben.
quelle
Wenn Sie nur das Attribut " Erstellen um" verwenden möchten , können Sie dieses Attribut im Verwaltungsbereich in den Sortieroptionen aktivieren.
Beispiel:
Dieser Code von Setup / UpgradeData.php , es ist jedoch besser, stattdessen InstallData.php zu verwenden.
quelle
Schritt 1 : Zuerst solltest du registration.php erstellen
Herstellername: Arun
Modulname: NewSorting
Schritt 2 : Sie erstellen die Datei module.xml
Schritt 3 : Sie erstellen ein Plugin
Schritt 4 : Dann erstelle config.php
Schritt 5 : Überschreiben Sie die Toolbar.php ***
es funktioniert perfekt
quelle
Der Weg braucht keine Schreibcodes
Suchen Sie das
created_at
Produktattribut in der DB-Tabelleeav_attribute
und setzen Sie seine Spaltefrontend_label
aufCreated At
(Standard ist null).Suchen Sie das
created_at
Produktattribut in der DB-Tabellecatalog_eav_attribute
und setzen Sie die Spalteused_for_sort_by
auf1
(Standard ist 0).Bereinigen Sie den Site-Cache und es funktioniert.
Beispiel: change table von mysql
quelle