Prestashop FAQ - как добавить новое поле к товару

Автор coder, 14 августа 2014, 13:12:18

« назад - далее »

coder

Схема добавления нового поля (общая для всех, не только для товара)

1. Добавить новое поле в таблицу
ALTER TABLE `ps_product_lang`ADD COLUMN `myvar` VARCHAR(255) NULL DEFAULT NULL

2. Добавить новое поле в класс.
Для товара,  в файл /classes/Product.php добавляем

public $myvar;
public static $definition = array(
                'table' => 'product',
'primary' => 'id_product',
'multilang' => true,
'multilang_shop' => true,
'fields' => array(
// Classic fields
                        // после всех переменных
                        ...........
                        'myvar' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'size' => 255),


3. Добавить проверку и сохранение нового поля в контроллер.
Для товара, в файл /controllers/front/ProductController.php

public function initContent()
{
parent::initContent();

if (!$this->errors)
{
        ........
        // в конце
       if(isset($this->product->myvar) && $this->product->myvar)
       {
               // делаем что-то с новым полем
               $myvar = ...;
             
       else
       {
              // если нет значения, то делаем ...
              $myvar = ...;
       }
       .....

       $this->context->smarty->assign('new_champ', $myvar);


4. Добавить новое поле в шаблон.
Для товара, в файл /themes/ваша тема/product.tpl там где нужно показать новое значение
{$new_champ}

5. Для показа нового поля в админке
В файле AdminProductsController.php в методе copyFromPost

$object->myvar = Tools::getValue('myvar');

в методе renderForm
fields_to_copy = array(...,$myvar
для prestashop 1.6
tpl_form_vars['myvar'] = $myvar;
в методе initFormInformations
// global informations
array_push(..., 'myvar'
В файле  admin/themes/default/template/controllers/products/informations.tpl там где нужно показать новое значение
{$myvar}

Результат во вложении.

brus powerfull

Coder, подскажите пожалуйста, как называется таблица в которую нужно добавить новое поле, при добавлении нового поля для товара в prestashop?    ps_product?

Adik

Цитироватьps_product_lang
Там же написано. Если это текстовое поле и нужно менять превод, то поля добавляются в таблицу ps_xxxx_lang.

brus powerfull

Спасибо, извините за невнимательность.

KupueIIIKo

Добавил новое поле id_employee в БД! Что бы знать кто добавил товар!
1 - Поле обязательно добавлять в класс?
И как происходит вывод товаров в админке? Хочу чтобы все salesman-ы видели тока те товары которые они добавили!

brus powerfull

Да, обязательно. В классе описывается новая переменная, которую вы создаете( id_employee): тип переменной, ее размер и т.д.
"Как происходит вывод товаров в админке?". Что вы конкретно имеете ввиду?

Mr.Sen

Все что написал coder обязательно, добвавлять нужно в класс, в таблицу, контроллер и шаблон.

KupueIIIKo

#7
В файле AdminProductsController.php когда я скрывал поля по id_profile сделал так:

$id_profile_employee = Context::getContext()->employee->id_profile;

Вот теперь я хочу выдернуть так же id_employee. В этот труда нет!
Теперь я описываю новое поле в классе! Допустим
Для товара,  в файл /classes/Product.php добавляем
public $id_add_employee;
Ищем
public static $definition = array(
Добавляем
'id_add_employee' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'),
А вот дальше я встал

KupueIIIKo

3. Добавить проверку и сохранение нового поля в контроллер.
Для товара, в файл /controllers/front/ProductController.php
<- это работа с фрон офисом! Оно мне не надо! Я буду в админке скрывать товары которые добавили другие продавцы!

Значит лезем в /controllers/admin/ProductController.php

Где тут заморочить поле? где он дергает данные которые выводит в католог товаров?

Adik

Цитировать5. Для показа нового поля в админке В файле AdminProductsController.php в
Если только для адмики, то изменять нужно файлы админки.

coder

Цитировать1 - Поле обязательно добавлять в класс?
Не обязательно. Можно сделать модуль и новую таблицу, в которрй связать ИД товара и ИД работника. Тогда ничего добавлять не нужно.
ЦитироватьИ как происходит вывод товаров в админке?
Вызывается class AdminProductsController и его методы.

KupueIIIKo

Добавил

$this->fields_list['id_add_employee'] = array(
'title' => $this->l('ID_EMPLOYEE'),
'align' => 'center',
'orderby' => false,
'filter' => false,
'search' => false
);


В таблице появляется нужный id значит он его дергает! Теперь вопрос! Где AdminProductsController.php делает вывод в католог товаров админки?

DarinSr

Отключите чпу и в браузере будете видеть названия всех контроллеров.
Каталог > Товары
Показ списка товаров:
/admin/index.php?controller=AdminProducts&token=xxxx
Редактировать товар:
/admin/index.php?controller=AdminProducts&id_product=XX&updateproduct&token=xxxx
Вывод можно сделать в шаблонах, которые подключаются в этом контроллере.
Узнать все шаблоны можно поиском по файлу "tpl".
Шаблоны находяться в папке /admin/themes/default/template/...

KupueIIIKo

#13
не дурак вроде! controller=AdminProducts и токен! Вот и где он выводин на экран аминки список товаров? даже не совсем понятно какая функция цепляется!

DarinSr

#14
Токен - ключ безопасности, не обращаем внимания.
/admin/index.php?controller=AdminProducts&token=xxxx
Вызыв класса AdminProductsController - function __construct().
Инициализация шаблонов function initContent.
Шаблоны /admin/themes/default/template/controllers/products/...