Jika Anda ingin menggunakan atribut seperti created_at
itu tidak ada di admin-> toko -> (atribut) produk, karena atribut yang didefinisikan dalam admin memiliki pengaturan Sorting in Product Listing = Yes/No
, Anda harus bekerja dengan dua file ini:
\vendor\magento\module-catalog\Block\Product\ProductList\Toolbar.php
\vendor\magento\module-catalog\Model\Config.php
Di dalam Toolbar.php
kamu bisa melihat
$this->_availableOrder = $this->_catalogConfig->getAttributeUsedForSortByArray();
itu panggilan getAttributeUsedForSortByArray()
dari Config.php
yang mengembalikan berbagai atribut yang tersedia untuk mengurutkan koleksi daftar.
Sekarang, Anda harus menambahkan created_at
atribut Anda di sini. Bagaimana? Saya melakukannya dengan sebuah plugin
/**
* Add sort order option created_at to frontend
*/
public function afterGetAttributeUsedForSortByArray(
\Magento\Catalog\Model\Config $catalogConfig,
$options
) {
$options['created_at'] = __('New');
return $options;
}
Anda memasukkan created_at
atribut yang tersedia untuk disortir, sekarang Anda hanya perlu membangun koleksi khusus untuk menggunakannya. Di sini saya memilih untuk menimpa \vendor\magento\module-catalog\Block\Product\ProductList\Toolbar.php
dengan milik saya Toolbar.php
dan menimpanyasetCollection()
/**
* 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;
}
Itu saja, bagi saya bekerja seperti pesona.
} elseif ( $this->getCurrentDirection() == 'asc' ) {
ke} else {
.$block->addOrderToAvailableOrders('created_at', 'New')
bawaan di templat penyortir Anda.created_at
dengan kode atribut harga khusus AndaKita dapat mencapainya dengan menggunakan Plugin. Silakan buat file berikut di modul Anda.
app / code / Package / CustomToolbar / etc / di.xml
app / code / Package / CustomToolbar / Plugin / Model / Config.php
app / kode / Paket / CustomToolbar / Plugin / Produk / ProductList / Toolbar.php
Ini bekerja dengan baik untuk saya tanpa menulis ulang kelas Magento.
sumber
Jika Anda ingin menggunakan atribut Create At saja , Anda dapat mengaktifkan atribut ini di panel admin dalam opsi penyortiran.
Contoh:
Kode ini dari Setup / UpgradeData.php , tetapi akan lebih baik menggunakan InstallData.php sebagai gantinya.
sumber
Langkah 1 : Pertama, Anda harus membuat registrasi.php
Nama penjual: Arun
Nama modul: NewSorting
Langkah 2 : Anda membuat module.xml
Langkah 3 : Anda membuat plugin
Langkah 4 : lalu buat config.php
Langkah 5 : Ganti Toolbar.php ***
ini bekerja dengan sempurna
sumber
Caranya tidak perlu menulis kode
Temukan
created_at
atribut produk dalam tabel DBeav_attribute
, setel kolomnyafrontend_label
keCreated At
(standarnya adalah nol).Temukan
created_at
atribut produk dalam tabel DBcatalog_eav_attribute
, setel kolomnyaused_for_sort_by
ke1
(standarnya adalah 0).Bersihkan cache situs dan berfungsi.
Contoh: ubah tabel dengan mysql
sumber
attribute_id
.