Ukryj kategorie bez aktywnych produktów

22

Czy istnieje sposób na ukrycie kategorii, które nie mają aktywnych produktów? Lub, jeszcze lepiej, pokazują tylko kategorie, które mają aktywne produkty i zapasy.

BenV
źródło
Pytanie brzmi, czy to dobry pomysł. Użytkownicy są zdezorientowani, gdy zmieniają menu.
MiMo,

Odpowiedzi:

11

Najłatwiej to zrobić tylko przepisując Mage_Catalog_Block_Navigationblok:

=> W metodzie, _renderCategoryMenuItemHtml()którą chcesz zastąpić pętlę

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

=> z tym:

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

=> i podobnie w metodzie renderCategoriesMenuHtml()zamień kod

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

=> z tym:

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

=> Na koniec dodaj metodę, której właśnie używaliśmy w naszym kodzie:

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

Należy pamiętać, że metoda sprawdza każdą kategorię indywidualnie za pomocą modelu katalogu / kategorii. Jeśli masz wiele kategorii, możesz przepisać kod, aby nie napotkać problemów z wydajnością. W mniejszym sklepie, który prowadzimy, to działa dobrze.

mpaepper
źródło
Czy można umieścić to w rozszerzeniu, które można upuścić w folderze lokalnym? Martwisz się, że kod zostanie zastąpiony w przyszłych aktualizacjach Magento.
MagentoMac,
10

Nie ma wbudowanej funkcji ukrywania pustych kategorii (ale możesz ręcznie wybrać Jest aktywny = Nie dla każdej kategorii w obszarze administracyjnym-> katalog-> zarządzaj kategoriami)

Oto link do świetnego postu z bloga Josha Prattskiego , w którym napisał krok po kroku poradnik jak zrobić rozszerzenie w tym celu.

Siergiej Guk
źródło
Wygląda to dobrze, ale z jakiegokolwiek powodu nie działa w naszym sklepie ... jakieś pomysły na debugowanie? Brak komunikatów o błędach. Postępowałem zgodnie z instrukcjami na tee, ale bez zmian w interfejsie.
Wyłączyłem
4

Jeśli chcesz je tylko ukryć w nawigacji katalogu, możesz dodać warunek if do szablonu, aby sprawdzić ilość produktów w tej kategorii.

Tobiasz
źródło
4

Może to też pomogłoby.

Przejdź do zaplecza swojego sklepu internetowego.

Następnie Catalog > Category > Manage Categorywybierz kategorię i Display settingskartę.

Etykietę Display Modemożna ustawić na

Show static block only.

juliański
źródło
4

Aby ukryć pustą kategorię w górnym menu, wykonaj następujące czynności:

Przejdź do app/code/core/Mage/Catalog/Blockfolderu i skopiuj Navigation.php.

Zastąp Navigation.phpw pakiecie lokalnym. Otwórz Navigation.php swój pakiet i wklej następujący kod w tym pliku:

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
źródło
Gdzie w tym pliku?
MarkE
3

Dla mnie zadziałało utworzenie drzewa kategorii szablonów i zaimplementowanie funkcji warunku, która renderuje drzewo kategorii:

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
źródło
2

Możesz wykonać następujące polecenie SQL, aby wyłączyć wszystkie kategorie bez produktów.

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

Więcej informacji można znaleźć tutaj http://quicktips.ru/all/hide-all-categories-without-products-and-show-categories-with-pr/

Denis Óbukhov
źródło
2

To, co zrobiłem, aby ukryć puste kategorie, to przepisanie Mage_Catalog_Model_Resource_Category_Tree load()funkcji. Muszę połączyć kolekcję produktów z kolekcją kategorii jak poniżej.

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

dodaj ten kod wcześniej $arrNodes = $this->_conn->fetchAll($select); tym wierszem.

I zawiń ten kod w ten warunek, również w tej klasie wywoływanej z frontendu i modelu backendu

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

Dodałem dodatkowe pole liczba_produktu, które zawiera rzeczywistą liczbę aktywnych produktów.

Korzystam z zewnętrznego modułu do wyświetlania kategorii w górnym menu i ustawiam warunek na podstawie liczby produktów podczas wyświetlania menu.

Mufaddal
źródło