Добрый день. В настройках импорта есть пункт: "Формат импорта", где можно выбрать Файл или Ссылка. Правильно ли я понимаю, что Ссылка - это когда нужно импортировать с другого сайта и у меня есть ссылка, например, на прайс в формате YML? Спасибо.
К сожалению, Ссылка - не работает. Этот функционал закладывался именно под это, но не был реализован, вероятно, из-за того, что в расширяющем процессоре совсем не сложно прописать импорт внешнего файла по ссылке. CURL в помощь.
Идет женщина, попарку, вдруг слышит голос из кустов. Инна, Инна!!!!
Подходит к кустам, а там лежит вжопу пьяный мужик и зовет кого-то. Инна,
Инна!!!! Женщина наклоняется, к мужику и говорит. Я не Инна, я Наташа. А
Николай, подскажите, пожалуйста, куда смотреть и в чем моя ошибка. Делаю импорт из yml. Категории создаются отлично, обновляются тоже. С товарами же такая беда: один товар создается и идет ошибка "Что-то пошло не так...". В консоли вижу такие ошибки:
(ERROR @ /core/xpdo/om/xpdoobject.class.php :1452) Error 23000 executing statement:INSERTINTO`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 NOTNULL field parent to NULL(ERROR @ /core/xpdo/om/xpdoobject.class.php :811) msCategory: Attempt to set NOTNULL field parent to NULL(ERROR @ /core/xpdo/om/xpdoobject.class.php :811) msCategory: Attempt to set NOTNULL field parent to NULL(ERROR @ /core/xpdo/om/xpdoobject.class.php :811) msCategory: Attempt to set NOTNULL field parent to NULL(ERROR @ /core/xpdo/om/xpdoobject.class.php :811) msCategory: Attempt to set NOTNULL field parent to NULL
Андрей, вам же четко пишет ошибку: Duplicate entry 'category'for key 'tmp_external_key'.
То есть вы пытаетесь в таблицу временных данных создать сразу несколько записей с одинаковым ключом. В данном случае у вас конфликтное значение - '', то есть пустая строка. Пустая строка - это тоже значение. Если этой блокировки по неуникальным данным не будет, у вас дубли наплодятся. Скорее всего это произошло в следствии того, что вы не указали при импорте уникальный ключ для категорий (то есть каждая запись должна иметь внешний ключ (1С-артикул или типа того)). Это необходимо не только для предотвращения появления дублей, но и для того, чтобы в дальнейшем при повторном импорте выполнялось обновление ранее существующих данных, а не создание каждый раз новых объектов.
А Attempt to set NOTNULL field parent to NULL - это MODX-ошибка. Вы пытаетесь создать документ без указания поля parent. Даже если родителя у документа нет, у него parent должен быть установлен 0.
Николай, странно, откуда у меня эта ошибка. Попробовал на чистом сайте импортировать - все залетело без проблем. А может быть из-за версии 2.6.0 ошибка? Или из-за того что в БД у меня уже много всего?
Конечно может, ведь весь php-процесс разваливался. Импортер создает документы. При сохранении документа вызывался несуществующий метод ($this->modx->invokeEvent вместо $this->xpdo->invokeEvent), из-за чего выполнение разваливалось.
Но это не имеет никакого отношения к Duplicate entry 'category'for key 'tmp_external_key'. Вот прям вообще никакого. Про это я написал в первом комментарии.
Так, с этим понял. А подскажите, как задать уникальный ключ, если например поле артикула у меня отсутствует? Использовать для этого ID документа в файле импорта? В коде это задается здесь?
protectedfunctionprepareCategoryUpdateData(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() заголовка. Тогда длина ключа будет фиксированное, а значение уникальное. Но в таком случае, если у вас заголовок в данных импорта хоть на символ изменится, будет создана новая категория.