При работе с Битрикс можно столкнуться с задачей экспорта массива некоторых свойств разделов инфоблока из системы, импорта в систему и использования в формате массива. В данной статье для экспорта и импорта с формированием массива был выбран формат файлов csv (Comma Separated Values) и соответствующая библиотека.
Для импорта в csv файл необходимо:
-
В файле после подключения header.php подключить модуль работы с инфоблоками.
CModule::IncludeModule('iblock');
-
Сформировать массив для выгрузки. Для примера приведем массив из нескольких свойств разделов инфоблока:
$a = array();
$rsSections = CIBlockSection::GetList(array(),array("IBLOCK_ID" => 12,), false, array("ID","NAME","UF_LINK"));
while($ar_result = $rsSections->GetNext()){
$a[$ar_result['ID']]['NAME'] = $ar_result['NAME'];
$a[$ar_result['ID']]['LINK'] = $ar_result['UF_LINK'];
}
print_r($a);
-
Добавить в файл следующие строки библиотеки:
class CSV {
private $_csv_file = null;
public function __construct($csv_file) {
if (file_exists($csv_file)) { //Если файл существует
$this->_csv_file = $csv_file; //Записываем путь к файлу в переменную
}
else throw new Exception("Файл \"$csv_file\" не найден"); //Если файл не найден то вызываем исключение
}
public function setCSV(Array $csv) {
$handle = fopen($this->_csv_file, "a"); //Открываем csv для до-записи, если указать w, то инфомация которая была в csv будет затерта
foreach ($csv as $value) { //Проходим массив
fputcsv($handle, explode(";", $value), ";"); //Записываем, 3-ий параметр - разделитель поля
}
fclose($handle); //Закрываем
}
public function getCSV() {
$handle = fopen($this->_csv_file, "r"); //Открываем csv для чтения
$array_line_full = array(); //Массив будет хранить данные из csv
while (($line = fgetcsv($handle, 0, ";")) !== FALSE) { //Проходим весь csv-файл, и читаем построчно. 3-ий параметр разделитель поля
$array_line_full[] = $line; //Записываем строчки в массив
}
fclose($handle); //Закрываем файл
return $array_line_full; //Возвращаем прочтенные данные
}
}
-
Сформировать строки из элементов одномерных массивов для записи их в файл. Элементы в строке нужно разделить запятыми, по окончании одномерного массива перевести курсор на новую строку.
Необходимо создать в файловой системе пустой файл формата csv для записи в него массива и указать путь к файлу.
foreach($a as $value){
$line1 = "";
$line1 = $value['NAME'].";".$value['LINK']."\n"; //Формируем строки
$line1 = array($line1);
$csv_new = new CSV("services/test.csv"); //Указываем путь к файлу
$csv_new->setCSV($line1); //Записываем в файл
print_r($line1);
}
Для экспорта из csv файла необходимо:
-
В файле после подключения header.php подключить модуль работы с инфоблоками.
CModule::IncludeModule('iblock');
-
Добавить в файле строки библиотеки для чтения из файла csv.
class CSV {
private $_csv_file = null;
public function __construct($csv_file) {
if (file_exists($csv_file)) { //Если файл существует
$this->_csv_file = $csv_file; //Записываем путь к файлу в переменную
}
else throw new Exception("Файл \"$csv_file\" не найден"); //Если файл не найден то вызываем исключение
}
public function setCSV(Array $csv) {
$handle = fopen($this->_csv_file, "a"); //Открываем csv для до-записи, если указать w, то ифномация которая была в csv будет затерта
foreach ($csv as $value) { //Проходим массив
fputcsv($handle, explode(";", $value), ";"); //Записываем, 3-ий параметр - разделитель поля
}
fclose($handle); //Закрываем
}
public function getCSV() {
$handle = fopen($this->_csv_file, "r"); //Открываем csv для чтения
$array_line_full = array(); //Массив будет хранить данные из csv
while (($line = fgetcsv($handle, 0, ";")) !== FALSE) { //Проходим весь csv-файл, и читаем построчно. 3-ий параметр разделитель поля
$array_line_full[] = $line; //Записываем строчки в массив
}
fclose($handle); //Закрываем файл
return $array_line_full; //Возвращаем прочтенные данные
}
}
-
Указать путь к csv файлу с экспортированным содержимым, получить массив и записать в переменную.
$csv = new CSV("services/test.csv"); //Указываем путь к файлу
$get_csv = $csv->getCSV(); //Получаем значения массива
print_r($get_csv);