Автор Тема: Кастомное поле не выводится в цикле подкатегорий  (Прочитано 381 раз)

09 Декабрь 2020, 07:01:45
  • Новичок
  • *
  • Сообщений: 21
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Создал с помощью override поле дополнительного описания для категорий, мне нужно вывести его значение на странице со списком подкатегорий, по по какой-то причине, при добавлении в цикл вывода подкатегорий переменной с моим полем ничего не выводится.
Вот код цикла подкатегорий: (файл category-subcategories.tpl)
      <div class="row filter-area">
                {foreach from=$subcategories item=subcategory  }
       
                    <div class="col-{$iqitTheme.cat_sub_thumbs_p} collection-shape col-md-{$iqitTheme.cat_sub_thumbs_t} col-lg-{$iqitTheme.cat_sub_thumbs_d}  ">
                        <div class="subcategory-image">
                            <a href="{$subcategory.url}">
                                <img src="{$subcategory.image.bySize.medium_default.url}" alt="{$subcategory.name}" width="{$subcategory.image.bySize.medium_default.width}"
                                     height="{$subcategory.image.bySize.medium_default.height}" class="img-fluid "/>
                            </a>
                            <div>{$subcategory.description_long}</div>
                        </div>
                        <a class="subcategory-name" href="{$subcategory.url}">{$subcategory.name}</a>
    <div class="subcategory-description">{$subcategory.description|escape:'html':'UTF-8' nofilter}   
   
    </div>   <div>{$subcategory.description_long}</div>
                    </div>

                {/foreach}

            </div>


{$subcategory.description_long} - это мое поле. Причем странно, что это не работает именно в цикле с подкатегориями, для категорий в файле category-header.tpl  работает эта запись - {$category.description_long} и все нормально выводится, а с этим циклом беда. Помогите пожалуйста понять в чем дело, сам не могу разобраться уже неделю.
09 Декабрь 2020, 13:40:38
Ответ #1
  • Ветеран
  • *****
  • Сообщений: 86688
  • Репутация: +25428/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Определите переменную description_long для объекта subcategory в классе Category.
09 Декабрь 2020, 14:02:29
Ответ #2
  • Новичок
  • *
  • Сообщений: 21
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Определите переменную description_long для объекта subcategory в классе Category.

Вы не подскажите как это можно сделать технически?
Это файл category.php из папки override, я так понял править нужно именно его

<?php
class Category extends CategoryCore {
    /*
    * module: customfieldcategory
    * date: 2020-12-09 06:39:03
    * version: 1.0
    */
    public $description_long;
    /*
    * module: customfieldcategory
    * date: 2020-12-09 06:39:03
    * version: 1.0
    */
    public function __construct($id_category = null, $id_lang = null, $id_shop = null){
        self::$definition['fields']['description_long'] = array('type' => self::TYPE_HTML, 'lang' => true);
        parent::__construct($id_category, $id_lang, $id_shop);
    }
}
09 Декабрь 2020, 15:54:51
Ответ #3
  • Ветеран
  • *****
  • Сообщений: 86688
  • Репутация: +25428/-0
  • Сообщество PrestaShop
    • Просмотр профиля
