Sembunyikan kategori tanpa produk aktif

22

Apakah ada cara untuk menyembunyikan kategori yang tidak memiliki produk aktif? Atau, bahkan lebih baik, hanya menampilkan kategori yang memiliki produk dan stok aktif .

BenV
sumber
Pertanyaannya adalah apakah ini ide yang bagus. Pengguna bingung ketika mereka mengubah menu.
MiMo

Jawaban:

11

Cara termudah untuk melakukan ini adalah dengan hanya menulis ulang Mage_Catalog_Block_Navigationblok:

=> 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.

mpaepper
sumber
Apakah mungkin untuk memasukkan ini ke dalam ekstensi yang dapat dijatuhkan ke folder lokal? Khawatir tentang kode yang ditimpa dalam pembaruan Magento di masa depan.
MagentoMac
10

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.

Sergei Guk
sumber
Ini terlihat bagus, tetapi karena alasan apa pun tidak berfungsi di toko kami ... ada ide bagaimana men-debug? Tidak menerima pesan kesalahan apa pun. Ikuti instruksi ke tee, tetapi tidak ada perubahan di frontend. Sudah menonaktifkan, kemudian mengaktifkan kembali kompiler, dan membersihkan cache, dll.
MagentoMac
4

Jika Anda hanya ingin menyembunyikannya di navigasi katalog Anda bisa menambahkan kondisi if di templat untuk memeriksa jumlah produk dalam kategori itu.

Tobias
sumber
4

Mungkin ini akan membantu juga.

Pergi ke backend dari toko web Anda.

Kemudian untuk Catalog > Category > Manage Category, pilih kategori Anda, dan pilih Display settingstab.

Label Display Modedapat diatur ke

Show static block only.

Julian
sumber
4

Untuk menyembunyikan kategori kosong dari menu Atas, lakukan hal berikut:

Buka app/code/core/Mage/Catalog/BlockFolder dan salin Navigation.php.

Timpa Navigation.phpdalam paket lokal Anda. Buka Navigation.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;
    }
}
Henry Roger
sumber
Di mana dalam file itu?
MarkE
3

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;
}
Torrence Blanche
sumber
2

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/

Denis Óbukhov
sumber
2

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.

Mufaddal
sumber