Бакрин Андрей
13 нояб. 2017 г., 19:43

modImporter импорт из ссылки со стороннего сайта

В блоге Песочница

Добрый день. В настройках импорта есть пункт: "Формат импорта", где можно выбрать Файл или Ссылка. Правильно ли я понимаю, что Ссылка - это когда нужно импортировать с другого сайта и у меня есть ссылка, например, на прайс в формате YML? Спасибо.
Добрый день.

К сожалению, Ссылка - не работает. Этот функционал закладывался именно под это, но не был реализован, вероятно, из-за того, что в расширяющем процессоре совсем не сложно прописать импорт внешнего файла по ссылке. CURL в помощь.
Идет женщина, попарку, вдруг слышит голос из кустов. Инна, Инна!!!! Подходит к кустам, а там лежит вжопу пьяный мужик и зовет кого-то. Инна, Инна!!!! Женщина наклоняется, к мужику и говорит. Я не Инна, я Наташа. А
✅✅✅✅ 15 ООО рублей в день работая 15-20 минут за компьютером или ноутбуком!

✅✅✅✅ Pабoта для жeлaющих сaйт http://delocentr.ru
Николай, подскажите, пожалуйста, куда смотреть и в чем моя ошибка. Делаю импорт из yml. Категории создаются отлично, обновляются тоже. С товарами же такая беда: один товар создается и идет ошибка "Что-то пошло не так...". В консоли вижу такие ошибки:

(ERROR @ /core/xpdo/om/xpdoobject.class.php : 1452) Error 23000 executing statement: INSERT INTO `smgn_modimporter_objects` (`tmp_object_type`, `tmp_external_key`, `tmp_import_id`, `tmp_parent`, `tmp_title`, `tmp_content`, `tmp_processed`, `tmp_error`, `tmp_raw_data`) VALUES ('category', '', 1, '3', '', '', '0', 0, 'a:1:{s:9:\"pagetitle\";s:0:\"\";}') Array ( [0] => 23000 [1] => 1062 [2] => Duplicate entry 'category' for key 'tmp_external_key' ) (ERROR @ /core/xpdo/om/xpdoobject.class.php : 811) msCategory: Attempt to set NOT NULL field parent to NULL (ERROR @ /core/xpdo/om/xpdoobject.class.php : 811) msCategory: Attempt to set NOT NULL field parent to NULL (ERROR @ /core/xpdo/om/xpdoobject.class.php : 811) msCategory: Attempt to set NOT NULL field parent to NULL (ERROR @ /core/xpdo/om/xpdoobject.class.php : 811) msCategory: Attempt to set NOT NULL field parent to NULL (ERROR @ /core/xpdo/om/xpdoobject.class.php : 811) msCategory: Attempt to set NOT NULL field parent to NULL

Андрей, вам же четко пишет ошибку: Duplicate entry 'category' for key 'tmp_external_key'.
То есть вы пытаетесь в таблицу временных данных создать сразу несколько записей с одинаковым ключом. В данном случае у вас конфликтное значение - '', то есть пустая строка. Пустая строка - это тоже значение. Если этой блокировки по неуникальным данным не будет, у вас дубли наплодятся. Скорее всего это произошло в следствии того, что вы не указали при импорте уникальный ключ для категорий (то есть каждая запись должна иметь внешний ключ (1С-артикул или типа того)). Это необходимо не только для предотвращения появления дублей, но и для того, чтобы в дальнейшем при повторном импорте выполнялось обновление ранее существующих данных, а не создание каждый раз новых объектов.

А Attempt to set NOT NULL field parent to NULL - это MODX-ошибка. Вы пытаетесь создать документ без указания поля parent. Даже если родителя у документа нет, у него parent должен быть установлен 0.
Николай, странно, откуда у меня эта ошибка. Попробовал на чистом сайте импортировать - все залетело без проблем. А может быть из-за версии 2.6.0 ошибка? Или из-за того что в БД у меня уже много всего?
Так вы попробуйте теперь на ту чистую еще пару раз поверх прогнать. Но может на рабочем сайте структурные изменения каталога какие-то проводили.
Николай, нашел причину того, почему импорт не работал. Не работает он на новой версии 2.6.0 из-за нового события OnResourceCacheUpdate. Честно говоря, не знаю для чего это событие, но вот этот фикс проблему решил: https://github.com/modxcms/revolution/commit/719c29231279b44cd9a6f5cd5a49f181a44a63dd
Ну, это вообще проблема никак не связанная с модимпортером. Та ошибка в принципе фатальная и в случае ее возникновения php разваливаться будет.
Ну а может из-за это фатальной ошибки вываливаться импорт?
Конечно может, ведь весь php-процесс разваливался. Импортер создает документы. При сохранении документа вызывался несуществующий метод ($this->modx->invokeEvent вместо $this->xpdo->invokeEvent), из-за чего выполнение разваливалось.
Но это не имеет никакого отношения к Duplicate entry 'category' for key 'tmp_external_key'. Вот прям вообще никакого. Про это я написал в первом комментарии.
Так, с этим понял. А подскажите, как задать уникальный ключ, если например поле артикула у меня отсутствует? Использовать для этого ID документа в файле импорта? В коде это задается здесь?

protected function prepareCategoryUpdateData(array $data) { if ($data['tmp_parent']) { $parent = $this->modx->getObject('msCategory', array('externalKey' => $data['tmp_parent']))->id; } else { $parent = $data['category_parent']; } $data = array_merge($data, array( 'class_key' => 'msCategory', 'id' => $data['category_id'], // Устанавливаем id документа 'pagetitle' => $data['tmp_raw_data']['pagetitle'], 'published' => 1, 'parent' => $parent, )); return $data; }

Нет, этот метод используется уже непосредственно для обновления категорий, то есть когда временные данные уже записаны во временную таблицу и взяты для обновления категорий на сайте. Вам нужен метод StepWriteTmpCategories, то есть тот, в котором готовятся данные для записи во временную таблицу.
Какой вы ключ будете использовать для задания уникальности - это уже ваше дело. Вы сами что для себя логически там используете? Названия категорий? Если да, и если они уникальные, то да, можете их и использовать. Только имейте ввиду, что поле ключа ограничено по длине (смотрите системные настройки в modImporter, а лучше прям в базе данных смотрите структуру таблицы modx_site_content). Если так, то можете брать md5() заголовка. Тогда длина ключа будет фиксированное, а значение уникальное. Но в таком случае, если у вас заголовок в данных импорта хоть на символ изменится, будет создана новая категория.

Добавить комментарий