Автор Тема: Создание товара в базе Prestashop запросами mysql  (Прочитано 14381 раз)

21 Октябрь 2015, 13:58:04
Ответ #105
  • Модератор
  • Ветеран
  • *****
  • Сообщений: 33325
  • Репутация: +26771/-0
    • Просмотр профиля
Цитировать
$product = new Product(5);
Это создаст объект Product, получит данные из бд о товаре с ид 5 и присвоит значения переменным в объекте Product товара ид 5.
21 Октябрь 2015, 14:02:30
Ответ #106
  • Пользователь
  • **
  • Сообщений: 92
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Цитировать
$product = new Product(5);
Это создаст объект Product, получит данные из бд о товаре с ид 5 и присвоит значения переменным в объекте Product товара ид 5.

Не находит товар с id=5 хотя он там есть и создаёт новый товар с другим автоинкриментным id
21 Октябрь 2015, 14:29:43
Ответ #107
  • Пользователь
  • **
  • Сообщений: 92
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Как мне изменить товар с id_product = 5 ?
21 Октябрь 2015, 14:34:33
Ответ #108
  • Модератор
  • Ветеран
  • *****
  • Сообщений: 33325
  • Репутация: +26771/-0
    • Просмотр профиля
У меня находит. В одном модуле есть такой код, на сайте форма с выбором ид товаров.
$id_product  = (int)Tools::getValue('id_product ');
$product = new Product($id_product);
$this->context->smarty->assign('product',$product);
в шаблоне
{$product|var_dump}показывает выбранный товар.
22 Октябрь 2015, 14:01:03
Ответ #109
  • Пользователь
  • **
  • Сообщений: 92
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Ну всё! МоСК взорвался! Больше не могу!!!
include('../../../home/192.168.1.45/www/config/config.inc.php');
//$product = new Product();

$product = new Product();
//$id_product = (int)$product->id;
$product->id = 5;
//$product->ean13 =;
$product->advanced_stock_management = 0;
$product->available_for_order = 1;
$product->active = 1;
$product->show_price = 1;
$product->name = array((int)Configuration::get('PS_LANG_DEFAULT') =>  'Тест');
$product->condition = 'new';
$product->link_rewrite = array((int)Configuration::get('PS_LANG_DEFAULT') =>  'test');
$product->id_manufacturer=1;
$product->id_supplier = 1;
$product->id_tax_rules_group = 0;
$product->redirect_type='404';
$product->indexed=1;
$product->wholesale_price = 0.01;
$product->price = 1.11;
$product->quantity = 3;
$product->minimal_quantity = 1;
$product->depends_on_stock = 1;
$product->warehouse = 1;
$product->on_sale = 0;
$product->id_category = 3;
$product->id_category_default = 3;
$product->add();
$product->addToCategories(array(3));

//print ('id '.$product->id);

$image = new Image(null,Context::getContext()->language->id);
$image->id_product = $product->id;
$image->cover = true;   
$image_path = 'w:\home\192.168.1.45\www\img_import\test.jpg';

$images_types = ImageType::getImagesTypes('products');

if (!$image->add())
    exit(Tools::jsonEncode(array('error' => Tools::displayError('Error save file.'))));
else {
$newpathurl = $image->getPathForCreation();

foreach ($images_types as $image_type)
{
//print ($image_path.' '.$image->id.' ');

if (!ImageManager::resize($image_path, $newpathurl.'-'.Tools::stripslashes($image_type['name']).'.'.
            $image->image_format, $image_type['width'], $image_type['height'], $image->image_format))
            exit(Tools::jsonEncode(array('error' => Tools::displayError('Error creating copy file').
                ' '.Tools::stripslashes($image_type['name']))));

}

copy ($image_path, $newpathurl.'.jpg');

$image->update();
}

// Product supplier

