W tym tutorialu przedstawimy jak dodać linka pokazującego wszystkie produkty na karcie danej kategorii. Tutorial jest przeznaczony do sklepu PrestaShop w wersji 1.5.
Pamiętaj proszę, że wszelkie zmiany w kodzie wykonujesz na własne ryzyko.
Pierwsze co należy zrobić to nadpisać metodę assignProductList w klasie CategoryController. W celu wykonania operacji stwórz nowy plik CategoryContoller.php w katalogu: override/controllers/front. Jeśli plik już istnieje to należy go otworzyć do edycji. Jeśli poniższa klasa nie istnieje, to należy ją dodać:
<?php
class CategoryController extends CategoryControllerCore
{
}
Następnie należy przekopiować metodę assignProductList z pierwotnego pliku i zmodyfikować w poniższy sposób warunek if (!$hookExecuted)
if (!$hookExecuted)
{
$this->context->smarty->assign('categoryNameComplement', '');
$showProducts = Tools::getValue('showProducts');
if ($showProducts == 'all') {
$this->cat_products = $this->category->getProducts($this->context->language->id, null, null, $this->orderBy, $this->orderWay, false, true, false, 1, true, null, true);
} else {
$this->nbProducts = $this->category->getProducts(null, null, null, $this->orderBy, $this->orderWay, true);
$this->pagination((int)$this->nbProducts); // Pagination must be call after "getProducts"
$this->cat_products = $this->category->getProducts($this->context->language->id, (int)$this->p, (int)$this->n, $this->orderBy, $this->orderWay);
}
}
Dodatkowa zmiana w kodzie pozwala na sprawdzenie parametru 'showProducts'. Jeśli jego wartość jest ustawiona na 'all', to zostaje wywołana zmieniona metoda getProducts z modelu Category.
Następnym krokiem jest zmodyfikowanie metody wspomnianego modelu Category. W tym celu utwórz plik Category.php (jeśli nie istnieje) w katalogu override/classes i utwórz nową klasę (jeśli nie ma):
<?php
class Category extends CategoryCore
{
}
Kolejnym krokiem jest przekopiowanie oryginalnej metody getProducts. W metodzie dodajemy dodatkowy parametr showAllProducts
public function getProducts($id_lang, $p, $n, $order_by = null, $order_way = null, $get_total = false, $active = true, $random = false, $random_number_products = 1, $check_access = true, Context $context = null, $showAllProducts = false)
{
}
W kodzie przekopiowanej metody znajdź warunek $random === true I zmodyfikuj go w następujący sposób
if ($random === true)
{
$sql .= ' ORDER BY RAND()';
$sql .= ' LIMIT 0, '.(int)$random_number_products;
}
else
$sql .= ' ORDER BY '.(isset($order_by_prefix) ? $order_by_prefix.'.' : '').'`'.pSQL($order_by).'` '.pSQL($order_way);
if (!$showAllProducts) {
$sql .= ' LIMIT '.(((int)$p - 1) * (int)$n).','.(int)$n;
}
Dodatkowy warunek pozwala na dodawanie (lub nie) kodu odpowiadającego za ograniczenie wyników wyświetlania w zapytaniu (LIMIT).
Ostatnim krokiem jest dodanie do widoku kategorii wyświetlania linku pozwalającego na wczytanie wszystkich produktów. W tym celu edytujemy plik pagination.tpl w katalogu themes/TWÓJ_SZABLON/pagination.tpl. Dodaj poniższy kod zaraz przed znakami kończącymi warunek if
{if $start!=$stop}
…
<a rel="nofollow" href="{$request}?showProducts=all">{l s='View all'}</a>
{/if}
Atrybut rel określa, że link ma ni być ineksowany przez roboty wyszukiwarek. Zmienna {$request} pozwoli na wyświetlenie urla do kategorii. Możliwe że w Twoim przypadku będzie potrzebna zmiana ? Na & jeśli url do kategorii zawiera już jakieś parametry (np.: /index.php?id_category=3&controller=category).