Jak wyświetlić więcej produktów w module Blok Promocji w Prestashop

Od zlecenia się zaczęło.

Przygotowuję sklep internetowy dla klienta i dostosowuję szablon do jego potrzeb. Jedną z takich potrzeb była możliwość wyświetlenia większej ilości produktów w module “Blok promocji” (blockspecials), który zakotwiczony został w lewej kolumnie. Na początku wyglądało to mniej więcej tak: 

Dodam, że sklep oparty o silnik Prestashop w wersji 1.6 na standardowym szablonie default-bootstrap.

Zaczynamy od modyfikacji klasy modułu

W pliku /modules/blockspecials/blockspecials.php jest taka metoda hookRightColumn wygląda ona mniej więcej tak: 

[php] public function hookRightColumn($params) { if (Configuration::get(‘PS_CATALOG_MODE’)) return;

// We need to create multiple caches because the products are sorted randomly $random = date(‘Ymd’).’|’.round(rand(1, max(Configuration::get(‘BLOCKSPECIALS_NB_CACHES’), 1)));

if (!Configuration::get(‘BLOCKSPECIALS_NB_CACHES’) || !$this->isCached(‘blockspecials.tpl’, $this->getCacheId(‘blockspecials|’.$random))) { if (!($special = Product::getRandomSpecial((int)$params[‘cookie’]->id_lang)) && !Configuration::get(‘PS_BLOCK_SPECIALS_DISPLAY’)) return;

$this->smarty->assign(array( ‘special’ => $special, ‘priceWithoutReduction_tax_excl’ => Tools::ps_round($special[‘price_without_reduction’], 2), ‘mediumSize’ => Image::getSize(ImageType::getFormatedName(‘medium’)), )); }

return $this->display(__FILE__, ‘blockspecials.tpl’, (Configuration::get(‘BLOCKSPECIALS_NB_CACHES’) ? $this->getCacheId(‘blockspecials|’.$random) : null)); }[/php]

Przyglądając się bliżej mamy tutaj fragment kodu który pobiera jeden losowy produkt ze zniżką: 

[php]$special = Product::getRandomSpecial((int)$params[‘cookie’]->id_lang)
[/php]

Musimy go nieco zmodyfikować, aby wyświetlił listę produktów objętych promocją

[php] $specials = Product::getPricesDrop((int)$params[‘cookie’]->id_lang, 0, 3) [/php]

Skorzystamy tutaj z wbudowanej funkcji getPricesDrop która pobiera listę wszystkich aktywnych produktów z obniżą ceną, oraz stosuje paginację. Ponieważ nie potrzebujemy stronicowania, używamy drugiego parametru, aby poinformować metodę, że chcemy wyświetlić stronę 0 i pobrać np. 3 elementy. Oczywiście, możemy pobrać dowolną liczbę produktów, zmieniając wg. potrzeby ostatni parametr.

Ponieważ zmieniliśmy także nazwę zmiennej na specials, musimy również zmienić następującą część:

[php]$this->smarty->assign(array( ‘special’ => $special, ‘priceWithoutReduction_tax_excl’ => Tools::ps_round($special[‘price_without_reduction’], 2), ‘mediumSize’ => Image::getSize(ImageType::getFormatedName(‘medium’)), ));[/php]

Zamieniam special na specials i usuwam drugi element tablicy, ponieważ odnosi się do pojedynczej ceny produktu.

[php] $this->smarty->assign(array( ‘specials’ => $specials, ‘mediumSize’ => Image::getSize(ImageType::getFormatedName(‘medium’)), )); [/php]

W tym momencie metoda hookRightColumn powinna wyglądać następująco:

[php] public function hookRightColumn($params) { if (Configuration::get(‘PS_CATALOG_MODE’)) return;

// We need to create multiple caches because the products are sorted randomly $random = date(‘Ymd’).’|’.round(rand(1, max(Configuration::get(‘BLOCKSPECIALS_NB_CACHES’), 1)));

if (!Configuration::get(‘BLOCKSPECIALS_NB_CACHES’) || !$this->isCached(‘blockspecials.tpl’, $this->getCacheId(‘blockspecials|’.$random))) { if (!($specials = Product::getPricesDrop((int)$params[‘cookie’]->id_lang, 0, 3)) && !Configuration::get(‘PS_BLOCK_SPECIALS_DISPLAY’)) return;

$this->smarty->assign(array( ‘specials’ => $specials, ‘mediumSize’ => Image::getSize(ImageType::getFormatedName(‘medium’)), )); }

return $this->display(__FILE__, ‘blockspecials.tpl’, (Configuration::get(‘BLOCKSPECIALS_NB_CACHES’) ? $this->getCacheId(‘blockspecials|’.$random) : null )); } [/php]

Czas na dostosowanie wyglądu

Otwieram plik /themes/default-bootstrap/modules/blockspecials/blockspecials.tpl i mam tam taki oto fragment:

[php]

  • {$special.name|escape:’html’:’UTF-8′}

    {if isset($special.description_short) && $special.description_short}

    {$special.description_short|strip_tags:’UTF-8’|truncate:40}

    {/if}

    {if !$PS_CATALOG_MODE} {if !$priceDisplay} {displayWtPrice p=$special.price}{else}{displayWtPrice p=$special.price_tax_exc} {/if} {if $special.specific_prices} {assign var=’specific_prices’ value=$special.specific_prices} {if $specific_prices.reduction_type == ‘percentage’ && ($specific_prices.from == $specific_prices.to OR ($smarty.now|date_format:’%Y-%m-%d %H:%M:%S’ <= $specific_prices.to && $smarty.now|date_format:'%Y-%m-%d %H:%M:%S' >= $specific_prices.from))} -{$specific_prices.reduction*100|floatval}% {/if} {/if} {if !$priceDisplay} {displayWtPrice p=$special.price_without_reduction}{else}{displayWtPrice p=$priceWithoutReduction_tax_excl} {/if} {hook h=”displayProductPriceBlock” product=$special type=”price”} {/if}

  • [/php]

    Najpierw usunąłem krótki opis gdyż jest on wg. mnie tam zupełnie niepotrzebny:

    [php] {if isset($special.description_short) && $special.description_short}

    {$special.description_short|strip_tags:’UTF-8’|truncate:40}

    {/if} [/php]

    Następnie skróciłem tytuł do 50 znaków:

    [php] {$special.name|escape:’html’:’UTF-8’|truncate:50} [/php]

    I co najważniejsze dodana została pętla foreach. Mój kod wygląda teraz tak: 

    [php] {foreach from=$specials item=special}

  • {$special.name|escape:’html’:’UTF-8’|truncate:50}
    {if !$PS_CATALOG_MODE} {if !$priceDisplay} {displayWtPrice p=$special.price}{else}{displayWtPrice p=$special.price_tax_exc} {/if} {if $special.specific_prices} {assign var=’specific_prices’ value=$special.specific_prices} {if $specific_prices.reduction_type == ‘percentage’ && ($specific_prices.from == $specific_prices.to OR ($smarty.now|date_format:’%Y-%m-%d %H:%M:%S’ <= $specific_prices.to && $smarty.now|date_format:'%Y-%m-%d %H:%M:%S' >= $specific_prices.from))} -{$specific_prices.reduction*100|floatval}% {/if} {/if}
    {if !$priceDisplay} {displayWtPrice p=$special.price_without_reduction}{else}{displayWtPrice p=$priceWithoutReduction_tax_excl} {/if} {hook h=”displayProductPriceBlock” product=$special type=”price”} {/if}

  • {/foreach} [/php]

    Efekt pracy: