<?php
// Карта категорий MODX
$categoryIds = [
'Гибридная бесперебойная система' => 2813,
'Сетевые станции' => 2814,
'Автономия' => 2815,
'Бесперебойник' => 2816,
'Монокристалл' => 2818,
'Поликристалл' => 2819,
'Раскладные' => 2820,
'Гибкие' => 2821,
'MPPT' => 2823,
'PWM' => 2824,
'Инверторы с подмешиванием' => 2826,
'ИБП' => 2827,
'Гибридные' => 2828,
'Инверторы 220' => 2829,
'Сетевые инверторы' => 2830,
'Портативные зарядные станции' => 2831,
'Зарядные устройства' => 2832,
'LiFePO4' => 2834,
'GeI' => 2835,
'AGM' => 2836,
'CARBON' => 2837,
'Автоматы переменного тока' => 2839,
'Автоматы постоянного тока' => 2840,
'Предохранители и диоды' => 2841,
'Прочее защитное оборудование' => 2842,
'Тепловые насосы' => 2843,
'Кровельные конструкции' => 2845,
'Степлажи' => 2846,
'Регулируемые конструкции' => 2848,
'Аккумуляторы' => 2850,
'Солнечные батареи' => 2851,
'Контроллеры заряда' => 2852,
'Ветрогенераторы' => 2854,
'Комплектующие' => 2855,
'Провода' => 2856,
'Коннекторы и перемычки' => 2857,
'Распределительные щитки' => 2858,
'Балансиры' => 2859,
'Мониторинг' => 2860,
'Прочие комплектующие' => 2861,
'Прочее' => 2862,
];
// Путь для временной папки с изображениями
$tmpImagesDir = MODX_BASE_PATH . 'tmpimages/';
if (!is_dir($tmpImagesDir)) {
mkdir($tmpImagesDir, 0755, true);
}
// Получаем JSON-данные от API
$data = $modx->runSnippet('importProductsFromWP');
$products = json_decode($data, true);
if (!$products || !is_array($products)) {
return 'Нет товаров для импорта';
}
$count = 0;
foreach ($products as $item) {
$title = $item['title'] ?? 'Без названия';
$description = $item['description'] ?? '';
$price = $item['price'] ?? 0;
$article = $item['sku'] ?? '';
$categories = $item['categories'] ?? [];
if (!$article || empty($categories)) {
continue;
}
// Определяем parent по категориям
$parentId = 0;
foreach ($categories as $catName) {
if (isset($categoryIds[$catName])) {
$parentId = $categoryIds[$catName];
break;
}
}
if ($parentId === 0) {
continue;
}
// Ищем товар по артикулу в msProductData
$productData = $modx->getObject('msProductData', ['article' => $article]);
if (!$productData) {
// Новый товар
$product = $modx->newObject('msProduct');
$product->fromArray([
'pagetitle' => $title,
'alias' => $modx->sanitizeString($title),
'published' => 1,
'template' => 5,
'parent' => $parentId,
'class_key' => 'msProduct',
]);
$product->save();
// Создаём и заполняем msProductData
$productData = $modx->newObject('msProductData');
$productData->set('id', $product->get('id'));
$productData->set('article', $article);
} else {
// Обновление существующего товара
$product = $modx->getObject('msProduct', $productData->get('id'));
if (!$product) {
// Если товар не найден, создаём новый
$product = $modx->newObject('msProduct');
$product->fromArray([
'pagetitle' => $title,
'alias' => $modx->sanitizeString($title),
'published' => 1,
'template' => 5,
'parent' => $parentId,
'class_key' => 'msProduct',
]);
$product->save();
$productData->set('id', $product->get('id'));
}
}
// Обновляем общие поля продукта
$product->fromArray([
'pagetitle' => $title,
'parent' => $parentId,
]);
$product->save();
// Обновляем данные msProductData
$productData->set('price', $price);
$productData->save();
$productId = $product->get('id');
// Устанавливаем TV-поля
if (!empty($item['attributes'])) {
$attributes = $item['attributes'];
if (!empty($attributes['pa_power'][0])) {
$product->setTVValue('power', $attributes['pa_power'][0]);
}
if (!empty($attributes['pa_warranty'][0])) {
$product->setTVValue('guarantee', $attributes['pa_warranty'][0]);
}
}
// Обновляем msProductData с дополнительными атрибутами
if (!empty($item['attributes'])) {
$dataObject = $product->getOne('Data');
if ($dataObject) {
foreach ($item['attributes'] as $key => $value) {
$optionKey = strtolower(trim($key));
if (is_array($value)) {
$value = implode(', ', $value);
}
$dataObject->set($optionKey, $value);
}
$dataObject->save();
}
}
// Обработка изображений через процессор с временной папкой
if (!empty($item['images']) && is_array($item['images'])) {
foreach ($item['images'] as $imgUrl) {
$filename = basename(parse_url($imgUrl, PHP_URL_PATH));
$destination = $tmpImagesDir . $filename;
$imageContent = @file_get_contents($imgUrl);
if ($imageContent !== false) {
file_put_contents($destination, $imageContent);
$response = $modx->runProcessor('gallery/upload', [
'id' => $productId,
'name' => $filename,
'file' => $destination,
], [
'processors_path' => MODX_CORE_PATH . 'components/minishop2/processors/mgr/',
]);
if ($response->isError()) {
error_log("Ошибка загрузки изображения: " . print_r($response->getAllErrors(), true));
}
unlink($destination);
}
}
}
$count++;
}
return "Импорт завершен. Создано/обновлено товаров: {$count}";
/home/users/j/j84149400/domains/j84149400.myjino.ru/core/xpdo/om/xpdoobject.class.php : 240) Error 42S22 executing statement:
Array
(
[0] => 42S22
[1] => 1054
[2] => Unknown column 'msProduct.article' in 'WHERE'
)
{if $_modx->resource.headerMain == 'Шапка-1'}
{'header1'|chunk}
{elseif $_modx->resource.headerMain == 'Шапка-2'}
{'header2'|chunk}
{elseif $_modx->resource.headerMain == 'Шапка-3'}
{'header3'|chunk}
{elseif $_modx->resource.headerMain == 'Шапка-4'}
{'header4'|chunk}
{/if}
В данный момент код вот такой.