Автор Тема: Prestashop FAQ - как добавить новое поле к товару  (Прочитано 10093 раз)

14 Августа 2014, 13:12:18
  • Модератор
  • Ветеран
  • *****
  • Сообщений: 32988
  • Репутация: +26759/-0
    • Просмотр профиля
Схема добавления нового поля (общая для всех, не только для товара)

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}
Результат во вложении.
14 Августа 2014, 15:28:34
Ответ #1
  • Старожил
  • ****
  • Сообщений: 299
  • Репутация: +0/-0
  • Новичек
    • Просмотр профиля
Coder, подскажите пожалуйста, как называется таблица в которую нужно добавить новое поле, при добавлении нового поля для товара в prestashop?    ps_product?
14 Августа 2014, 15:30:57
Ответ #2
  • Ветеран
  • *****
  • Сообщений: 13126
  • Репутация: +14553/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Цитировать
ps_product_lang
Там же написано. Если это текстовое поле и нужно менять превод, то поля добавляются в таблицу ps_xxxx_lang.
14 Августа 2014, 15:37:38
Ответ #3
  • Старожил
  • ****
  • Сообщений: 299
  • Репутация: +0/-0
  • Новичек
    • Просмотр профиля
Спасибо, извините за невнимательность.
19 Сентября 2014, 10:42:43
Ответ #4
  • Новичок
  • *
  • Сообщений: 11
  • Репутация: +0/-0
  • Чайник
    • Просмотр профиля
Добавил новое поле id_employee в БД! Что бы знать кто добавил товар!
1 - Поле обязательно добавлять в класс?
И как происходит вывод товаров в админке? Хочу чтобы все salesman-ы видели тока те товары которые они добавили!
19 Сентября 2014, 10:56:51
Ответ #5
  • Старожил
  • ****
  • Сообщений: 299
  • Репутация: +0/-0
  • Новичек
    • Просмотр профиля
Да, обязательно. В классе описывается новая переменная, которую вы создаете( id_employee): тип переменной, ее размер и т.д.
"Как происходит вывод товаров в админке?". Что вы конкретно имеете ввиду?
19 Сентября 2014, 12:06:58
Ответ #6
  • Ветеран
  • *****
  • Сообщений: 1190
  • Репутация: +28/-1
  • Сообщество PrestaShop
    • Просмотр профиля
Все что написал coder обязательно, добвавлять нужно в класс, в таблицу, контроллер и шаблон.
19 Сентября 2014, 12:12:05
Ответ #7
  • Новичок
  • *
  • Сообщений: 11
  • Репутация: +0/-0
  • Чайник
    • Просмотр профиля
В файле 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'),А вот дальше я встал
19 Сентября 2014, 12:18:53
Ответ #8
  • Новичок
  • *
  • Сообщений: 11
  • Репутация: +0/-0
  • Чайник
    • Просмотр профиля
3. Добавить проверку и сохранение нового поля в контроллер.
Для товара, в файл /controllers/front/ProductController.php
 <- это работа с фрон офисом! Оно мне не надо! Я буду в админке скрывать товары которые добавили другие продавцы!

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

Где тут заморочить поле? где он дергает данные которые выводит в католог товаров?
19 Сентября 2014, 12:22:55
Ответ #9
  • Ветеран
  • *****
  • Сообщений: 13126
  • Репутация: +14553/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Цитировать
5. Для показа нового поля в админке В файле AdminProductsController.php в
Если только для адмики, то изменять нужно файлы админки.
19 Сентября 2014, 12:34:27
Ответ #10
  • Модератор
  • Ветеран
  • *****
  • Сообщений: 32988
  • Репутация: +26759/-0
    • Просмотр профиля
Цитировать
1 - Поле обязательно добавлять в класс?
Не обязательно. Можно сделать модуль и новую таблицу, в которрй связать ИД товара и ИД работника. Тогда ничего добавлять не нужно.
Цитировать
И как происходит вывод товаров в админке?
Вызывается class AdminProductsController и его методы.
19 Сентября 2014, 13:50:52
Ответ #11
  • Новичок
  • *
  • Сообщений: 11
  • Репутация: +0/-0
  • Чайник
    • Просмотр профиля
Добавил
$this->fields_list['id_add_employee'] = array(
'title' => $this->l('ID_EMPLOYEE'),
'align' => 'center',
'orderby' => false,
'filter' => false,
'search' => false
);

В таблице появляется нужный id значит он его дергает! Теперь вопрос! Где AdminProductsController.php делает вывод в католог товаров админки?
19 Сентября 2014, 14:06:48
Ответ #12
  • Ветеран
  • *****
  • Сообщений: 85945
  • Репутация: +25399/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Отключите чпу и в браузере будете видеть названия всех контроллеров.
Каталог > Товары
Показ списка товаров:
/admin/index.php?controller=AdminProducts&token=xxxxРедактировать товар:
/admin/index.php?controller=AdminProducts&id_product=XX&updateproduct&token=xxxxВывод можно сделать в шаблонах, которые подключаются в этом контроллере.
Узнать все шаблоны можно поиском по файлу "tpl".
Шаблоны находяться в папке /admin/themes/default/template/...
19 Сентября 2014, 14:11:56
Ответ #13
  • Новичок
  • *
  • Сообщений: 11
  • Репутация: +0/-0
  • Чайник
    • Просмотр профиля
не дурак вроде! controller=AdminProducts и токен! Вот и где он выводин на экран аминки список товаров? даже не совсем понятно какая функция цепляется!
19 Сентября 2014, 14:31:53
Ответ #14
  • Ветеран
  • *****
  • Сообщений: 85945
  • Репутация: +25399/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Токен - ключ безопасности, не обращаем внимания.
/admin/index.php?controller=AdminProducts&token=xxxx
Вызыв класса AdminProductsController - function __construct().
Инициализация шаблонов function initContent.
Шаблоны /admin/themes/default/template/controllers/products/...