Aktif ürün içermeyen kategorileri gizle


22

Aktif ürünleri olmayan kategorileri gizlemenin bir yolu var mı? Veya daha da iyisi, yalnızca aktif ürünleri ve stokları olan kategorileri gösterir .


Soru, bunun iyi bir fikir olup olmadığıdır. Kullanıcılar menüyü değiştirdiklerinde karıştılar.
MiMo

Yanıtlar:


11

Bunu yapmanın en kolay yolu, yalnızca Mage_Catalog_Block_Navigationbloğu yeniden yazmaktır :

=> Döngü değiştirmek istediğiniz yöntemde_renderCategoryMenuItemHtml()

foreach ($children as $child) {
    if ($child->getIsActive()) {
        $activeChildren[] = $child;
    }
}

=> bununla:

    foreach ($children as $child) {
        if ($child->getIsActive() && $this->_hasProducts($child->entity_id)) {
            $activeChildren[] = $child;
        }
    }

=> ve benzer şekilde yöntemde renderCategoriesMenuHtml()kodu değiştirin

 foreach ($this->getStoreCategories() as $child) {
        if ($child->getIsActive()) {
            $activeCategories[] = $child;
        }
    }

=> bununla:

    foreach ($this->getStoreCategories() as $child) {
        if ($child->getIsActive() && $this->_hasProducts($child->entity_id)) {
            $activeCategories[] = $child;
        }
    }

=> Sonunda sadece kodumuzda kullandığımız yöntemi ekleyin:

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;
}

Katalog / kategori modelini kullanarak, yöntemin her kategoriyi ayrı ayrı kontrol ettiğini unutmayın. Bu nedenle, çok fazla kategoriniz varsa, performans sorunlarıyla karşılaşmamak için kodu yeniden yazmak isteyebilirsiniz. Daha küçük bir mağazada koşuyoruz, bu iyi çalışıyor.


Bunu, yerel klasöre bırakılabilen bir uzantıya sığdırmak mümkün mü? Gelecekteki Magento güncellemelerinde kodun üzerine yazıldığından endişeleniyor.
MagentoMac

10

Boş kategorileri gizlemek için yerleşik bir özellik yoktur (ancak el ile aktif seçeneğini seçebilirsiniz = Yönetici alanı-> katalog-> kategori kategorilerinde her kategori için Hayır)

İşte Josh Prattski'nin bloğundan çıkan ve bu amaçla nasıl genişletilebileceği konusunda adım adım ilerlemiş olduğu bir yazı.


Bu iyi görünüyor, ama hangi sebeple olursa olsun mağazamızda çalışmıyorsa ... nasıl hata ayıklayacağınıza dair bir fikriniz var mı? Hata mesajı alamıyorum. Bir tişörtün talimatlarını takip ettim ama ön uçta değişiklik yok. Zaten devre dışı bırakılmış, daha sonra derleyiciyi yeniden etkinleştirmiş ve önbelleği vb.
Temizledik

4

Bunları katalog navigasyonunda gizlemek istiyorsanız, o kategorideki ürünlerin miktarını kontrol etmek için şablonda bir if koşulu ekleyebilirsiniz.


4

Belki bu da yardımcı olur.

İnternet mağazanızın arka tarafına gidin.

Ardından Catalog > Category > Manage Category, kategorinizi seçin ve Display settingssekmeyi seçin .

Etiket Display Modeayarlanmış olabilir

Show static block only.


4

Boş bir kategoriyi Üst menüden gizlemek için aşağıdakileri yapın:

app/code/core/Mage/Catalog/BlockKlasöre git ve kopyala Navigation.php.

Navigation.phpYerel paketinizde geçersiz kılın . Navigation.php Paketinizi açın ve aşağıdaki kodu bu dosyaya yapıştırın:

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;
    }
}

Bu dosyanın neresinde?
MarkE,

3

Benim için işe yarayan şey, bir şablon kategori ağacı oluşturmak ve kategori ağacını oluşturan bir koşul işlevi uygulamaktır:

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;
}

2

Ürünler olmadan tüm kategorileri devre dışı bırakmak için aşağıdaki sql'yi çalıştırabilirsiniz.

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

Daha fazla bilgiyi burada bulabilirsiniz: http://quicktips.ru/all/hide-all-category-


2

boş kategorileri gizlemek için yaptığım, Mage_Catalog_Model_Resource_Category_Tree load()işlevi yeniden yazmaktır . Ürün koleksiyonuna aşağıdaki kategori koleksiyonuyla katıldım.

    $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()));

bu kodu $arrNodes = $this->_conn->fetchAll($select);bu satırdan önce ekleyin .

Ve bu koşulu bu koda sarın, bu sınıf ön uç ve arka uç modelinden çağrıldı.

  if(!Mage::getSingleton('admin/session')->isLoggedIn())

Gerçek aktif ürün sayısını içeren ekstra alan product_count'u ekledim.

Üst menüde kategoriyi görüntülemek için bir 3. parti modül kullanıyorum ve menü oluşturulduğunda ürün sayısına göre koşul koydum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.