Często mamy potrzebę umieścić ilość produktów w naszej kategorii na liście za pomocą modułu blockcategories (przedstawię opcję wszystkich produktów oraz tylko produktów aktywnych), znalezione na Link , troszkę zmodyfikowane przeze mnie.
No to zaczynamy , modyfikujemy plik blockcategories.php (uwaga z głównego folderu modułów , a nie podfolderu naszego szablonu). W okolicach linii 140 znajdujemy metodę:
public function getTree($resultParents, $resultIds, $maxDepth, $id_category = 1, $currentDepth = 0) { global $link; $children = array(); if (isset($resultParents[$id_category]) AND sizeof($resultParents[$id_category]) AND ($maxDepth == 0 OR $currentDepth < $maxDepth)) foreach ($resultParents[$id_category] as $subcat) $children[] = $this->getTree($resultParents, $resultIds, $maxDepth, $subcat['id_category'], $currentDepth + 1); if (!isset($resultIds[$id_category])) return false; return array('id' => $id_category, 'link' => $link->getCategoryLink($id_category, $resultIds[$id_category]['link_rewrite']), 'name' => $resultIds[$id_category]['name'], 'desc'=> $resultIds[$id_category]['description'], 'children' => $children); }
następnie należy dodać zmienną przechowującą liczbę produktów za pomocą następującego kodu:
$ProductsCount = 0; $ProductsCount = (int)Db::getInstance()->getValue('SELECT COUNT(*) FROM '._DB_PREFIX_.'category_product WHERE id_category = '. $id_category);
ten kod zwróci wszystkie produkty w danej kategorii, moja modyfikacja w przypadku wersji 1.5 wygląda następująco:
$ProductsCount = 0; $ProductsCount = (int)Db::getInstance()->getValue('SELECT COUNT(*) FROM '._DB_PREFIX_.'category_product INNER JOIN '._DB_PREFIX_.'product ON '._DB_PREFIX_.'category_product.id_product = '._DB_PREFIX_.'product.id_product WHERE id_category = '. $id_category.' AND '._DB_PREFIX_.'product.active =1');
Tak zbudowane polecenie do bazy zwróci jedynie ilość aktywnych produktów w kategorii. Następnie w tablicy return należy dodać naszą zmienna, więc będzie to wyglądać mniej więcej tak:
$return = array('id' => $id_category, 'link' => $this->context->link->getCategoryLink($id_category, $resultIds[$id_category]['link_rewrite']), 'name' => $resultIds[$id_category]['name'], 'desc'=> $resultIds[$id_category]['description'], 'children' => $children,'products' => $ProductsCount);
Metoda getTree po naszych modyfikacjach powinna wyglądać następująco:
public function getTree($resultParents, $resultIds, $maxDepth, $id_category = null, $currentDepth = 0) { if (is_null($id_category)) $id_category = $this->context->shop->getCategory(); $children = array(); if (isset($resultParents[$id_category]) && count($resultParents[$id_category]) && ($maxDepth == 0 || $currentDepth < $maxDepth)) foreach ($resultParents[$id_category] as $subcat) $children[] = $this->getTree($resultParents, $resultIds, $maxDepth, $subcat['id_category'], $currentDepth + 1); if (!isset($resultIds[$id_category])) return false; $ProductsCount = 0; $ProductsCount = (int)Db::getInstance()->getValue('SELECT COUNT(*) FROM '._DB_PREFIX_.'category_product WHERE id_category = '. $id_category); $return = array('id' => $id_category, 'link' => $this->context->link->getCategoryLink($id_category, $resultIds[$id_category]['link_rewrite']), 'name' => $resultIds[$id_category]['name'], 'desc'=> $resultIds[$id_category]['description'], 'children' => $children,'products' => $ProductsCount); return $return; }
Teraz mamy dostęp do naszej zmiennej z poziomu smarty
{$node.products}
Nasz przykładowy link będzie wyglądał tak:
<a href="{$node.link}" {if isset($currentCategoryId) && ($node.id == $currentCategoryId)}class="selected"{/if} title="{$node.desc|escape:html:'UTF-8'}">{$node.name|escape:html:'UTF-8'} ({$node.products})</a>
To wszystko 🙂
A czy można by prosić o przedstawienie jak takie pliki (i które) będę wyglądać ostatecznie?
Np. dokładnie w którym miejscu wstawić „następnie należy dodać zmienną przechowującą liczbę produktów za pomocą następującego kodu:”
W jakim pliku wstawić „{$node.products}” oraz link „{$node.name|escape:html:’UTF-8′} ({$node.products})„
W przypadku modułu blockcategories plik do modyfikacji znajduję się w:
themes/nazwa_szablonu/modules/blockcategories/category-tree-branch.tpl
w moim przypadku modyfikuję linijkę 27, która ostatecznie wygląda następująco:
(do wstawienia kodu proszę używać znacznika <'pre'>kod<''/pre'> – bez apostrofów)
Pozdrawiam, mam nadzieję, że pomogłem 🙂
A w którym miejscu wstawić ten fragment?
$ProductsCount = 0;
$ProductsCount = (int)Db::getInstance()->getValue(’SELECT COUNT(*) FROM ’._DB_PREFIX_.’category_product WHERE id_category = ’. $id_category);
Uzupełniłem tutorial , który powinien wszystko wyjaśnić( Metoda getTree…)
Dziękuję za pomoc. Użyłem modyfikacji na stronie http://www.xgamecenter.pl/magic i wszystko działa pięknie.
Pozdrawiam
Jeżeli chcemy zliczać jedynie aktywne produkty w kategoriach, to należy zmodyfikować trochę zapytanie SQL:
a jeżeli chcemy żeby nam sumowała kategoria nadrzędna produkty w kategoriach podrzędnych …. jak to zrobić ?
Nabiał (8)
masło (4)
mleko (4)