Если вы хотите использовать такой атрибут created_at
, которого нет в admin-> stores -> (attribute) product, потому что атрибуты, определенные в admin, имеют настройку Sorting in Product Listing = Yes/No
, вы должны работать с этими двумя файлами:
\vendor\magento\module-catalog\Block\Product\ProductList\Toolbar.php
\vendor\magento\module-catalog\Model\Config.php
В Toolbar.php
вы можете увидеть
$this->_availableOrder = $this->_catalogConfig->getAttributeUsedForSortByArray();
он вызывает getAttributeUsedForSortByArray()
из Config.php
этого возвращает массив доступных атрибутов для сортировки списка коллекции.
Теперь вы должны добавить свой created_at
атрибут здесь. Как? Я сделал это с плагином
/**
* Add sort order option created_at to frontend
*/
public function afterGetAttributeUsedForSortByArray(
\Magento\Catalog\Model\Config $catalogConfig,
$options
) {
$options['created_at'] = __('New');
return $options;
}
Вы вставили created_at
в доступные атрибуты для сортировки, теперь вам нужно только создать свою собственную коллекцию, чтобы использовать ее. Здесь я выбираю переопределить \vendor\magento\module-catalog\Block\Product\ProductList\Toolbar.php
мой Toolbar.php
и переопределитьsetCollection()
/**
* 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;
}
Вот и все, для меня работает как шарм.
} elseif ( $this->getCurrentDirection() == 'asc' ) {
на} else {
.$block->addOrderToAvailableOrders('created_at', 'New')
в шаблоне сортировщика.created_at
с помощью своего пользовательского кода атрибута ценыМы можем добиться этого с помощью плагинов. Пожалуйста, создайте следующие файлы в вашем модуле.
Приложение / код / пакет / CustomToolbar / и т.д. / di.xml
Приложение / код / пакет / CustomToolbar / Plugin / Модель / config.php
Приложение / код / пакет / CustomToolbar / Plugin / Продукт / ProductList / Toolbar.php
Это работает хорошо для меня без переписывания любого класса Magento.
источник
Если вы хотите использовать только атрибут « Создать при» , вы можете активировать этот атрибут в панели администратора в параметрах сортировки.
Пример:
Этот код из Setup / UpgradeData.php , но лучше будет использовать вместо него InstallData.php .
источник
Шаг 1 : Сначала вы должны создать registration.php
Название поставщика: Арун
Название модуля: NewSorting
Шаг 2 : Вы создаете module.xml
Шаг 3 : Вы создаете плагин
Шаг 4 : затем создайте config.php
Шаг 5 : переопределить Toolbar.php ***
это отлично работает
источник
Путь не нужно писать коды
Найдите
created_at
атрибут продукта в таблице БДeav_attribute
, установите для его столбцаfrontend_label
значениеCreated At
(по умолчанию - ноль).Найдите
created_at
атрибут продукта в таблице БДcatalog_eav_attribute
, установите его столбецused_for_sort_by
в1
( по умолчанию 0).Очистите кеш сайта и он работает.
Пример: изменить таблицу на MySQL
источник
attribute_id
.