Si desea usar un atributo como created_at
ese no está en admin-> stores -> (attribute) product, porque los atributos definidos en admin tienen la configuración Sorting in Product Listing = Yes/No
, debe trabajar con estos dos archivos:
\vendor\magento\module-catalog\Block\Product\ProductList\Toolbar.php
\vendor\magento\module-catalog\Model\Config.php
En Toolbar.php
puedes ver
$this->_availableOrder = $this->_catalogConfig->getAttributeUsedForSortByArray();
llama getAttributeUsedForSortByArray()
desde Config.php
que devuelve una matriz de atributos disponibles para ordenar la colección de listados.
Ahora, debe agregar su created_at
atributo aquí. ¿Cómo? Lo hice con 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;
}
Insertó created_at
los atributos disponibles para ordenar, ahora solo tiene que construir su colección personalizada para usarla. Aquí elijo anular \vendor\magento\module-catalog\Block\Product\ProductList\Toolbar.php
con el mío Toolbar.php
y anularsetCollection()
/**
* 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;
}
Eso es todo, para mí funciona de maravilla.
} elseif ( $this->getCurrentDirection() == 'asc' ) {
a} else {
.$block->addOrderToAvailableOrders('created_at', 'New')
en su plantilla de clasificación.created_at
con su código de atributo de precio personalizadoPodemos lograrlo usando Plugins. Cree los siguientes archivos en su módulo.
app / code / Package / CustomToolbar / etc / di.xml
app / code / Package / CustomToolbar / Plugin / Model / Config.php
app / code / Package / CustomToolbar / Plugin / Product / ProductList / Toolbar.php
Esto está funcionando bien para mí sin reescribir ninguna clase de Magento.
fuente
Si desea utilizar solo el atributo Crear en , puede activar este atributo en el panel de administración en las opciones de clasificación.
Ejemplo:
Este código de Setup / UpgradeData.php , pero será mejor usar InstallData.php en su lugar.
fuente
Paso 1 : Primero debes crear registro.php
Nombre del vendedor: Arun
Nombre del módulo: NewSorting
Paso 2 : crea module.xml
Paso 3 : crea un complemento
Paso 4 : luego crea config.php
Paso 5 : anula la barra de herramientas.php ***
es un trabajo perfecto
fuente
El camino no necesita escribir códigos
Busque el
created_at
atributo del producto en la tabla DBeav_attribute
, establezca su columnafrontend_label
enCreated At
(el valor predeterminado es nulo).Encuentre el
created_at
atributo del producto en la tabla DBcatalog_eav_attribute
, establezca su columnaused_for_sort_by
en1
(el valor predeterminado es 0).Limpie el caché del sitio y está funcionando.
Ejemplo: cambiar tabla por mysql
fuente
attribute_id
.