Автор Тема: Action. Изменнение товара  (Прочитано 4307 раз)

13 Октябрь 2015, 17:57:28
  • Новичок
  • *
  • Сообщений: 18
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Всем привет, помогите с задачей. Стоит задача, при изменении товара будь то изменение цены, картинки и тп(любого изменения)- статус товара (показ его в каталоге или нет ) должен переходить в нет. Подскажите как такое реализовать? Желательно подробно, так как я чайник) Заранее спасибо.
13 Октябрь 2015, 18:07:54
Ответ #1
  • Ветеран
  • *****
  • Сообщений: 86688
  • Репутация: +25428/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Создать модуль. В функцию install модуля добавить хуки action...
Список хуков и дейстчия этих хуков смотрите на http://doc.prestashop.com/display/PS15/Hooks+in+PrestaShop+1.5
Создать метод измения статуса товара в этих хуках.
13 Октябрь 2015, 18:52:00
Ответ #2
  • Новичок
  • *
  • Сообщений: 18
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
а без создания модуля никак ?
13 Октябрь 2015, 19:22:51
Ответ #3
  • Ветеран
  • *****
  • Сообщений: 1285
  • Репутация: +13/-1
  • Сообщество PrestaShop
    • Просмотр профиля
В классе Product.php в функциях add и update тоже можно менять свойства товара.
$this->active = false;
14 Октябрь 2015, 10:10:08
Ответ #4
  • Новичок
  • *
  • Сообщений: 18
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
В классе Product.php в функциях add и update тоже можно менять свойства товара.
$this->active = false;
Так сделать не получилось, но проблему решил по-другому

Еще один вопрос, при изменении товара нужно показывать какие из полей изменились. Решил сделать след образом при изменении товара проверять значение поля и значение в базе этого поля и если оно отличается заносить имя поля в дополнительное поле в базе и потом его выводить. Но не могу найти место где в базу записываются значения из полей, чтобы вставить там проверку.  В Product.php в методе update нашел часть кода
Db::getInstance()->update('stock', array(
                'reference' => pSQL($this->reference),
                'ean13'     => pSQL($this->ean13),
                'upc'        => pSQL($this->upc),
            ), 'id_product = '.(int)$this->id.' AND id_product_attribute = 0');
но не могу понять а где остальные все поля ? Парни разжуйте мне и покажите где заносятся все поля в базу, где мне вставить мою проверку, подробно если можно. Большое спасибо
14 Октябрь 2015, 10:32:22
Ответ #5
  • Партнер
  • Ветеран
  • ****
  • Сообщений: 22816
  • Репутация: +17143/-1
  • Разработка веб-сайтов и веб-программирование
    • Просмотр профиля
Там же ниже два метода (хука) actionProductSave и actionProductUpdate.
Hook::exec('actionProductSave', array('id_product' => (int)$this->id, 'product' => $this));
Hook::exec('actionProductUpdate', array('id_product' => (int)$this->id, 'product' => $this));
В этих методах и происходит сохрание новых значений.
Интернет-магазин под ключ.
Какой выбрать движок для интернет магазина ?
Какой движок лучше ?
Magento или Prestashop ?
Решение всех Ваших вопросов в создании Интернет-магазина.
14 Октябрь 2015, 11:00:04
Ответ #6
  • Ветеран
  • *****
  • Сообщений: 86688
  • Репутация: +25428/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Цитировать
Еще один вопрос, при изменении товара нужно показывать какие из полей изменились. Решил сделать след образом при изменении товара проверять значение поля и значение в базе этого поля и если оно отличается заносить имя поля в дополнительное поле в базе и потом его выводить.
Для обновления товара используется метод
public function update($null_values = false)
{
Вам нужно создать метод который будет получать значение, сравнивать его с новым и возвращять да/нет и использовать его перед методом update. Пример создания такого метода
public function isNew()в классе Product
14 Октябрь 2015, 11:09:19
Ответ #7
  • Ветеран
  • *****
  • Сообщений: 86688
  • Репутация: +25428/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Там же ниже два метода (хука) actionProductSave и actionProductUpdate.
Hook::exec('actionProductSave', array('id_product' => (int)$this->id, 'product' => $this));
Hook::exec('actionProductUpdate', array('id_product' => (int)$this->id, 'product' => $this));
В этих методах и происходит сохрание новых значений.

Так как prestashop использует объектную модель, это методы add и update
/**
   * Saves current object to database (add or update)
   *
   */
public function save($null_values = false, $auto_date = true)
{
     return (int)$this->id > 0 ? $this->update($null_values) : $this->add($auto_date, $null_values);
}
класса /classes/ObjectModel.php
14 Октябрь 2015, 11:18:11
Ответ #8
  • Модератор
  • Ветеран
  • *****
  • Сообщений: 33325
  • Репутация: +26771/-0
    • Просмотр профиля
Еще один вопрос, при изменении товара нужно показывать какие из полей изменились. Решил сделать след образом при изменении товара проверять значение поля и значение в базе этого поля и если оно отличается заносить имя поля в дополнительное поле в базе и потом его выводить. Но не могу найти место где в базу записываются значения из полей, чтобы вставить там проверку.  В Product.php в методе update нашел часть кода
 Db::getInstance()->update('stock', array(
                'reference' => pSQL($this->reference),
                'ean13'     => pSQL($this->ean13),
                'upc'        => pSQL($this->upc),
            ), 'id_product = '.(int)$this->id.' AND id_product_attribute = 0');
но не могу понять а где остальные все поля ? Парни разжуйте мне и покажите где заносятся все поля в базу, где мне вставить мою проверку, подробно если можно. Большое спасибо
Сравнивать поля нужно в контроллере /controllers/admin/AdminProductsController.php в процессе проверки checkProduct().
14 Октябрь 2015, 11:42:55
Ответ #9
  • Партнер
  • Ветеран
  • ****
  • Сообщений: 22816
  • Репутация: +17143/-1
  • Разработка веб-сайтов и веб-программирование
    • Просмотр профиля
Сравнивать поля нужно в контроллере /controllers/admin/AdminProductsController.php в процессе проверки checkProduct().
Согласен, зачем велосипед изобретать, есть готовый метод в этом контроллере
$this->isProductFieldUpdated('наименование переменной');
Но nakedvoodoo хочет в классе Product.php сравнивать, там этот метод не работает.
Интернет-магазин под ключ.
Какой выбрать движок для интернет магазина ?
Какой движок лучше ?
Magento или Prestashop ?
Решение всех Ваших вопросов в создании Интернет-магазина.
14 Октябрь 2015, 11:53:05
Ответ #10
  • Новичок
  • *
  • Сообщений: 18
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Сравнивать поля нужно в контроллере /controllers/admin/AdminProductsController.php в процессе проверки checkProduct().
Согласен, зачем велосипед изобретать, есть готовый метод в этом контроллере
$this->isProductFieldUpdated('наименование переменной');
Но nakedvoodoo хочет в классе Product.php сравнивать, там этот метод не работает.
Вы меня окончательно запутали ) Сделаю так как лучше и как скажете ) Только, парни, покажите на маленьком примере. Можно ли вас попросить написать мне пример цикла который сравнивает поля обновленые с полями в базе и куда его нужно засунуть в методе checkProduct? :) Если честно сижу с квадратной головой и не понимаю что куда сувать) Я чайник мне нужно на пальцах с примерами обьяснять) если не сложно парни потыкайте меня носом )
14 Октябрь 2015, 11:58:55
Ответ #11
  • Модератор
  • Ветеран
  • *****
  • Сообщений: 33325
  • Репутация: +26771/-0
    • Просмотр профиля
