Импорт из CSV не срабатывает правильно
Обновляю ресурсы скриптом для импорта bezumkin.ru/modx/minishop2/import/2309/.
1. Можно ли указывать в качестве ключа id ресурса?
2. Почему такой вызов создаёт новую строчку в базе, а не обновляет ресурс по id?
3. Почему не импортирует без pagetitle и без alias? (Решение дальше)
UPD:
Решил проблему своим скриптом на основе скрипта для импорта. Обновляю напрямую только те поля, что мне нужны минуя процессоры. Не претендую на изящное решение, но костыль оказался рабочим.
Вылаживаю его код больше для себя, чтобы потом легче было найти:
UPD2:
Решил перенести статью в Готовые решения, т.к. я сам долго доходил до этого простого, но нужного кода!
А ещё нашел много похожих вопросов тут, типа почему не импортируется без алиасов и без pagetitle, а только по id.
1. Можно ли указывать в качестве ключа id ресурса?
2. Почему такой вызов создаёт новую строчку в базе, а не обновляет ресурс по id?
3. Почему не импортирует без pagetitle и без alias? (Решение дальше)
php ./core/components/minishop2/import/csv.php "core/import/ru.csv" "id,tv2,longtitle,description,tv1" 1 "id" 1 ";"
… решение дальше ..UPD:
Решил проблему своим скриптом на основе скрипта для импорта. Обновляю напрямую только те поля, что мне нужны минуя процессоры. Не претендую на изящное решение, но костыль оказался рабочим.
Вылаживаю его код больше для себя, чтобы потом легче было найти:
<?php
ini_set("display_errors",1);
error_reporting(E_ALL);
header("Content-Type: text/html; charset=utf-8");
// Подключаем
define('MODX_API_MODE', true);
require 'index.php';
// Включаем обработку ошибок
$modx->getService('error','error.modError');
$modx->setLogLevel(modX::LOG_LEVEL_INFO);
$modx->setLogTarget(XPDO_CLI_MODE ? 'ECHO' : 'HTML');
$file = 'import/ru.csv'; // имя файла
$delimeter = ';'; // разделитель
$handle = fopen($file, "r");
$rows = $updated = 0;
while (($csv = fgetcsv($handle, 0, $delimeter)) !== false) {
$rows ++;
// определяем в переменные столбцы из файла
$id = $csv[0];
$old_url = $csv[1]; // тв
$longtitle = $csv[2];
$description = $csv[3];
$keywords = $csv[4]; // тв
$s1="UPDATE modx_site_content SET longtitle='$longtitle', description='$description' where id ='$id'";
if($modx->exec($s1)) {
// устанавливаем тв-шки
$page = $modx->getObject('modResource', $id);
$page->setTVValue('keywords', $keywords);
$page->setTVValue('old-url', $old_url);
$updated++;
}
}
fclose($handle);
echo '<pre>';
echo "\nImport complete in ".number_format(microtime(true) - $modx->startTime, 7) . " s\n";
echo "\nTotal rows: $rows\n";
echo "Updated: $updated\n";
echo '</pre>';
UPD2:
Решил перенести статью в Готовые решения, т.к. я сам долго доходил до этого простого, но нужного кода!
А ещё нашел много похожих вопросов тут, типа почему не импортируется без алиасов и без pagetitle, а только по id.
Поблагодарить автора
Отправить деньги
Комментарии: 9
Хочу обновить данные из обычных ресурсов (не минишоповских). Может что-то ему не хватает?
Или мне выгрузить все alias-ы и поставить их отдельной колонкой в csv и по алиасу обновлять? Правда пока не представляю себе как их выгрузить в том же порядке чтобы сопоставить строки…
Отключил системный параметр automatic_alias, и посыпались ошибки типа:
Error on create: alias: field_required
Но почему он создаёт (create), если в параметре я ему чётко указываю что нужно обновлять (update=1)???
Решил проблему своим скриптом на основе этого. Там я обновил нужные поля напрямую, минуя процессоры.
У меня два вопроса:
1. как быть с новыми товарами? лучше пользоваться стандартным импортом наверное.
2. Как импортировать товар в 2 категории? (есть parent и есть дерево tree)
1. как быть с новыми товарами? лучше пользоваться стандартным импортом наверное.
2. Как импортировать товар в 2 категории? (есть parent и есть дерево tree)
1. Да, лучше стандартным импортом
2. Думаю да
2. Думаю да
2. предложенный выше вариант не работает (
в базе данных нужная нам таблица — modx_ms2_product_categories
и нам нужен столбец — category_id
через строку импорта
БЫЛО
p.s. знатоки php и mysql наверное читаю и думают: «вот дебилы… учите матчасть ;)))»
в базе данных нужная нам таблица — modx_ms2_product_categories
и нам нужен столбец — category_id
через строку импорта
...&fields=pagetitle,id,category_id....
у меня не получилось, но через импорт в таблицу MySQL работает. Вот пример для id 234. Добавляем еще одну мультикатегорию с id 35БЫЛО
INSERT INTO `modx_ms2_product_categories` (`product_id`, `category_id`) VALUES
(234, 7),
(234, 185),
(234, 208),
(234, 210);
СТАЛОINSERT INTO `modx_ms2_product_categories` (`product_id`, `category_id`) VALUES
(234, 7),
(234, 35),
(234, 185),
(234, 208),
(234, 210);
При импорте в БД только новое значение:INSERT INTO `modx_ms2_product_categories` (`product_id`, `category_id`) VALUES
(234, 35);
Ничего умнее я пока не придумал. Если у вас получиться с импортом CSV, дайте знать.p.s. знатоки php и mysql наверное читаю и думают: «вот дебилы… учите матчасть ;)))»
Подскажите, пожалуйста, есть ли необходимость в пошаговой обработке данным скриптом, если ресурсов, например, более 1000?
даже если больше 200
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.