Создание товара в базе Prestashop запросами mysql

Автор Cyrix, 14 октября 2015, 09:53:47

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

Cyrix

Цитата: mistral от 17 октября 2015, 13:31:32
Включить логирование, в скрипте поставить запись в лог при каждом прохождении цикла, так определить причину ошибку. После нахождения причины, можно искать решение как исправть эту ошибку.

Я чувствую, что форумчане сейчас меня за пинают и закидают тухлыми помидорами...
Подскажите, как правильно включить логирование внутри цикла foreach ($images_types as $image_type) чтобы увидеть все этапы прохода этого цикла?

Cyrix

#61

$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();
}


DarinSr


Cyrix

Сложил все маты, которые знал + придумал новые.
Терпение моё лопнуло и я добавил одну строку после цикла

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 со всех таблиц автоматически? И как сделать так, чтобы не надо было перезапускать сервера?

coder

Цитироватья добавил одну строку после цикла
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)
{


coder

ЦитироватьНо есть ещё одна не маловажная беда, о которой все знают.
Если удалить товар, даже средствами штатной админки, то по какой-то причине автоинкремент во всех таблицах не сбрасывается,
Это не проблема. Сбрасывать не нужно. Работе prestashop это не мешает.

Cyrix

Цитата: coder от 18 октября 2015, 11:55:12
ЦитироватьНо есть ещё одна не маловажная беда, о которой все знают.
Если удалить товар, даже средствами штатной админки, то по какой-то причине автоинкремент во всех таблицах не сбрасывается,
Это не проблема. Сбрасывать не нужно. Работе prestashop это не мешает.

Работе престашопа это не мешает, согласен, но во всём должен быть порядок! Если я однажды нечаянно загружу товар в количестве 200 штук и потом решу его удалить, то при следующем создании товара id = 401 - а это не правильно, хоть и для престашопа это нормально... ладно, буду пока сбрасывать вручную.

Cyrix

Как программно выбрать поставщика и назначить его по умолчанию?

Cyrix

У меня не происходит заполнение таблицы ps_product_supplier - как её заполнить?

Cyrix

Как наверное интересно самому задавать вопросы и самому же на них отвечать...

        $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();

coder

Нужно иногда и самому подумать. Все уже объяснили. Принцип везде один, ссылку на документацию для программитса дали. Как поставщика назначить, как атрибуты добавить и т.д. все там есть.

DarinSr

Цитата: Cyrix от 18 октября 2015, 19:17:10
Работе престашопа это не мешает, согласен, но во всём должен быть порядок! Если я однажды нечаянно загружу товар в количестве 200 штук и потом решу его удалить, то при следующем создании товара id = 401 - а это не правильно, хоть и для престашопа это нормально... ладно, буду пока сбрасывать вручную.
Неправильно делать то, что вы хотите. Нельзя сбрасывать индекся в одной таблице товары. Если вы хотите сбросить индексы, то нужно учитывать связи между таблицами. Товар связан с категориями, атрибутами, изображениями. Ид товаров регистируется в сделаных заказах. Чистить придеться во многих таблицах.

Cyrix

Цитата: DarinSr от 19 октября 2015, 10:36:39
Цитата: Cyrix от 18 октября 2015, 19:17:10
Работе престашопа это не мешает, согласен, но во всём должен быть порядок! Если я однажды нечаянно загружу товар в количестве 200 штук и потом решу его удалить, то при следующем создании товара id = 401 - а это не правильно, хоть и для престашопа это нормально... ладно, буду пока сбрасывать вручную.
Неправильно делать то, что вы хотите. Нельзя сбрасывать индекся в одной таблице товары. Если вы хотите сбросить индексы, то нужно учитывать связи между таблицами. Товар связан с категориями, атрибутами, изображениями. Ид товаров регистируется в сделаных заказах. Чистить придеться во многих таблицах.

Мне деваться некуда, бардак - неприемлем в моём деле. Сейчас изобретаю механизм по очистке счётчиков при удалении товара, если кто нибудь поможет мне - буду очень благодарен.

mistral

Для очистки и оптимизации базы данных в prestashop есть готовый модуль pscleaner.

Cyrix

Цитата: mistral от 19 октября 2015, 13:50:54
Для очистки и оптимизации базы данных в prestashop есть готовый модуль pscleaner.

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