Prestashop : Вывод категорий на главной

В prestashop нет возможности вывести показ продуктов по категориям на главной странице сайта. Для этого нужен дополнительный модуль. Есть много платных модулей для такой задачи, а бесплатных модулей prestashop нет. Но это не такая уж сложная задача и создать такой модуль prestashop можно самому.

Пример создания простого модуля prestashop «Вывод категорий на главной».

Задача:

  • Модуль должен выбрать все категории, созданные в магазине
  • Вывести Изображение категории с сылкой на страницу товаров этой категории

1. Название модуля : blockhomecategorys

2. Структура модуля :

view

  • blockhomecategorys.php  — основной класс модуля
  • blockhomecategorys.tpl — шаблон вывода
  • logo.gif logo.png — иконки

3. Класс blockhomecategorys

<?php
if (!defined('_PS_VERSION_'))
    exit;

class BlockHomecategorys extends Module
{
    public function __construct()
    {
        $this->name = 'blockhomecategorys';
        $this->tab = 'front_office_features';
        $this->version = '1.0';
        $this->author = 'ILIL';

        parent::__construct();

        $this->displayName = $this->l('Categories block');
        $this->description = $this->l('Adds a block categories to Homepage.');
    }

    function install()
    {
        if (!parent::install() || !$this->registerHook('displayHeader') || !$this->registerHook('displayHome'))
            return false;
        return true;
    }

    public function hookDisplayHeader()
    {
        $this->context->controller->addCSS(_THEME_CSS_DIR_.'category.css', 'all');
    }

    public function hookDisplayHome($params)
    {
        $categoryRoot = new Category(Configuration::get('PS_HOME_CATEGORY'),$this->context->language->id,$this->context->shop->id);
        $categoriesHome = $categoryRoot->getSubCategories($this->context->language->id);

        $this->smarty->assign(array(
                'subcategories' => $categoriesHome,
                'homeSize' => Image::getSize('medium_default')
        ));

        return $this->display(__FILE__, 'blockhomecategorys.tpl');
    }
}

4. Шаблон для показа категорий — blockhomecategorys.tpl

{if isset($subcategories)}
  <h2>{l s='Categorys' mod='blockhomecategorys'}</h2>

  <div id="subcategories">
    <ul>
      {foreach from=$subcategories item=subcategory}
      <li>
        <a href="{$link->getCategoryLink($subcategory.id_category, $subcategory.link_rewrite)|escape:'htmlall':'UTF-8'}" title="{$subcategory.name|escape:'htmlall':'UTF-8'}">
        {if $subcategory.id_image}
        <img src="{$link->getCatImageLink($subcategory.link_rewrite, $subcategory.id_image, 'medium_default')}" alt="" width="{$mediumSize.width}" height="{$mediumSize.height}" />
        {else}
        <img src="{$img_cat_dir}default-medium_default.jpg" alt="" width="{$mediumSize.width}" height="{$mediumSize.height}" />
        {/if}
        </a>
        <a href="{$link->getCategoryLink($subcategory.id_category, $subcategory.link_rewrite)|escape:'htmlall':'UTF-8'}">{$subcategory.name|escape:'htmlall':'UTF-8'}</a>
      </li>
      {/foreach}
    </ul>
    <br/>
  </div>
{/if}

5. Переносим папку blockhomecategorys в /modules

6. Заходим в админку и устанавливаем новый модуль

admin7. После установки модуля, открываем Главную страницу сайта и проверяем

home

Если нужно выводить категории таблицой, то меняем названия классов.

Это простой пример создания модуля Prestashop. Можно добавить возможность выбора категорий, вывода картинки 1 товара, а не картинки категории, вывода случайного товара, который принадлежит категории и т.д.

Скачать архив с модулем Blockhomecategorys Prestashop

