Dodanie liczby aktywnych produktów w kategorii obok nazwy w blockcategories – Prestashop

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 🙂

7 KOMENTARZE

  1. 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:

    {$node.name|escape:'htmlall':'UTF-8'} |{$node.products}| 

    (do wstawienia kodu proszę używać znacznika <'pre'>kod<''/pre'> – bez apostrofów)
    Pozdrawiam, mam nadzieję, że pomogłem 🙂

  2. 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);

  3. Jeżeli chcemy zliczać jedynie aktywne produkty w kategoriach, to należy zmodyfikować trochę zapytanie SQL:

    $ProductsCount = (int)Db::getInstance()->getValue('
    	SELECT COUNT(*) 
    	FROM '._DB_PREFIX_.'category_product c
    	INNER JOIN '._DB_PREFIX_.'product p ON (c.`id_product` = p.`id_product`)    
    	WHERE c.`id_category` = '. $id_category .' AND p.`active` = 1;'
    	);
    
  4. 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)

ZOSTAW ODPOWIEDŹ

Please enter your comment!
Please enter your name here

Loading Facebook Comments ...