Action. Изменнение товара

Автор nakedvoodoo, 13 октября 2015, 17:57:28

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

nakedvoodoo

Всем привет, помогите с задачей. Стоит задача, при изменении товара будь то изменение цены, картинки и тп(любого изменения)- статус товара (показ его в каталоге или нет ) должен переходить в нет. Подскажите как такое реализовать? Желательно подробно, так как я чайник) Заранее спасибо.

DarinSr

Создать модуль. В функцию install модуля добавить хуки action...
Список хуков и дейстчия этих хуков смотрите на http://doc.prestashop.com/display/PS15/Hooks+in+PrestaShop+1.5
Создать метод измения статуса товара в этих хуках.

nakedvoodoo

а без создания модуля никак ?

tigran

#3
В классе Product.php в функциях add и update тоже можно менять свойства товара.
$this->active = false;

nakedvoodoo

#4
Цитата: tigran от 13 октября 2015, 19:22:51
В классе 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');

но не могу понять а где остальные все поля ? Парни разжуйте мне и покажите где заносятся все поля в базу, где мне вставить мою проверку, подробно если можно. Большое спасибо

mAgency

Там же ниже два метода (хука) 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 ?
Решение всех Ваших вопросов в создании Интернет-магазина.

DarinSr

ЦитироватьЕще один вопрос, при изменении товара нужно показывать какие из полей изменились. Решил сделать след образом при изменении товара проверять значение поля и значение в базе этого поля и если оно отличается заносить имя поля в дополнительное поле в базе и потом его выводить.
Для обновления товара используется метод
public function update($null_values = false)
{

Вам нужно создать метод который будет получать значение, сравнивать его с новым и возвращять да/нет и использовать его перед методом update. Пример создания такого метода
public function isNew()
в классе Product

DarinSr

Цитата: mAgency от 14 октября 2015, 10:32:22
Там же ниже два метода (хука) 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

coder

Цитата: nakedvoodoo от 14 октября 2015, 10:10:08
Еще один вопрос, при изменении товара нужно показывать какие из полей изменились. Решил сделать след образом при изменении товара проверять значение поля и значение в базе этого поля и если оно отличается заносить имя поля в дополнительное поле в базе и потом его выводить. Но не могу найти место где в базу записываются значения из полей, чтобы вставить там проверку.  В 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().

mAgency

#9
Цитата: coder от 14 октября 2015, 11:18:11
Сравнивать поля нужно в контроллере /controllers/admin/AdminProductsController.php в процессе проверки checkProduct().
Согласен, зачем велосипед изобретать, есть готовый метод в этом контроллере
$this->isProductFieldUpdated('наименование переменной');

Но nakedvoodoo хочет в классе Product.php сравнивать, там этот метод не работает.
Интернет-магазин под ключ.
Какой выбрать движок для интернет магазина ?
Какой движок лучше ?
Magento или Prestashop ?
Решение всех Ваших вопросов в создании Интернет-магазина.

nakedvoodoo

Цитата: mAgency от 14 октября 2015, 11:42:55
Цитата: coder от 14 октября 2015, 11:18:11
Сравнивать поля нужно в контроллере /controllers/admin/AdminProductsController.php в процессе проверки checkProduct().
Согласен, зачем велосипед изобретать, есть готовый метод в этом контроллере
$this->isProductFieldUpdated('наименование переменной');

Но nakedvoodoo хочет в классе Product.php сравнивать, там этот метод не работает.
Вы меня окончательно запутали ) Сделаю так как лучше и как скажете ) Только, парни, покажите на маленьком примере. Можно ли вас попросить написать мне пример цикла который сравнивает поля обновленые с полями в базе и куда его нужно засунуть в методе checkProduct? :) Если честно сижу с квадратной головой и не понимаю что куда сувать) Я чайник мне нужно на пальцах с примерами обьяснять) если не сложно парни потыкайте меня носом )

coder

#11
Цитата: mAgency от 14 октября 2015, 11:42:55
Цитата: coder от 14 октября 2015, 11:18:11
Сравнивать поля нужно в контроллере /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('Описание было изменено');
....

nakedvoodoo

#12
Так я как понимаю метод  checkProduct() запускается при нажатии кнопки сохранить в админке. И начинает гонять некоторые поля проверяя на валидацию и прочую чушь(остальное не понял :) ). Т.е. мне нужно просто сделать цикл который прогонит все поля в редактировании товара сравнить их со значениями в базе и сделать все что мне нужно если они не совпадают :) Парни, может тупой вопрос не ругайтесь :) , но доступен ли в этой функций массив в котором имя поля-> значение, чтобы я сранивал имя поля с именем поля в базе? Я чайник в ООП поэтому разжуйте мне немного)
Стоп я наверное саму систему не понимаю, потому что в таблице product нету поля с именем продукта и все проверить у меня не получится. Короче я окончательно запутался и не понимаю ничерта. Парни расскажите как работает этот метод checkProduct() что он делает от куда что берет, и как мне сделать то что я хочу (с примером кода), если можно.

coder

Все связи уже заложенны в престе.  При создании объекта 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()

nakedvoodoo

#14
Цитата: coder от 14 октября 2015, 14:15:42

Лучше обозначить объкт, а не массив. Все свойства объекта доступы после его создания, значения доступны после инициализации.
Создание объекта в классе/контроллере
$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 для проверки, всегда его выбивает было изменено поле или нет без разницы...