Saya bekerja pada kisi-kisi produk tetapi pagination atau jumlah produknya tidak berfungsi (karena menampilkan jumlah yang salah). karena fungsi blok _preparecollection saya adalah seperti di bawah ini. Saya telah menambahkan kode filter kategori dalam koleksi jadi saya harus menggunakan klausa grup untuk mencegah kesalahan karena id yang sama sudah ada.
protected function _prepareCollection()
{
$store = $this->_getStore();
$collection = Mage::getModel('catalog/product')->getCollection()
->addAttributeToSelect('sku')
->addAttributeToSelect('name')
->addAttributeToSelect('attribute_set_id')
->addAttributeToSelect('type_id')
->joinField('category_id',
'catalog/category_product',
'category_id',
'product_id=entity_id',
null,
'left');
$collection->addAttributeToFilter('category_id', array('in' => array(4,10)))
->distinct(true);
$collection->getSelect()->group('e.entity_id');
if (Mage::helper('catalog')->isModuleEnabled('Mage_CatalogInventory')) {
$collection->joinField('qty',
'cataloginventory/stock_item',
'qty',
'product_id=entity_id',
'{{table}}.stock_id=1',
'left');
}
$collection->joinField('position',
'catalog/category_product',
'position',
'product_id=entity_id',
null,
'left');
$collection->joinField('websites',
'catalog/product_website',
'website_id',
'product_id=entity_id',
null,
'left');
if ($store->getId()) {
//$collection->setStoreId($store->getId());
$adminStore = Mage_Core_Model_App::ADMIN_STORE_ID;
$collection->addStoreFilter($store);
$collection->joinAttribute(
'name',
'catalog_product/name',
'entity_id',
null,
'inner',
$adminStore
);
$collection->joinAttribute(
'custom_name',
'catalog_product/name',
'entity_id',
null,
'inner',
$store->getId()
);
$collection->joinAttribute(
'status',
'catalog_product/status',
'entity_id',
null,
'inner',
$store->getId()
);
$collection->joinAttribute(
'visibility',
'catalog_product/visibility',
'entity_id',
null,
'inner',
$store->getId()
);
$collection->joinAttribute(
'price',
'catalog_product/price',
'entity_id',
null,
'left',
$store->getId()
);
}
else {
$collection->addAttributeToSelect('price');
$collection->joinAttribute('status', 'catalog_product/status', 'entity_id', null, 'inner');
$collection->joinAttribute('visibility', 'catalog_product/visibility', 'entity_id', null, 'inner');
}
$this->setCollection($collection);
parent::_prepareCollection();
$this->getCollection()->addWebsiteNamesToResult();
return $this;
}
Saya punya google dan mendapat jawaban dan menambahkannya ke lib/varian/data/collection/db.php
public function getSelectCountSql()
{
$this->_renderFilters();
$countSelect = clone $this->getSelect();
$countSelect->reset(Zend_Db_Select::ORDER);
$countSelect->reset(Zend_Db_Select::LIMIT_COUNT);
$countSelect->reset(Zend_Db_Select::LIMIT_OFFSET);
$countSelect->reset(Zend_Db_Select::COLUMNS);
if(count($this->getSelect()->getPart(Zend_Db_Select::GROUP)) > 0) {
$countSelect->reset(Zend_Db_Select::GROUP);
$countSelect->distinct(true);
$group = $this->getSelect()->getPart(Zend_Db_Select::GROUP);
$countSelect->columns("COUNT(DISTINCT ".implode(", ", $group).")");
} else {
$countSelect->columns('COUNT(*)');
}
return $countSelect;
}
Tapi tidak berhasil tolong bantu untuk menyelesaikan ini
magento-1.9
collection
collection-filtering
grid
Zaheerabbas
sumber
sumber
Mage_Adminhtml_Block_Widget_Grid
?Mage_Adminhtml_Block_Widget_Grid
Jawaban:
Koleksi dan Pemuatan Malas di Magento
Alasan pagination tidak berfungsi adalah karena bagaimana koleksi dihitung dan bagaimana lazy loading bekerja dengan koleksi.
Koleksi di Magento mengimplementasikan kelas
Countable
. Karena pemuatan koleksi yang malas di Magento, kapan pun metodecount()
ini dipanggil, data harus dimuat. Sebagai solusinya, koleksi menerapkan metode yang disebutgetSize()
. Ini akan mengkloning pernyataan SQL Anda, membungkusnyaCOUNT()
dan mengembalikan hasilnya. Ini memungkinkan koleksi untuk mendapatkan jumlah total tanpa memuat semua data. Ini memungkinkan hal-hal seperti filter ditambahkan pada menit terakhir.Ini adalah apa
Varien_Data_Collection_Db::getSize()
dan pasangannyagetSelectCountSql()
terlihat seperti:Pada dasarnya, itu menjatuhkan batas, kolom, pemesanan, dll dan meninggalkan filter. Kemudian ia menambahkan MySQL
COUNT()
ke kolom.Masalah
Biasanya, di satu meja, ini akan mengembalikan satu baris dengan jumlah total. Inilah sebabnya mengapa
getSize()
melakukanfetchOne()
terhadap query. Namun, saat melakukan hal-hal seperti tabel bergabung, bys grup, dan sejenisnya, Anda tidak akan mengembalikan satu baris, Anda akan kembali beberapa. Karena inilah Anda perlu mengubahgetSize()
metode dalam koleksi Anda.Solusinya
Seperti inilah seharusnya metode Anda sekarang:
Alih-alih
fetchOne()
, kami menjalankan fungsi PHP yangfetchAll()
dibungkuscount()
. Sekarang total Anda akan kembali dengan tepat.sumber
Solusi bagus Mungkin seseorang memiliki masalah yang sama seperti kita, jadi saya akan memposting solusi lain yang mungkin. Dalam kasus kami, kami memiliki koleksi, yang kadang-kadang termasuk grup dengan pernyataan dan kadang-kadang tidak, tergantung pada kotak di mana koleksi dimuat. Menggunakan solusi di atas, kami menemukan dua masalah:
Setelah men-debug beberapa saat kami menemukan, bahwa dalam kasus 1 bagian
mengembalikan array yang memiliki satu entri dengan nilai 0. Itulah sebabnya fungsi hitungan mengembalikan 1 meskipun tidak ada entri yang ditemukan.
Dalam kasus 2 bagian yang sama mengembalikan array dengan satu entri, yang nilainya adalah ukuran sebenarnya dari koleksi. Fungsi hitungan lagi mengembalikan 1 dan bukan nilai.
Mencari alternatif, kami menemukan, bahwa koleksi produk menggunakan penulisan ulang fungsi getSelectCountSql (). Kami mengadaptasi ini dan mengubahnya sedikit, yang berakhir dengan solusi ini:
Ini memecahkan dua masalah yang sudah saya sebutkan dan sejauh yang saya bisa lihat, itu juga berfungsi untuk kasus lain.
sumber