Jawaban:
Cara termudah untuk melakukan ini adalah dengan hanya menulis ulang Mage_Catalog_Block_Navigation
blok:
=> Dalam metode yang _renderCategoryMenuItemHtml()
Anda ingin mengganti loop
foreach ($children as $child) {
if ($child->getIsActive()) {
$activeChildren[] = $child;
}
}
=> dengan ini:
foreach ($children as $child) {
if ($child->getIsActive() && $this->_hasProducts($child->entity_id)) {
$activeChildren[] = $child;
}
}
=> dan juga dalam metode renderCategoriesMenuHtml()
ganti kode
foreach ($this->getStoreCategories() as $child) {
if ($child->getIsActive()) {
$activeCategories[] = $child;
}
}
=> dengan ini:
foreach ($this->getStoreCategories() as $child) {
if ($child->getIsActive() && $this->_hasProducts($child->entity_id)) {
$activeCategories[] = $child;
}
}
=> Akhirnya tambahkan metode yang baru saja kami gunakan dalam kode kami:
protected function _hasProducts($category_id) {
$products = Mage::getModel('catalog/category')->load($category_id)
->getProductCollection()
->addAttributeToSelect('entity_id')
->addAttributeToFilter('status', 1)
->addAttributeToFilter('visibility', 4);
return ( $products->count() > 0 ) ? true : false;
}
Ingatlah bahwa metode ini memeriksa setiap kategori secara individual dengan menggunakan katalog / kategori model. Jadi, jika Anda memiliki banyak kategori, Anda mungkin ingin menulis ulang kode agar tidak mengalami masalah kinerja. Di toko yang lebih kecil yang kami jalankan, ini berfungsi dengan baik.
Tidak ada fitur bawaan untuk menyembunyikan kategori kosong (tetapi Anda dapat secara manual memilih Aktif = Tidak untuk setiap kategori di admin area-> katalog-> kelola kategori)
Berikut ini tautan pada posting bagus dari blog Josh Prattski , di mana ia menulis langkah demi langkah panduan tentang cara membuat ekstensi untuk tujuan ini.
Untuk menyembunyikan kategori kosong dari menu Atas, lakukan hal berikut:
Buka
app/code/core/Mage/Catalog/Block
Folder dan salinNavigation.php
.Timpa
Navigation.php
dalam paket lokal Anda. BukaNavigation.php
paket Anda dan rekatkan kode berikut dalam file ini:
if ($category->getIsActive()) {
$cat = Mage::getModel('catalog/category')->load($category->getId());
$products = Mage::getResourceModel('catalog/product_collection')->addCategoryFilter($cat);
Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($products);
Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($products);
Mage::getSingleton('cataloginventory/stock')->addInStockFilterToCollection($products);
if (count($products) == 0) {
return;
}
}
Apa yang berhasil bagi saya adalah membuat pohon kategori templat dan mengimplementasikan fungsi kondisi yang membuat pohon kategori:
foreach ($children as $child)
{
if ($child->getIsActive() && $this->_hasProducts($child->entity_id))
{
$activeChildren[] = $child;
}
}
function _hasProducts:
protected function _hasProducts($category_id) {
$products = Mage::getModel('catalog/category')->load($category_id)
->getProductCollection()
->addAttributeToSelect('entity_id')
->addAttributeToFilter('status', 1)
->addAttributeToFilter('visibility', 4);
return ( $products->count() > 0 ) ? true : false;
}
Anda dapat menjalankan sql berikut untuk menonaktifkan semua kategori tanpa produk.
UPDATE `catalog_category_entity_int` AS `status`
INNER JOIN `eav_attribute` AS `attr` ON `attr`.`attribute_code` = 'is_active'
AND `attr`.`entity_type_id` = 3
AND `status`.`attribute_id` = `attr`.`attribute_id`
SET `status`.`value` = IF((SELECT COUNT(`index`.`product_id`)
FROM `catalog_category_product_index` AS `index`
WHERE `index`.`category_id` = `status`.`entity_id` GROUP BY `index`.`category_id`) > 0, 1, 0)
WHERE `status`.`store_id` = 0
Lebih detail Anda dapat menemukan di sini http://quicktips.ru/all/hide-all-categories-without-products-and-show-categories-with-pr/
apa yang saya lakukan untuk menyembunyikan kategori kosong adalah menulis ulang Mage_Catalog_Model_Resource_Category_Tree
load()
fungsi. Saya sudah bergabung dengan koleksi produk dengan koleksi kategori seperti di bawah ini.
$collection = Mage::getResourceModel('catalog/product_collection');
Mage::getSingleton('cataloginventory/stock')->addInStockFilterToCollection($collection);
Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($collection);
$collection->getSelect()->join(
array('product_category' => Mage::getSingleton('core/resource')->getTableName('catalog/category_product_index')),
'product_category.product_id = e.entity_id',
array('')
);
$collection->getSelect()->where('product_category.category_id = '.$this->_table.'.entity_id');
$select->columns(array('product_count' => $collection->getSelectCountSql()));
tambahkan kode $arrNodes = $this->_conn->fetchAll($select);
ini sebelum baris ini.
Dan bungkus kode ini dengan kondisi ini, kelas ini dipanggil dari model frontend dan backend juga
if(!Mage::getSingleton('admin/session')->isLoggedIn())
Saya telah menambahkan product_count bidang tambahan yang berisi jumlah produk aktif aktual.
Saya menggunakan modul pihak ke-3 untuk menampilkan kategori pada menu paling atas dan saya telah menetapkan kondisi berdasarkan jumlah produk ketika menu diberikan.