$product_supplier = new ProductSupplier();
$product_supplier->id_product = $product->id;
$product_supplier->id_product_attribute = 0;
$product_supplier->id_supplier = $product->id_supplier;
$product_supplier->product_supplier_price_te = $product->wholesale_price;
$product_supplier->product_supplier_reference = $product->supplier_reference;
$product_supplier->save();

$product->out_of_stock = 2;
$product->save();
StockAvailable::setQuantity($product->id, null, 1);
StockAvailable::setProductOutOfStock($product->id, $out_of_stock );

Этим кодом я создаю товар с картинкой и прочим. Почему-то игнорируется количество - оно всегда 1 шт., а я ставлю 3! $product->quantity = 3;
Товару присваивается id автоинкремента и изменить это (задать другой id товара) я не могу! Вопрос: как мне в коде создать товар с моим ID (я хочу id=5) точно так-же, как это делается в админке при импорте csv в котором id=5 ? Там хоть 25 раз импортируй товар с id=5 и все 25 раз будет перезаписан (изменён) товар с id = 5 - как мне это сделать без csv файла, задавая всё это в скрипте?
22 Октябрь 2015, 14:40:59
Ответ #110
  • Модератор
  • Ветеран
  • *****
  • Сообщений: 33325
  • Репутация: +26771/-0
    • Просмотр профиля
Цитировать
Вопрос: как мне в коде создать товар с моим ID (я хочу id=5)
Никак, если товаров нет. Товар будет создан с ид 1.
Для измения сущесвующего нужно получить данные этого товара, изменить, обновить.
Как получить, уже написано не раз, как изменить тоже. Сохранить измения вот так
$product->update();
22 Октябрь 2015, 14:47:03
Ответ #111
  • Пользователь
  • **
  • Сообщений: 92
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Вы меня не слышите. Файл импорта товара csv содержит колонку "ID" в которой значение 5! При импорте этого файла, независимо от того есть такой товар с таким id или нет всё равно он создаётся с id=5 либо если есть такой товар, то просто переписывается. Как это сделать?
22 Октябрь 2015, 15:01:10
Ответ #112
  • Модератор
  • Ветеран
  • *****
  • Сообщений: 33325
  • Репутация: +26771/-0
    • Просмотр профиля
