Импорт из 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
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Но почему он создаёт (create), если в параметре я ему чётко указываю что нужно обновлять (update=1)???
1. как быть с новыми товарами? лучше пользоваться стандартным импортом наверное.
2. Как импортировать товар в 2 категории? (есть parent и есть дерево tree)
2. Думаю да
в базе данных нужная нам таблица — modx_ms2_product_categories
и нам нужен столбец — category_id
через строку импорта
у меня не получилось, но через импорт в таблицу MySQL работает. Вот пример для id 234. Добавляем еще одну мультикатегорию с id 35
БЫЛО
СТАЛО
При импорте в БД только новое значение:
Ничего умнее я пока не придумал. Если у вас получиться с импортом CSV, дайте знать.
p.s. знатоки php и mysql наверное читаю и думают: «вот дебилы… учите матчасть ;)))»