При переопределении базового класса вы можете переопределить его методы. Если у вас уже создан файл Category.php в папке override, то добавьте переопределение метода getSubCategories. В sql запросе нужно перечислить все переменные, которые вы планируете использовать в шаблоне tpl.
10 Декабрь 2020, 04:12:35
Ответ #4
  • Новичок
  • *
  • Сообщений: 21
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
При переопределении базового класса вы можете переопределить его методы. Если у вас уже создан файл Category.php в папке override, то добавьте переопределение метода getSubCategories. В sql запросе нужно перечислить все переменные, которые вы планируете использовать в шаблоне tpl.

    public function getSubCategories($id_lang, $active = true)
    {
        if (!Validate::isBool($active)) {
            die(Tools::displayError());
        }

        $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('
      SELECT c.*, cl.id_lang, cl.name, cl.description, cl.link_rewrite, cl.meta_title, cl.meta_keywords, , cl.description_long, cl.meta_description
      FROM `' . _DB_PREFIX_ . 'cms_category` c
      LEFT JOIN `' . _DB_PREFIX_ . 'cms_category_lang` cl ON (c.`id_cms_category` = cl.`id_cms_category` AND `id_lang` = ' . (int) $id_lang . ')
      WHERE `id_parent` = ' . (int) $this->id . '
      ' . ($active ? 'AND `active` = 1' : '') . '
      GROUP BY c.`id_cms_category`
      ORDER BY `name` ASC');

        // Modify SQL result
        foreach ($result as &$row) {
            $row['name'] = CMSCategory::hideCMSCategoryPosition($row['name']);
        }

        return $result;
    }

Вот так?
10 Декабрь 2020, 11:00:23
Ответ #5
  • Ветеран
  • *****
  • Сообщений: 86688
  • Репутация: +25428/-0
  • Сообщество PrestaShop
    • Просмотр профиля
, cl.description_long,так, запятую одну удалите
10 Декабрь 2020, 11:05:13
Ответ #6
  • Новичок
  • *
  • Сообщений: 21
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
, cl.description_long,так, запятую одну удалите

Странно, но теперь подкатегории пропали на странице вывода, может что-то не так сделал?


<?php
class Category extends CategoryCore {
    /*
    * module: customfieldcategory
    * date: 2020-12-09 06:39:03
    * version: 1.0
    */
    public $description_long;
    /*
    * module: customfieldcategory
    * date: 2020-12-09 06:39:03
    * version: 1.0
    */
    public function __construct($id_category = null, $id_lang = null, $id_shop = null){
        self::$definition['fields']['description_long'] = array('type' => self::TYPE_HTML, 'lang' => true);
        parent::__construct($id_category, $id_lang, $id_shop);
    }
   
   
      public function getSubCategories($id_lang, $active = true)
    {
        if (!Validate::isBool($active)) {
            die(Tools::displayError());
        }

        $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('
      SELECT c.*, cl.id_lang, cl.name, cl.description, cl.link_rewrite, cl.meta_title, cl.meta_keywords, cl.description_long, cl.meta_description
      FROM `' . _DB_PREFIX_ . 'cms_category` c
      LEFT JOIN `' . _DB_PREFIX_ . 'cms_category_lang` cl ON (c.`id_cms_category` = cl.`id_cms_category` AND `id_lang` = ' . (int) $id_lang . ')
      WHERE `id_parent` = ' . (int) $this->id . '
      ' . ($active ? 'AND `active` = 1' : '') . '
      GROUP BY c.`id_cms_category`
      ORDER BY `name` ASC');

        // Modify SQL result
        foreach ($result as &$row) {
            $row['name'] = CMSCategory::hideCMSCategoryPosition($row['name']);
        }

        return $result;
    }
};

10 Декабрь 2020, 12:35:14
Ответ #7
  • Ветеран
  • *****
  • Сообщений: 16670
  • Репутация: +14630/-5
  • Сообщество PrestaShop
    • Просмотр профиля
Если пропали, значит ошибка в функции. Включите режим отладки в prestashop.
10 Декабрь 2020, 13:50:03
Ответ #8
  • Новичок
  • *
  • Сообщений: 21
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Если пропали, значит ошибка в функции. Включите режим отладки в prestashop.

Я думаю проблема с полем. Ошибка со строчкой которую добавил - Unknown column 'cl.description_long' in 'field list' . Видимо я не правильно понял как именно определить переменную description_long для подкатегорий.
10 Декабрь 2020, 15:26:34
Ответ #9
  • Модератор
  • Ветеран
  • *****
  • Сообщений: 22125
  • Репутация: +25303/-1
  • Prestashop - просто и эффективно
    • Просмотр профиля
Вы хотитете добавить поле для категории страниц cms или для категорий товаров?
Эксперт Prestashop - решения всех проблем, написание модулей, создание тем для интернет-магазинов под Prestashop.
Эксперт Magento - создам сайт на Magento, программирование кастомных модулей для Magento, кастомизация тем Magento.
Лучшие цены!!!
11 Декабрь 2020, 01:34:53
Ответ #10
  • Новичок
  • *
  • Сообщений: 21
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Вы хотитете добавить поле для категории страниц cms или для категорий товаров?

Это подкатегории товаров, с категориями поле работает, проблема именно в подкатегориях
11 Декабрь 2020, 12:15:03
Ответ #11
  • Модератор
  • Ветеран
  • *****
  • Сообщений: 22125
  • Репутация: +25303/-1
  • Prestashop - просто и эффективно
    • Просмотр профиля
Вы меняли код метода показа категориий страниц CMS
FROM `' . _DB_PREFIX_ . 'cms_category` cА для категорий товаров другой метод
/**
     * Return current category childs.
     *
     * @param int $idLang Language ID
     * @param bool $active return only active categories
     *
     * @return array Categories
     */
public function getSubCategories($idLang, $active = true)
его нужно переопределять
Эксперт Prestashop - решения всех проблем, написание модулей, создание тем для интернет-магазинов под Prestashop.
Эксперт Magento - создам сайт на Magento, программирование кастомных модулей для Magento, кастомизация тем Magento.
Лучшие цены!!!
11 Декабрь 2020, 15:29:32
Ответ #12
  • Новичок
  • *
  • Сообщений: 21
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Вы меняли код метода показа категориий страниц CMS
FROM `' . _DB_PREFIX_ . 'cms_category` cА для категорий товаров другой метод
/**
     * Return current category childs.
     *
     * @param int $idLang Language ID
     * @param bool $active return only active categories
     *
     * @return array Categories
     */
public function getSubCategories($idLang, $active = true)
его нужно переопределять

Спасибо Вам ОГРОМНОЕ!И всем кто помог разобраться в теме, спустя почти две недели мучений всё наконец-то заработало!