Jeśli chcesz użyć takiego atrybutu created_at
, nie ma go w admin-> sklepach -> (atrybutach), ponieważ atrybuty zdefiniowane w adminie mają ustawienie Sorting in Product Listing = Yes/No
, musisz pracować z tymi dwoma plikami:
\vendor\magento\module-catalog\Block\Product\ProductList\Toolbar.php
\vendor\magento\module-catalog\Model\Config.php
W Toolbar.php
widać
$this->_availableOrder = $this->_catalogConfig->getAttributeUsedForSortByArray();
wywołuje getAttributeUsedForSortByArray()
z Config.php
tego tablicę dostępnych atrybutów do sortowania kolekcji list.
Teraz musisz dodać created_at
tutaj swój atrybut. W jaki sposób? Zrobiłem to za pomocą wtyczki
/**
* Add sort order option created_at to frontend
*/
public function afterGetAttributeUsedForSortByArray(
\Magento\Catalog\Model\Config $catalogConfig,
$options
) {
$options['created_at'] = __('New');
return $options;
}
Wstawiłeś created_at
dostępne atrybuty do sortowania, teraz musisz tylko zbudować swoją własną kolekcję, aby z niej skorzystać. Tutaj wybieram zastąpienie \vendor\magento\module-catalog\Block\Product\ProductList\Toolbar.php
moim Toolbar.php
i zastąpieniesetCollection()
/**
* 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;
}
To wszystko, dla mnie działa jak urok.
} elseif ( $this->getCurrentDirection() == 'asc' ) {
na} else {
.$block->addOrderToAvailableOrders('created_at', 'New')
w szablonie sortowania.created_at
pomocą niestandardowego kodu atrybutu cenyMożemy to osiągnąć za pomocą wtyczek. Utwórz następujące pliki w swoim 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
Działa to dla mnie dobrze bez przepisywania klas Magento.
źródło
Jeśli chcesz użyć tylko atrybutu Utwórz w , możesz aktywować ten atrybut w panelu administracyjnym w opcjach sortowania.
Przykład:
Ten kod z Setup / UpgradeData.php , ale lepiej będzie użyć InstallData.php .
źródło
Krok 1 : Najpierw powinieneś utworzyć register.php
Nazwa dostawcy: Arun
Nazwa modułu: NewSorting
Krok 2 : Utwórz plik module.xml
Krok 3 : Tworzysz wtyczkę
Krok 4 : Następnie utwórz config.php
Krok 5 : Zastąp Toolbar.php ***
działa idealnie
źródło
Sposób nie wymaga pisania kodów
Znajdź
created_at
atrybut produktu w tabeli DBeav_attribute
, ustaw jego kolumnęfrontend_label
naCreated At
(wartość domyślna to null).Znajdź
created_at
atrybut produktu w tabeli DBcatalog_eav_attribute
, ustaw jego kolumnęused_for_sort_by
na1
(domyślnie 0).Wyczyść pamięć podręczną witryny i działa.
Przykład: zmień tabelę według mysql
źródło
attribute_id
.