Prestashop : Вывод категорий на главной: 57 комментариев

  1. Дмитрий

    А как же сделать возможно выводить нужные категории из админ панели?

  2. Katty

    У меня при установке модуля ошибка — Неизвестный тип архива
    Указываю путь к файлу blockhomecategorys.php — или неправильно?

    1. admin Автор записи

      При автоматической установки из админки, выбрать архив модуля blockhomecategorys.zip.
      Можно установить в ручную, паспаковать и перенести в папку modules.

  3. Andrey

    А как можно реализовать вывод определенного количества случайных товаров на основе этого модуля не подскажете?

    1. admin Автор записи

      Для вывода продуктов на главной есть модуль homefeatured. В нем нужно менять
      $nb = (int)(Configuration::get('HOME_FEATURED_NBR')); // Количество товаров
      $products = $category->getProducts((int)Context::getContext()->language->id, 1, ($nb ? $nb : 10)); // Товары из категории

      Функция getProducts в классе Category позволяет выбирать товары в случайном порядке.
      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)

    1. admin Автор записи

      Этот модуль модуль выводит все под-категории, который входят в Корневую категорию.
      Вы можете отметить у под-категорий, которые нужно выводить,
      Корневая категория: Да.

      1. Mefodiy

        Что-то не получается…
        У меня есть Категория «Мягкие игрушки» в ней есть подкатегория «Мишки». Ставлю в категории Мишки, корневая категория, на главной выводится только «Мягкие игрушки».
        В моем понимании должно быть: Категории в ней дивы корневых категорий, в каждом диве список подкатегорий.
        Пример Rozetka.com.ua: там категория «Ноутбки, планшеты, компьютеры» в ней список подкатегорий «Компьютеры», «Ноутбуки», «Планшеты».
        Что я делаю, не так?
        Спасибо за оперативные ответы. Видимо теперь я ваш постоянный посетитель.

        1. admin Автор записи

          Этот модуль не может так выводить. Он выводит только 1 категорию из группы, т.е. или «Мягкие игрушки», или «Мишки». Чтобы категории выводились, как в примере, нужно совместить его с модулем blockcategories.

  4. Виталий

    Здравствуйте! Как вывести этот категории в ряд, а не в столбик? Вы написали, что нужно поменять класс. А на какой и где эти классы найти?

    1. Антон

      Классный модуль! +1 к карме автора

      Я не сильно пока разбираюсь в работе с кодом prestashop.
      Вы писали:
      Поменять нужно стили для UL и LI.
      Класс — class=’inline_list’.

      Объясните, пожалуйста, что и где необходимо изменить

      1. admin Автор записи

        В шаблоне blockhomecategorys.tpl у UL установлен класс inline_list.
        Вам нужно добавить стили к этому классу в файле global.css

  5. Владимир

    Здравствуйте у меня такой вопрос. Как на основе вашего модуля сделать вывод категорий на отдельной странице то есть не на главной как заходишь на сайт, а при переходе в раздел «Каталог». за ранее спасибо!

    1. admin Автор записи

      Изменить показ модуля — это изменить hook.
      Раздел каталог, это страница категорий, там можно показывать подкатегории. Для этого не нужен модуль. Там подключается шаблон category.tpl, в нем вывод подкатегорий subcategories.

      1. Владимир

        Возможно вы меня не так поняли. Тогда такой вопрос. У меня есть отдельный файл .php при обращении к нему пример(http://base.url/test.php), что мне в него вписать чтоб выводился список всех категорий с передачей их в какой-то tpl шаблон, вывод субкатегорий необязателен……???? просто я несилен в php. Буду очень признателен за помощь.

        1. admin Автор записи

          Создайте страницу и подключите вывод модуля

          < ?php global $smarty; include('../../config/config.inc.php'); include('../../header.php'); $pageCategorys = new BlockHomecategorys(); // Если нужно что-то дополнительно показать на странице $smarty->assign('var', $pageCategorys->l('Показать в шаблоне'));

          // Создать отдельный шаблон для страницы blockhomecategorys-page.tpl
          // Вывести шаблон
          $smarty->display(dirname(__FILE__).'/blockhomecategorys-page.tpl');

          include( '../../footer.php' );
          ?>

          1. Илья

            Попробовал по Вашему примеру, admin. Не срабатывает вывод в шаблоне. В чем может быть проблема. Ни одну переменную не удается передать.
            assign(‘pageCategorys’, $block);
            $smarty->display(dirname(__FILE__).’/blockhomecategorys.tpl’);
            include(dirname(__FILE__).’/footer.php’);

          2. admin Автор записи

            Файл {$base_dir}modules/blockhomecategorys/test.php
            < ?php global $smarty; include('../../config/config.inc.php'); include('../../header.php'); $pageCategorys = new BlockHomecategorys(); $message = $pageCategorys->l('Тест');
            $smarty->assign('messageSmarty', $message );
            $smarty->display(dirname(__FILE__).'/blockhomecategorys_page.tpl');
            include( '../../footer.php' );
            ?>

            Шаблон {$base_dir}modules/blockhomecategorys/blockhomecategorys_page.tpl
            {$messageSmarty}
            Все работает, показывает слово «Тест» на странице.

  6. Илья

    Ну хорошо, выводится текст на странице. Получилось вывести категории, но только все сразу. Необходимо вывести только главные категории с картинками. Картинки тоже не подгружает.

    1. admin Автор записи

      Этот модуль выводит все под-категории, т.е. те у которых отмечена родильская «Главная». Других возможностей для выбора категорий нет. Чтобы можно было отмечать категории для показа, нужно добавлять дополнительный параметр в админку, базу данных. Переопределять класс Category.
      У меня картинки показывает, может где-то ошибка. Попробуйте вывести основной шаблон модуля.
      Файл {$base_dir}modules/blockhomecategorys/test.php

      < ?php global $smarty; include('../../config/config.inc.php'); include('../../header.php'); $pageCategorys = new BlockHomecategorys(); $smarty->assign('categorysSmarty', $pageCategorys->hookDisplayHome($params));

      $message = $pageCategorys->l('Тест');
      $smarty->assign('messageSmarty', $message );
      $smarty->display(dirname(__FILE__).'/blockhomecategorys_page.tpl');

      include( '../../footer.php' );
      ?>

      Шаблон {$base_dir}modules/blockhomecategorys/blockhomecategorys_page.tpl

      {$categorysSmarty}

  7. Владимир

    Написал следующий код:


    assign('subcategories', $pageCategorys);
    $smarty->display(dirname(__FILE__).'/blockhomecategorys.tpl');
    include(dirname(__FILE__).'/footer.php');

    — файл лежит в корне сайта шаблон tpl тоже тамже вот сам шаблон:


    {if isset($subcategories)}
    {l s='Categorys'}
    {foreach from=$subcategories item=subcategory}
    getCategoryLink($subcategory.id_category, $subcategory.link_rewrite)|escape:'htmlall':'UTF-8'}" title="{$subcategory.name|escape:'htmlall':'UTF-8'}" class="img">;
    {if $subcategory.id_image}
    getCatImageLink($subcategory.link_rewrite, $subcategory.id_image, 'medium_default')}" alt="" width="{$mediumSize.width}" height="{$mediumSize.height}" />;
    {else}
    {/if}

    getCategoryLink($subcategory.id_category, $subcategory.link_rewrite)|escape:'htmlall':'UTF-8'}" class="cat_name">{$subcategory.name|escape:'htmlall':'UTF-8'}
    {/foreach}
    {/if}

    проблема в следующем:
    1) выводятся не все категории
    2) не выводятся названия категорий
    3) не выводятся изображения категорий.

    Уже сломал всю голову но никак не могу найти решения

  8. Наташа

    Здравствуйте, подскажите, пожалуйста, у меня каталоги расположились лесенкой, а не в ряд… Я что-то не так сделала?
    И как увеличить картинку каталога? Надо переписать размер с mediumSize на какой-то другой?

    1. admin Автор записи

      1. Проверить нужно описание стилей. Может у вас переопределяются стили для этого модуля.
      2. Увеличить картинку
      — создать новый размер в админке в Изображения (можно использовать те, что есть)
      — изменить ‘medium_default’ на название нужного размера

  9. Наташа

    Спасибо, с изображением разобралась)
    А вот со стилями… Где это посмотреть??

  10. Александр

    Скажите пожалуйста. А есть какой то модуль или как можно сделать, чтобы в категории выводился также весь товар всех подкатегорий данной категории, ну к примеру по 20 или по 10 товаров на страницы и все это было постранично.

    1. admin Автор записи

      Модуль не нужен, достаточно отметить у продуктов несколлько категорий.
      Если нужно чтобы в родительской категории выводились товары всех под-категорий, нужно указать, что товар входит в 2 категории — родительская + категория товара.

  11. Александр

    Да и еще, то что я написал выше, чтобы такое действие повторялось во всех категориях. Если такое возможно помогите плиииз

  12. Александр

    вобщем я вставил код с product-list в category В принцыпе, то что я хотел но другая возникла проблема товар стал в подкатегории дублироваться, может кто подскажет как это исправить?

    1. admin Автор записи

      Регулировать показ товар можно только устанавливая категорию, к которой принадлежит этот товар.
      Если указать 2 категории, то товар будет показываться на страницах 2 категорий.
      Это не дублирование информации, страницы этих категорий будут разные.

  13. Кирилл

    Подскажите пожалуйста, как вывести категории не в столбец а в табличке?

  14. Георгий

    Спасибо за модуль. А можете подсказать, как добавить еще описание категории?

  15. Григорий

    Этот модуль не хочет ставиться выше других модулей, таких как слайдшоу и новые товары. Скажите как его туда запихнуть? Спасибо

  16. Ctdl

    А можно ли сделать так, чтобы не только категории выводились, но еще и товары из этих категорий? Как-то вытянуть через getProducts из getSubCategories товары по категориям и вывести их на главную.

    1. admin Автор записи

      Можно, нужно только добавить выбор товаров в категории
      $products = $category->getProducts((int)Context::getContext()->language->id, 1, 'количество товаров')
      определить переменную для шаблона
      $this->smarty->assign('products' => $products);
      и потом можно выводить товары в шаблоне tpl.

      1. Серж

        Сделал так:
        в файле php:
        $this->smarty->assign(array(
        ‘subcategories’ => $categoriesHome,
        ‘homeSize’ => Image::getSize(‘medium_default’)
        ));
        $products = $category->getProducts((int)Context::getContext()->language->id, 1, ‘5’)
        $this->smarty->assign(‘products’ => $products);
        В tpl проверяю :
        {if isset($products)}yes{else}no{/if}

        Ответ «no». Значит никакая переменная products не зарегистрировалась.
        Помогите, плз, подскажите как это сделать?

  17. Laxmi

    А есть ли модуль или способ отобразить категории в подкатегории, ато сейчас пусто получаеться категорий много вложеных и пока до товара дойдешь надо чтото отображатьи хотелось бы отобразить категории с картинками. а в последней категории товары.

    1. admin Автор записи

      Все зависит от версии prestashop и темы. В prestashop 1.6 в настройках темы это можно сделать просто меняя настройки.

  18. Макс

    Глупый наверное вопрос =))
    Как изменить имя на главной «Categorys»… Где в каком файле это редактировать?

  19. иван

    Подскажите как вывести категории горизонтальным списком. У вас в статье написано что поменять класс. А какой? И где??

    1. admin Автор записи

      Класс менять не нужно. Для расположения категорий горизонтально нужно изменить стили в файле /themes/default-bootstrap/css/modules/blockcategories/blockcategories.css
      display: inline-block;

  20. nikolajus

    Полезный модуль, спасибо!

    Вам случаем не приходилось решать такую задачу: выведение списка(логотипов) производителей для категории.

    Можете посоветовать, как это осушествить?

    1. admin Автор записи

      Не приходилось. Производители связанны с товаром, а не с категорией. Поэтому вам нужно будет выводить всех производителей товаров, которые входят в категорию. Модуля готового я не знаю.Скорее всего нужно будет создать самому такой модуль. Можно переделать модуль blockmanufacturer. В файле /modules/blockmanufacturer/blockmanufacturer.php заменить
      $manufacturers = Manufacturer::getManufacturers();
      на sql запрос с условием ids товаров категории.

  21. Леонид

    Здравствуйте.
    А как можно вместо вывода изображения категории выводить изображение товара из это категории,первого.случайного-не важно уже.
    У вас мелькнуло в описании
    «Можно добавить возможность выбора категорий, вывода картинки 1 товара, а не картинки категории, в»
    Категорий много очень))

  22. admin Автор записи

    Нужно добавить переменную шаблона smarty
    $this->context->smarty->assign(array(
    'products' =>$category->getProducts((int)Context::getContext()->language->id, 1, 'количество товаров')

    После этого в шаблоне можно выводить товары.

  23. Леонид

    не выводить товар а вместо изображения категории использовать изображение товара из этой категории

    1. admin Автор записи

      Когда определите переменную products, то можете выводить все что хотите название, изображения и т.д.

      {if isset($products) && $products}
      {foreach from=$products item=product name=products}

  24. Марат

    Модуль интересный и легкий. Работает на 1.6
    Подскажите, пожалуйста, можно ли вывести товары из категорий под своей категорией:
    категория id=1
    товары из этой категории
    категория id=2
    товары из этой категории
    ???
    Пробовал просто вывести товары, но где то делаю ошибки на этапе :
    public function hookDisplayHome($params)
    {
    $categoryRoot = new Category(Configuration::get('PS_HOME_CATEGORY'),$this->context->language->id,$this->context->shop->id);
    $categoriesHome = $categoryRoot->getSubCategories($this->context->language->id);
    $products = $category->getProducts((int)Context::getContext()->language->id, 1, '10');

    $this->smarty->assign(array(
    'subcategories' => $categoriesHome,
    'homeSize' => Image::getSize('medium_default'),
    'products' => $products
    ));

    return $this->display(__FILE__, 'blockhomecategorys.tpl');
    }

    1. admin Автор записи

      Для того чтобы выводить товары из другой категории, нужно добавить в модуль возможность выбора категорий и заменить categoriesHome на выборку подкатегорий по выбранному ид. categoryRoot тоже не нужна будет. Лучше сделать другой модуль на основе данного модуля.

    2. Серж

      Переменной $category тут не существует, не объявлена. Если подставить вместо неё $categoryRoot (и в blockhomecategorys.tpl код из product-list.tpl), то товары во всех категориях будут из главной. Если подставить $categoriesHome, то выдаёт ошибку. Как же правильно прописать, чтобы вместе c выводимыми в данном блоке категориями выводилось бы и несколько товаров из них? Помогите, плз.

  25. admin Автор записи

    $category = new Category('id нужной категории',$this->context->language->id,$this->context->shop->id);

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *