Столкнулся я на днях с одной проблемой — нужно было сделать импорт пары xml-файлов в инфоблоки битрикса по крону. Собственно, это совершенно не проблема, но хотелось реализовать её полностью на API битрикса. И тут началось самое интересное.
Bitrix вообще-то умеет работать с xml. А версии 6.5 там вообще много чего хорошего появилось, типа пошагового импорта из xml/CommerceML. Но вот незадача — в документации нет ни слова про то, как работать с xml’ем через API.
Дело было ясное, что дело темное. Класс такой есть, но просто он не описан в документации. Так и оказалось. Подтверждение этому я нашел на партнерском форуме. Но всё, что там было сказано, так это о существовании класса CDataXML и о том, что он не описан в документации. Больше никаких упоминаний о битриксе и ручном иморте из xml мной найдено не было, что еще раз подтверждает мою теорию о том, что битриксом никто не пользуется хоть как-то глубже создания инфоблоков и их наполнения.
С горем пополам я нашел этот класс и то, как им пользоваться. Подключать класс, оказывается, нужно ручками. Ядро его не поддерживает по-умолчанию.
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/classes/general/xml.php");
Дальше всё просто — создаем новый объект и скармливаем в него либо файл либо строку с xml. Причем файлы он кушает только локально и проверяет их на существование. Поэтому если надо что-то взять извне, то это что-то надо либо в строку запихнуть ручками, либо слить на текущий сервер.
$objXML = new CDataXML();
$objXML->Load($_SERVER['DOCUMENT_ROOT'].$file);
$arResult = $objXML->GetArray();
$arResult и будет наш массив. С ним уже работать просто.
Если нужно получить данные из строки, то делаем так:
objXML->LoadString($xmlstring);
На самом деле, тут нет ничего сложного, просто нигде в документации/форуме не описано как с этим работать. Вот я и подумал, что может это кому-то пригодиться.
В итоге весь код импорта xml уложился в 20 строк с проверкой обновлений элементов. А вывод того, что получилось — и вообще 0 строк кода :). Все про все заняло минут 20. За это я и люблю bitrix. Еще больше буду любить, когда в документацию все-таки внесут все, что есть в API.
***
И немного про Altastat. Пока мне там всё нравится! Контекст на каталоге сайтов и еще на одном… не знаю как его назвать… в общем сайте работает неплохо. Есть клики по 30 центов. Правда проверка бидов в интерфейсе альтастата что-то не работает, поэтому не могу посчитать что к чему. Так же мои сайты были одобрены для программы альтамедиа. Рич пока не пробовал, т.к. он итак сейчас откручивается неплохо. А вот топлайн включил, т.к. в adgravity топлайна всё еще нет. За сегодня уже 12 тысяч оплаченых показов. По 50 центов за 1000. Думаю, за сутки будет тысяч 30 или даже больше. 15 баксов в день-то не лишние :). И еще один большой плюс этой программы — у неё пока мало участников. Большой простор для привлечения рефералов.
Не могли бы Вы поподробнее рассказать об этом: где и какие модули подключить и как осуществить импорт XML файлов через API, не открывая БИТРИКС. Заранее Вым благодарен.
Не открывая битрикс — это как?
Вообще в документации по битриксу все расписано. Модуль нужен только CMain. Дополнительно ничего подключать не нужно.
>> «В итоге весь код импорта xml уложился в 20 строк с проверкой обновлений элементов»
А можно узнать эти 20 строк? Я так понял, что этот код:
$objXML = new CDataXML();
$objXML->Load($_SERVER[‘DOCUMENT_ROOT’].$file);
$arResult = $objXML->GetArray();
Создает из xml’a массив, а вот как дальше распихать этот массив по инфоблокам непонятно.
Заранее спасибо)
@Al так это ж элементарно.
Пройтись по нему циклом, и через API запихать ($b=new CIBlockElement; $b->Add($array));
все есть в документации
Спасибо за оперативность)
А можно рабочий пример? Так будет гораздо нагляднее.
В экспортированном xml’e все как то хитро переплетено, по уму бы сделать иерархию понятную вроде:
Тут все понятно было бы, создать новый тип инфоблока, передать в него массив «тип инфоблока», потом создать инфоблок и передать в него массив «инфоблок». И на третьем этапе для каждого элемента массива «элементы» создать соответственно элемент.
На деле у меня примерно такая структура просматривается, хотя может я как то криво смотрю:
Тут свойства самого типа инфоблока
И фиг пойми как оттуда данные вытаскивать.
Блин. Все тэги обрезало(((
Ладно попробуем подругому. В прошлом посте первый вариант, тот который хотелось бы видеть:
<хмл
<тип инфоблока
</тип инфоблока
<инфоблок
</инфоблок
<элементы
</элементы
</хмл
Второй вариант который у меня на самом деле из экспортированного файла:
<хмл
<инфоблок
</инфоблок
<тип инфоблока
Тут свойства самого типа инфоблока
<элементы
</элементы
</тип инфоблока
</хмл
И фиг пойми как оттуда данные вытаскивать.
Ну конкретный пример сложно привести. У меня было достаточно просто. Я руками создал инфоблок и все свойства его, а потом тупо туда засовывал данные из xml-массива. Скажу чествно, уже не помню, для какого проекта я это делал, ибо запись двухлетней давности :). Найти будет непросто.
ну смотри, после $arResult = $objXML->GetArray(); у тебя получается массив $arResult;
сделай ему print_r($arResult) и вся структура массива сразу станет видна. А дальше тупо циклами там ходишь и всё.
>> «ну смотри, после $arResult = $objXML->GetArray(); у тебя получается массив $arResult;
сделай ему print_r($arResult) и вся структура массива сразу станет видна.»
Да я собственно так и сделал)
После такого импорта arResult получается точно такой как xml, то есть все вложенные тэги это подмассивы.
Ту загадочную структуру xml которую создает битрикс я уже привел выше во втором варианте
Просто циклами там не получиться там придется как то похитрому делать) Я так думаю руками придется указывать все кроме самих элементов, а их как раз циклом сделать.
Ладно, спасибо за пояснения буду пробовать)
А толку от таких сложных действий никакого.
ImportXMLFile(«/load_xml/».$file_xml[$i], $iblock_type=»schedule», $site_id=false, $section_action=»D», $element_action=»D», $use_crc=false, $preview=false);
И все.
2 itizhru
ImportXMLFile (http://dev.1c-bitrix.ru/api_help/iblock/classes/ciblockcmlimport/index.php) не позволяет сделать настраиваемой загрузку, т.е. делает импорт только из файла типа CommerceML2
importxmlfile делает импорт в инфоблок
а порой нужно просто работать с xml
Писал не раз парсеры xml для импорта в битрикс. Битриксовский класс, конечно, хорош, но на больших объёмах данных отваливается. Пихать в массив весь импортируемый файл это всё-таки не тру)
Прошу помощи: есть ли в битриксе возможность через API записать в инфоблок информацию не представлению в XML. У меня есть строки: заголовок статьи и ее краткое содержание. Мне их необходимо записать в уже существующий инфоблок.
Буду благодарна за любую информацию.
Конечно можно. API очень развесистый, который позволяет делать все что угодно