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

17 Октябрь 2015, 13:42:56
Ответ #60
  • Пользователь
  • **
  • Сообщений: 92
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Включить логирование, в скрипте поставить запись в лог при каждом прохождении цикла, так определить причину ошибку. После нахождения причины, можно искать решение как исправть эту ошибку.

Я чувствую, что форумчане сейчас меня за пинают и закидают тухлыми помидорами...
Подскажите, как правильно включить логирование внутри цикла foreach ($images_types as $image_type) чтобы увидеть все этапы прохода этого цикла?
17 Октябрь 2015, 14:28:12
Ответ #61
  • Пользователь
  • **
  • Сообщений: 92
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
$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)
{


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']))));

}
$image->update();
}
17 Октябрь 2015, 17:37:40
Ответ #62
  • Ветеран
  • *****
  • Сообщений: 86694
  • Репутация: +25428/-0
  • Сообщество PrestaShop
    • Просмотр профиля
18 Октябрь 2015, 01:26:30
Ответ #63
  • Пользователь
  • **
  • Сообщений: 92
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Сложил все маты, которые знал + придумал новые.
Терпение моё лопнуло и я добавил одну строку после цикла
copy ($image_path, $newpathurl.'.jpg');
и проблема решилась сама собой.

Но есть ещё одна не маловажная беда, о которой все знают.
Если удалить товар, даже средствами штатной админки, то по какой-то причине автоинкремент во всех таблицах не сбрасывается, например:
Ввёл я ошибочно товар, которому присвоился id 254 автоматически и я его решил удалить - всё супер! удалились записи из ps_product, ps_image и ещё Бог знает откуда... так вот ежели я решу добавить новый товар, то он у меня добавится не с id 254 а с id 255!!! Тоже самое и с картинками!
Я нашёл способ - в mysql не мудрствуя лукаво, написал ALTER TABLE `ps_product` AUTO_INCREMENT=0 и ALTER TABLE `ps_image` AUTO_INCREMENT=0 и перезапустил сервер - о чудо великое случилось в тот "миг" - это минут через 10. Вся нумерация пришла в норму, следующий товар и имиджи создавались с правильной нумерацией! Но каждый раз писать ALTER TABLE `ps_product` AUTO_INCREMENT=0 и перезапускать сервер по 10 минут - не удобно, а если у меня там покупатели сидят и совершают покупки??? Вопрос - как внедрить в престашоп такую инструкцию, которая бы при удалении какого либо товара, сбрасывала бы счётчик id со всех таблиц автоматически? И как сделать так, чтобы не надо было перезапускать сервера?
18 Октябрь 2015, 11:53:44
Ответ #64
  • Модератор
  • Ветеран
  • *****
  • Сообщений: 33325
  • Репутация: +26771/-0
    • Просмотр профиля
Цитировать
я добавил одну строку после цикла
copy ($image_path, $newpathurl.'.jpg');и проблема решилась сама собой.
Понятно в чем проблема. Вот так можно сделать
$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();

// Добавляем копирование основной картинки перед циклом копивария типов изображений
ImageManager::resize($image_path, $newpathurl .'.'.$image->image_format);

foreach ($images_types as $image_type)
{
18 Октябрь 2015, 11:55:12
Ответ #65
  • Модератор
  • Ветеран
  • *****
  • Сообщений: 33325
  • Репутация: +26771/-0
    • Просмотр профиля
Цитировать
Но есть ещё одна не маловажная беда, о которой все знают.
Если удалить товар, даже средствами штатной админки, то по какой-то причине автоинкремент во всех таблицах не сбрасывается,
Это не проблема. Сбрасывать не нужно. Работе prestashop это не мешает.
18 Октябрь 2015, 19:17:10
Ответ #66
  • Пользователь
  • **
  • Сообщений: 92
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Цитировать
Но есть ещё одна не маловажная беда, о которой все знают.
Если удалить товар, даже средствами штатной админки, то по какой-то причине автоинкремент во всех таблицах не сбрасывается,
Это не проблема. Сбрасывать не нужно. Работе prestashop это не мешает.

Работе престашопа это не мешает, согласен, но во всём должен быть порядок! Если я однажды нечаянно загружу товар в количестве 200 штук и потом решу его удалить, то при следующем создании товара id = 401 - а это не правильно, хоть и для престашопа это нормально... ладно, буду пока сбрасывать вручную.
18 Октябрь 2015, 19:22:49
Ответ #67
  • Пользователь
  • **
  • Сообщений: 92
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Как программно выбрать поставщика и назначить его по умолчанию?
18 Октябрь 2015, 23:50:50
Ответ #68
  • Пользователь
  • **
  • Сообщений: 92
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
У меня не происходит заполнение таблицы ps_product_supplier - как её заполнить?
18 Октябрь 2015, 23:59:53
Ответ #69
  • Пользователь
  • **
  • Сообщений: 92
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Как наверное интересно самому задавать вопросы и самому же на них отвечать...
        $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();
19 Октябрь 2015, 10:13:49
Ответ #70
  • Модератор
  • Ветеран
  • *****
  • Сообщений: 33325
  • Репутация: +26771/-0
    • Просмотр профиля
Нужно иногда и самому подумать. Все уже объяснили. Принцип везде один, ссылку на документацию для программитса дали. Как поставщика назначить, как атрибуты добавить и т.д. все там есть.
19 Октябрь 2015, 10:36:39
Ответ #71
  • Ветеран
  • *****
  • Сообщений: 86694
  • Репутация: +25428/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Работе престашопа это не мешает, согласен, но во всём должен быть порядок! Если я однажды нечаянно загружу товар в количестве 200 штук и потом решу его удалить, то при следующем создании товара id = 401 - а это не правильно, хоть и для престашопа это нормально... ладно, буду пока сбрасывать вручную.
Неправильно делать то, что вы хотите. Нельзя сбрасывать индекся в одной таблице товары. Если вы хотите сбросить индексы, то нужно учитывать связи между таблицами. Товар связан с категориями, атрибутами, изображениями. Ид товаров регистируется в сделаных заказах. Чистить придеться во многих таблицах.
19 Октябрь 2015, 13:23:24
Ответ #72
  • Пользователь
  • **
  • Сообщений: 92
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Работе престашопа это не мешает, согласен, но во всём должен быть порядок! Если я однажды нечаянно загружу товар в количестве 200 штук и потом решу его удалить, то при следующем создании товара id = 401 - а это не правильно, хоть и для престашопа это нормально... ладно, буду пока сбрасывать вручную.
Неправильно делать то, что вы хотите. Нельзя сбрасывать индекся в одной таблице товары. Если вы хотите сбросить индексы, то нужно учитывать связи между таблицами. Товар связан с категориями, атрибутами, изображениями. Ид товаров регистируется в сделаных заказах. Чистить придеться во многих таблицах.

Мне деваться некуда, бардак - неприемлем в моём деле. Сейчас изобретаю механизм по очистке счётчиков при удалении товара, если кто нибудь поможет мне - буду очень благодарен.
19 Октябрь 2015, 13:50:54
Ответ #73
  • Ветеран
  • *****
  • Сообщений: 1614
  • Репутация: +32/-1
  • Сообщество PrestaShop
    • Просмотр профиля
Для очистки и оптимизации базы данных в prestashop есть готовый модуль pscleaner.
19 Октябрь 2015, 14:05:44
Ответ #74
  • Пользователь
  • **
  • Сообщений: 92
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Для очистки и оптимизации базы данных в prestashop есть готовый модуль pscleaner.

Жахнул этим модулем всю базу  ;D гы-гы-гы  ;D Хорошо, что резервная копия была.