Добавить поле в Товары (Категории) override Presta 1.6.0.14

Тема в разделе "PrestaShop", создана пользователем vsivsi, 1 мар 2016.

  1. vsivsi

    vsivsi

    Регистрация:
    1 мар 2016
    Сообщения:
    10
    Симпатии:
    2
    Доброго времени суток!
    Дополнительные поля уже добавлены вручную в БД, модель и админку и в шаблоны темы, но при обновлении все слетает.
    Можно ли добавить поле в Товары (Категории) с помощью override (или выводить их из отдельного модуля, например) так, чтобы при обновлении не приходилось каждый раз лопатить все по новой?
    Подскажите, пожалуйста, куда копать?
    Может, у кого-то уже есть готовое решение..
     
  2. duke1999

    duke1999

    Регистрация:
    30 дек 2014
    Сообщения:
    143
    Симпатии:
    48
    Не можно, а нужно так делать. Всё тоже самое, но только в файлах override
     
  3. vsivsi

    vsivsi

    Регистрация:
    1 мар 2016
    Сообщения:
    10
    Симпатии:
    2
    Спасибо. Покопался в Гугле и нарыл:

    Для начала, в Админке->Расширенные параметры->Производительность
    Включил принудительную перекомпиляцию шаблонов и отключил кеширование.

    Затем 3 шага;
    1. В базе данных в таблице ps_category_lang создал поле name_long VARCHAR

    2. Создал файл \override\classes\Category.php со следующим содержимым:
    Код:
    class Category extends CategoryCore
    {
        /** @var string Name_long */
        public $name_long;// Объявляем новое свойство класса
    
        public function __construct($id_category = null, $id_lang = null, $id_shop = null)
        {
            // Добавляем определение этого поля в модель (класс) Category по аналогии - см. метод __construct класса CategoryCore
            self::$definition['fields']['name_long'] = array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isCatalogName', 'required' => true, 'size' => 128);
    
            parent::__construct($id_category, $id_lang, $id_shop);
        }
    }
    3. Создал файл \override\controllers\admin\AdminCategoriesController.php
    Здесь есть два способа:
    1. Полностью переопределить метод public function renderForm() (скопировать его ПОЛНОСТЬЮ из AdminCategoriesControllerCore с добавлением информации о новом поле)
    В конце этого метода строку "return parent::renderForm();" следует заменить на "return AdminController::renderForm();"
    2. Воспользоваться встроенным в контролер AdminController свойством $fields_form_override

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

    Я выбрал второй способ - решил воспользовать встроенным механизмом + гораздо меньше кода:

    Код:
    class AdminCategoriesController extends AdminCategoriesControllerCore
    {
        public function renderForm()
        {
            $this->fields_form_override =array(
                array(
                    'type' => 'text', 'label' => $this->l('Name_long'), 'name' => 'name_long', 'lang' => true, 'required' => true, 'class' => 'copy2friendlyUrl', 'hint' => $this->l('Invalid characters:').' <>;=#{}',
                 ),
            );
            return parent::renderForm();
        }
    }
    В завершение, в Админке->Расширенные параметры->Производительность
    Отключил принудительную перекомпиляцию шаблонов и отключил кеширование.

    Все работает.

    Источник http://stackoverflow.com/a/35421104.
     
    Lasted edited by : 2 мар 2016
    duke1999 и $iD нравится это.
  4. vsivsi

    vsivsi

    Регистрация:
    1 мар 2016
    Сообщения:
    10
    Симпатии:
    2
    Подскажите, пожалуйста, есть у кого готовый рецепт по добавлению поля к Товарам с override, чтобы не слетало при обновлении.
    Насколько я понимаю, там нужно вносить изменения в том числе в тему админки. А шаблоны админки, вроде, оверрайдить нельзя.
    Кто что знает по этому поводу?
     
  5. duke1999

    duke1999

    Регистрация:
    30 дек 2014
    Сообщения:
    143
    Симпатии:
    48
    Всё тоже самое как и категориями, только с моделью Product и Product контроллерами.
    оверрайды для шаблонов админки также можно делать, к примеру для первой вкладки редактирования товара, шаблон оверрайда будет лежать здесь: \override\controllers\admin\templates\products\informations.tpl
     
  6. vsivsi

    vsivsi

    Регистрация:
    1 мар 2016
    Сообщения:
    10
    Симпатии:
    2
    Спасибо огромное! Очень помогла эта информация.
    --- Добавлено, 4 мар 2016 ---
    Добавить дополнительное поле в Товар - готовый рецепт.

    Что я сделал:

    1. В Админке->Расширенные параметры->Производительность
    Включил принудительную перекомпиляцию шаблонов и отключил кеширование.

    2. В базе данных в таблице ps_product_lang создал поле name_long VARCHAR

    3. Создал файл \override\classes\Product.php со следующим содержимым:

    Код:
    class Product extends ProductCore
    {
        /** @var string Long Name */
        public $name_long;
    
        public function __construct($id_product = null, $full = false, $id_lang = null, $id_shop = null, Context $context = null)
        {
            self::$definition['fields']['name_long'] = array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isCatalogName', 'required' => true, 'size' => 128);
    
            parent::__construct($id_product, $full, $id_lang, $id_shop, $context);
        }
    }
    4. Скопировал файл шаблона \adminbackend(папка с админкой)\themes\default\template\controllers\products\informations.tpl в папку \override\controllers\admin\templates\products\

    В этом informations.tpl после кода:
    Код:
    <div id="product-pack-container" {if $product_type != Product::PTYPE_PACK}style="display:none"{/if}></div>
        <hr />
    вставил:
    Код:
    <div class="form-group">
            <div class="col-lg-1"><span class="pull-right">{include file="controllers/products/multishop/checkbox.tpl" field="name_long" type="default" multilang="true"}</span></div>
            <label class="control-label col-lg-2 required" for="name_long_{$id_lang}">
                <span class="label-tooltip" data-toggle="tooltip" title="{l s='The public long name for this product.'}
                    {l s='Invalid characters:'} &lt;&gt;;=#{}">
                    {l s='Long Name'}
                </span>
            </label>
            <div class="col-lg-5">
                {include file="controllers/products/input_text_lang.tpl"
                    languages=$languages
                    input_class="{$class_input_ajax} updateCurrentText"
                    input_value=$product->name_long
                    input_name="name_long"
                    required=true
                }
            </div>
    </div>
    
    Код, приведенный выше, взят из этого же шаблона. Он генерирует input name. Соответсвенно, name был изменен на нужное мне имя поля name_long.
    Если необходимо добавить textarea с html-редактором, нужно за исходник брать код, генерирующий description.

    Ну, собственно, и все.
    Протестировал. Появились дополнительные поля ввода в карте товара, данные добавляются, сохраняются и редактируются.
    После изменений в шаблоне темы frontend-а, содержимое поля выводится в карте товара.

    Да, не забываем в Админке->Расширенные параметры->Производительность включить принудительную перекомпиляцию шаблонов и включить кеширование.
     
  7. vsivsi

    vsivsi

    Регистрация:
    1 мар 2016
    Сообщения:
    10
    Симпатии:
    2
    Да, не забываем в Админке->Расширенные параметры->Производительность выключить принудительную перекомпиляцию шаблонов и включить кеширование
    --- Добавлено, 4 мар 2016 ---
    Еще вопрос к знатокам:
    На многий сайтах и форумах в рецепте добавления Поля к Товару, советуют также добавлять определенный код и в AdminProductsController - в несколько методов, везде по разному..
    У меня же все работает после внесения изменений в класс-модель Product и в шаблон админки. Prestashop 1.6.1.4.

    Собственно, вопрос: Нужно ли что-либо еще менять или переопределять и в AdminProductsController? Возможно, какие-либо модули, или что-то другое нуждается в таких изменениях..
     
    Последнее редактирование: 4 мар 2016