Press "Enter" to skip to content

PrestaShop 1.7 – drzewo kategorii – wyświetlanie ile produktów znajduje się w każdej kategorii i podkategorii [AKTUALIZACJA]

Admin 3

Co powoduje ta modyfikacja?

Jest to dość użyteczne rozwiązanie, szczególnie gdy w sklepie mamy dużo produktów w wielu kategoriach. Po prostu prezentujemy na drzewie kategorii (obok nazwy kategorii) ile produktów się w niej znajduje.

Już poruszaliśmy ten temat dla starszej wersji PrestaShop:

Presta Shop – wyświetlanie liczby produktów w danej kategorii na drzewku kategorii – Presta Shop 1.6

Dziś zaprezentujemy co należy zmienić aby zadziałało to w werji PrestaShop 1.7.

Wersja: modyfikacja zadziała w wersji PrestaShop 1.7.8.2 (+starszych 1.7)
Szablon: funkcjonuje to w dowolnym szablonie.

Przykładowy efekt działania przed i po dodaniu modyfikacji:

Wygląd drzewka kategorii po wprowadzeniu naszych modyfikacji

Czyli dodatkowo zaznaczymy wybraną kategorię. Tutaj na czerwono, ale oczwywiście to tylko przykład. Ponadto kategorie, które zawierają w sobie podkategorie – wyświetlają sumę wszystkich produktów w głąb 🙂

Zmiana ustawienia modułu.

Na początek musimy wyświetlać w module z drzewkiem kategorii całe drzewo (będzie to można potem zmodyfikować, ale tak lepiej to wygląda w celach prezentacyjnych).

Otwórz moduł:

Moduły -> szukaj -> Łącza drzewa kategorii (nazwa kodowa: ps_categorytree)

i zaznacz w nim wyświetlanie kategorii głównej:

Zmiana ustawień modułu

Modyfikacja plików.

Otwórz plik:

modules/ps_categorytree/ps_categorytree.php

W funkcji:

public function getTree()

Pod kodem:

if (isset($resultIds[$id_category])) {
    $link = $this->context->link->getCategoryLink($id_category, $resultIds[$id_category]['link_rewrite']);
    $name = $resultIds[$id_category]['name'];
    $desc = $resultIds[$id_category]['description'];
} else {
    $link = $name = $desc = '';
}

Wklej kod (jeżeli ma zliczać produkty także nieaktywne):

$sql = 'SELECT * FROM '._DB_PREFIX_.'category_product cp
WHERE cp.id_category = '.$id_category;
$result = Db::getInstance()->executeS($sql);

if ((Tools::getValue('id_product') || Tools::getValue('id_category')) && isset($this->context->cookie->last_visited_category) && $this->context->cookie->last_visited_category)
{
    $category = new Category($this->context->cookie->last_visited_category, $this->context->language->id);
    if (Validate::isLoadedObject($category))
        $this->smarty->assign(array('currentCategory' => $category, 'currentCategoryId' => $category->id));
}

Wklej kod (jeżeli ma zliczać tylko produkty aktywne):

$sql = 'SELECT *
        FROM '._DB_PREFIX_.'category_product
        LEFT JOIN '._DB_PREFIX_.'product
        ON '._DB_PREFIX_.'category_product.id_product = '._DB_PREFIX_.'product.id_product
        WHERE '._DB_PREFIX_.'category_product.id_category = '.$id_category.'
        AND
        '._DB_PREFIX_.'product.active = 1';
        
        
        $result = Db::getInstance()->executeS($sql);
        
        if ((Tools::getValue('id_product') || Tools::getValue('id_category')) && isset($this->context->cookie->last_visited_category) && $this->context->cookie->last_visited_category)
        {
            $category = new Category($this->context->cookie->last_visited_category, $this->context->language->id);
            if (Validate::isLoadedObject($category))
                $this->smarty->assign(array('currentCategory' => $category, 'currentCategoryId' => $category->id));
        }

W tym samym pliku PHP i w tej samej funkcji getTree() zamień kod:

return [
    'id' => $id_category,
    'link' => $link,
    'name' => $name,
    'desc' => $desc,
    'children' => $children,
];

Na:

return [
    'id' => $id_category,
    'link' => $link,
    'name' => $name,
    'desc' => $desc,
    'children' => $children,
    'products' => count($result)
];

Czyli po prostu dodaj kolejny element: ’products’ => count($result) do tej tablicy.

Na końcu pliku:

themes/{SZABLON}/assets/css/theme.css

Wklej:

.activecategory {
    color: red!important;
    font-weight: bold;
}

Oczywiście, jak napisano wyżej możesz inaczej ostylować wybraną kategorię. Zaznaczenie boldem i w czerwonym kolorze – to tylko przykład.

Na końcu pliku:

themes/{SZABLON}/assets/js/theme.js

Wklej:

$(document).ready(function () {
    $('.activecategory').parent().parent().parent().parent().find('a').eq(0).addClass('activecategory');
});

W pliku:

themes/{SZABLON}/modules/ps_categorytree/views/templates/hook/ps_categorytree.tpl

Zamień kod:

<a href="{$node.link}">{$node.name}</a>

Na:

<a class="{if isset($currentCategoryId) && $node.id == $currentCategoryId}activecategory{/if}" href="{$node.link}">{$node.name} ({$node.products})</a>

Następnie zamień kod:

<a class="category-sub-link" href="{$node.link}">{$node.name}</a>

Na:

<a class="{if isset($currentCategoryId) && $node.id == $currentCategoryId}activecategory{/if}" class="category-sub-link" href="{$node.link}">{$node.name} ({$node.products})</a>

Gotowe 🙂 Po wyczyszczeniu cache w dziale:

Zaawansowane -> Wydajność

Modyfikacja powinna być już widoczna. Powodzenia!

grafika:pexels.com

  1. Janusz Janusz

    A jak mogę ukryć wyświetlanie ilości w kategorii nadrzędnej (teraz pokazuje mi (0) a w podkategoriach mam już ilości (czy można zrobić aby pokazywało ilości wszystkich podkategorii?)

    • Admin Admin

      Spróbuj @Janusz zastosować odp regułę CSS aby to ukryć

  2. Rado Rado

    Ja nie mam w ostatnim pliku: themes/{SZABLON}/modules/ps_categorytree/views/templates/hook/ps_categorytree.tpl

    kodu:

    {$node.name}

    żeby go podmienić. Wersja 1.7.8.5.
    Nie wyświetla mi ilości produktów.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.

Zobacz także !
Jak w PrestaShop umieścić edywalną informację na wszystkich produktach na…