Se você deseja usar um atributo como created_at
esse, ele não está em admin-> stores -> (attribute) product, porque os atributos definidos em admin têm a configuração Sorting in Product Listing = Yes/No
, você deve trabalhar com esses dois arquivos:
\vendor\magento\module-catalog\Block\Product\ProductList\Toolbar.php
\vendor\magento\module-catalog\Model\Config.php
Em Toolbar.php
que você pode ver
$this->_availableOrder = $this->_catalogConfig->getAttributeUsedForSortByArray();
chama a getAttributeUsedForSortByArray()
partir Config.php
desse retorno da matriz de atributos disponíveis para classificar a coleção de listagens.
Agora, você deve adicionar seu created_at
atributo aqui. Quão? Eu fiz isso com um plugin
/**
* Add sort order option created_at to frontend
*/
public function afterGetAttributeUsedForSortByArray(
\Magento\Catalog\Model\Config $catalogConfig,
$options
) {
$options['created_at'] = __('New');
return $options;
}
Você inseriu created_at
os atributos disponíveis para classificação, agora você só precisa criar sua coleção personalizada para usá-la. Aqui eu escolho substituir \vendor\magento\module-catalog\Block\Product\ProductList\Toolbar.php
pelo meu Toolbar.php
e substituirsetCollection()
/**
* 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;
}
Isso é tudo, para mim funciona como um encanto.
} elseif ( $this->getCurrentDirection() == 'asc' ) {
para} else {
.$block->addOrderToAvailableOrders('created_at', 'New')
no seu modelo de classificador.created_at
com o seu código personalizado atributo preçoPodemos conseguir isso usando Plugins. Por favor, crie os seguintes arquivos no seu 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
Isso está funcionando bem para mim sem reescrever nenhuma classe Magento.
fonte
Se você deseja usar apenas o atributo Criar em , é possível ativar esse atributo no painel de administração nas opções de classificação.
Exemplo:
Este código de Setup / UpgradeData.php , mas será melhor usar o InstallData.php .
fonte
Etapa 1 : primeiro você deve criar registration.php
Nome do fornecedor: Arun
Nome do módulo: NewSorting
Etapa 2 : você cria module.xml
Etapa 3 : você cria o plug-in
Etapa 4 : depois crie o config.php
Etapa 5 : Substitua o Toolbar.php ***
é funcionar perfeitamente
fonte
O caminho não precisa escrever códigos
Localize o
created_at
atributo do produto na tabela DBeav_attribute
, defina sua colunafrontend_label
comoCreated At
(o padrão é nulo).Localize o
created_at
atributo do produto na tabela DBcatalog_eav_attribute
, defina sua colunaused_for_sort_by
como1
(o padrão é 0).Limpe o cache do site e ele está funcionando.
Exemplo: alterar tabela pelo mysql
fonte
attribute_id
.