Сравнивать поля нужно в контроллере /controllers/admin/AdminProductsController.php в процессе проверки checkProduct().
Согласен, зачем велосипед изобретать, есть готовый метод в этом контроллере
$this->isProductFieldUpdated('наименование переменной');
Но nakedvoodoo хочет в классе Product.php сравнивать, там этот метод не работает.

Если речь идет о работе в админке, то в контроллере AdminProductsController.php в методе checkProduct используя isProductFieldUpdated
if ($this->isProductFieldUpdated('description_short', $language['id_lang']) && ($value = Tools::getValue('description_short_'.$language['id_lang'])))
{
    // вот тут что-то сделать если короткое описание было изменено
    $this->errors[] = $this->l('Описание было изменено');
....
14 Октябрь 2015, 12:09:11
Ответ #12
  • Новичок
  • *
  • Сообщений: 18
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Так я как понимаю метод  checkProduct() запускается при нажатии кнопки сохранить в админке. И начинает гонять некоторые поля проверяя на валидацию и прочую чушь(остальное не понял :) ). Т.е. мне нужно просто сделать цикл который прогонит все поля в редактировании товара сравнить их со значениями в базе и сделать все что мне нужно если они не совпадают :) Парни, может тупой вопрос не ругайтесь :) , но доступен ли в этой функций массив в котором имя поля-> значение, чтобы я сранивал имя поля с именем поля в базе? Я чайник в ООП поэтому разжуйте мне немного)
Стоп я наверное саму систему не понимаю, потому что в таблице product нету поля с именем продукта и все проверить у меня не получится. Короче я окончательно запутался и не понимаю ничерта. Парни расскажите как работает этот метод checkProduct() что он делает от куда что берет, и как мне сделать то что я хочу (с примером кода), если можно.
14 Октябрь 2015, 14:15:42
Ответ #13
  • Модератор
  • Ветеран
  • *****
  • Сообщений: 33325
  • Репутация: +26771/-0
    • Просмотр профиля
Все связи уже заложенны в престе.  При создании объекта Product вы можете работать со всеми свойствами объекта.
Метод checkProduct проверяет объект Product. Использует при сохранении товара
public function processAdd()
    {
        $this->checkProduct();

        if (!empty($this->errors)) {
            $this->display = 'add';
            return false;
        }

Цитировать
но доступен ли в этой функций массив в котором имя поля-> значение, чтобы я сранивал имя поля с именем поля в базе?
Лучше обозначить объкт, а не массив. Все свойства объекта доступы после его создания, значения доступны после инициализации.
Создание объекта в классе/контроллере
$this->object = new $this->className();Сохранение объекта
$this->object->save();Получение всех свойств объекта
$this->object->getFields()
14 Октябрь 2015, 15:07:21
Ответ #14
  • Новичок
  • *
  • Сообщений: 18
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля

Лучше обозначить объкт, а не массив. Все свойства объекта доступы после его создания, значения доступны после инициализации.
Создание объекта в классе/контроллере
$this->object = new $this->className();Сохранение объекта
$this->object->save();Получение всех свойств объекта
$this->object->getFields()
Наверняка я как-то не так написал но не получилось. Давайте поступим проще, как писали выше
foreach ($список_полей as $field){
if ($this->isProductFieldUpdated($field, $language['id_lang']) && ($value = Tools::getValue('description_short_'.$language['id_lang'])))
{
    // вот тут что-то сделать если короткое описание было изменено
    $this->errors[] = $this->l('Описание было изменено');
....}}
вопрос что сюда запихнуть $список_полей ?
Если так не получится напишите рабочий код. Я понимаю что вы пытаетесь мне обьяснить систему работы, но я не понимаю :( 

Хотя это тоже не рабочий код вставил alert для проверки, всегда его выбивает было изменено поле или нет без разницы...