public function productImport()
{
Написали уже пример.
$product = new Product((int)$info['id']);осталось заменить
(int)$info['id']на свою переменную.
Дальше в функции есть примеры для добавления/изменния.
Например,
// Indexation is already 0 if it's a new product, but not if it's an update
$product->indexed = 0;
$productExistsInDatabase = false;
...
elseif ($productExistsInDatabase) {
    $datas = Db::getInstance()->getRow('
SELECT product_shop.`date_add`
FROM `'._DB_PREFIX_.'product` p
'.Shop::addSqlAssociation('product', 'p').'
WHERE p.`id_product` = '.(int)$product->id, false);
    $product->date_add = pSQL($datas['date_add']);
    $res = $product->update();
}
// If no id_product or update failed
$product->force_id = (bool)$force_ids;

if (!$res) {
    if (isset($product->date_add) && $product->date_add != '') {
        $res = $product->add(false);
    } else {
        $res = $product->add();
    }
}
Если новый товар, сохранить, если существующий, обновить.
22 Октябрь 2015, 15:09:17
Ответ #113
  • Модератор
  • Ветеран
  • *****
  • Сообщений: 22125
  • Репутация: +25303/-1
  • Prestashop - просто и эффективно
    • Просмотр профиля
Вы меня не слышите. Файл импорта товара csv содержит колонку "ID" в которой значение 5! При импорте этого файла, независимо от того есть такой товар с таким id или нет всё равно он создаётся с id=5 либо если есть такой товар, то просто переписывается. Как это сделать?
Не так. Товар не создается. Если он есть, он изменяется.

Создание нового товара с нулевым индексом
$product = new Product();
Создание товара с ид 5
$product = new Product(5);
Эксперт Prestashop - решения всех проблем, написание модулей, создание тем для интернет-магазинов под Prestashop.
Эксперт Magento - создам сайт на Magento, программирование кастомных модулей для Magento, кастомизация тем Magento.
Лучшие цены!!!
22 Октябрь 2015, 15:34:18
Ответ #114
  • Пользователь
  • **
  • Сообщений: 92
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
22 Октябрь 2015, 15:34:51
Ответ #115
  • Пользователь
  • **
  • Сообщений: 92
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Создание нового товара с нулевым индексом
$product = new Product();Создаёт товар с id = id последнего товара +1

Создание товара с ид 5
$product = new Product(5);Тоже самое, так-же создаёт товар с id = id последнего товара +1, но берёт все данные из товара с id=5  если такой существует
22 Октябрь 2015, 15:57:26
Ответ #116
  • Модератор
  • Ветеран
  • *****
  • Сообщений: 33325
  • Репутация: +26771/-0
    • Просмотр профиля
Создание нового товара с нулевым индексом
$product = new Product();Создаёт товар с id = id последнего товара +1

Создание товара с ид 5
$product = new Product(5);Тоже самое, так-же создаёт товар с id = id последнего товара +1, но берёт все данные из товара с id=5  если такой существует

Цитировать
Вопрос: как мне в коде создать товар с моим ID (я хочу id=5)
Никак, если товаров нет. Товар будет создан с ид 1.
Для измения сущесвующего нужно получить данные этого товара, изменить, обновить.
Как получить, уже написано не раз, как изменить тоже. Сохранить измения вот так
$product->update();

Все верно, если товары есть то  id = id последнего товара +1, если нет ид = 1.
В чем вопрос?
22 Октябрь 2015, 16:05:18
Ответ #117
  • Пользователь
  • **
  • Сообщений: 92
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Вопрос в том, как мне создать товар с id=5 если он НЕ существует и перезаписать его если он СУЩЕСТВУЕТ
У меня уже нервный тик.

Девственно пустая база! Есть одна категория с id=3
Хочу создать товар с id=5 и с id_product=5

пишу
$product = new Product(5);
$product-> ... все свойства
$product->save();
запускаю php test_add.php
и получаю товар с id=1
Запускаю скрипт второй раз и получаю товар с id=2 ну и т.д.

Да как же мне без контроллеров создать товар с id=5 и с id_product=5 и если он существует, то как его изменить/заменить ???
22 Октябрь 2015, 16:09:53
Ответ #118
  • Модератор
  • Ветеран
  • *****
  • Сообщений: 22125
  • Репутация: +25303/-1
  • Prestashop - просто и эффективно
    • Просмотр профиля
Создание нового товара с нулевым индексом
$product = new Product();Создаёт товар с id = id последнего товара +1

Создание товара с ид 5
$product = new Product(5);Тоже самое, так-же создаёт товар с id = id последнего товара +1, но берёт все данные из товара с id=5  если такой существует

1. Так и есть. При инициализации индекс нулевой, при сохраниии id последнего товара +1.

2. Когда я создаю товар
$product = new Product(5);или
$product->id = 5;у меня создается товар с ид = 5. Проверял с var_dump.
При сохранении товара ид проверяется, есть он или нет, также соответствует условиям поля id таблицы ps_product.
Если он есть, то товар обновляется. Если его нет или ид меньше существующего, добавляется 1 к последнему ид.
Это проверено и работает на prestashop 1.5 и 1.6.
Эксперт Prestashop - решения всех проблем, написание модулей, создание тем для интернет-магазинов под Prestashop.
Эксперт Magento - создам сайт на Magento, программирование кастомных модулей для Magento, кастомизация тем Magento.
Лучшие цены!!!
22 Октябрь 2015, 16:15:31
Ответ #119
  • Пользователь
  • **
  • Сообщений: 92
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
А как Вы писали?
$product->add(); добавляли или просто $product->save(); ?