К данному классу я уже обращался при обработке CSV-файла для загрузки данных в систему.
Для создания CSV-файла собираем массив $arRows с данными и для удобства массив заголовков выносим отдельно, в массив $arFields. Получение полей для файла оставим за кадром, на ваше усмотрение.
Для начала подключаем класс для работы с CSV:
require_once($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/classes/general/csv_data.php");
Далее очистим созданный ранее файл (если этого не сделать будет производиться дозапись в файл)
$filePath = $_SERVER['DOCUMENT_ROOT'] . '/bitrix/catalog_export/' . 'googleAdwords.csv'; $fp = fopen($filePath, 'w+'); @fclose($fp);
Зададим режим работы класса, установим разделитель данных, отметим, что в первой строке содержатся заголовки данных:
$fields_type = 'R'; //дописываем строки в файл $delimiter = ";"; //разделитель для csv-файла $csvFile = new \CCSVData($fields_type, false); $csvFile->SetFieldsType($fields_type); $csvFile->SetDelimiter($delimiter); $csvFile->SetFirstHeader(true);
Запишем в файл заголовки:
$csvFile->SaveFile($filePath, $arFields);
Далее пройдемся по всем строкм данных и допишем их в файл:
foreach ($arRows as $row)
{
$writeAr = array();
foreach ($arFields as $field)
{
$writeAr[] = $row[$field];
}
$csvFile->SaveFile($filePath, $writeAr);
}
В результате, в файле, прописанном в переменной filePath будет доступен наш новый файл
Update 2018-06-16 - Выгрузка в CSV-файл всех значений свойства типа "Список"
Для начала создаем функцию, которая помещает данные в файл:
require_once($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/classes/general/csv_data.php");
function putDataToCSV($file,$array){
$fields_type = 'R'; //дописываем строки в файл
$delimiter = ";"; //разделитель для csv-файла
$csvFile = new \CCSVData($fields_type, false);
$csvFile->SetFieldsType($fields_type);
$csvFile->SetDelimiter($delimiter);
$csvFile->SetFirstHeader(true);
$arrayFields = array();
foreach (array_keys($array[current(array_keys($array))]) as $value)
{
if(substr($value,0,1)=='~') continue;
$arrayFields[] = $value;
}
// запишем заголовки:
$csvFile->SaveFile($file,$arrayFields);
foreach ($array as $arValue){
$row = array();
foreach ($arrayFields as $arrayField)
{
$row[] = $arValue[$arrayField];
}
$csvFile->SaveFile($file,$row);
}
}
Дальше - получаем список значений для записи:
\Bitrix\Main\Loader::includeModule('iblock');
$db_enum_list = CIBlockProperty::GetPropertyEnum("COLLECTION", Array(),
Array("IBLOCK_ID"=>projectInit::catalogIblock)
);
$collections = array();
while ($ar_value = $db_enum_list->GetNext()){
$collections[$ar_value['ID']] = $ar_value;
}
Определяем файл для записи:
use Bitrix\Main\IO,
Bitrix\Main\Application;
$fileWithPropsValue = '/upload/pai/collections.csv';
if(!IO\Directory::isDirectoryExists(Application::getDocumentRoot() . '/upload/pai/')){
IO\Directory::createDirectory(Application::getDocumentRoot() . '/upload/pai/');
}
$file = new IO\File(Application::getDocumentRoot() . $fileWithPropsValue);
$file->putContents(''); // очищаем файл
putDataToCSV(Application::getDocumentRoot().$fileWithPropsValue,$collections);
Готово! Данный скрипт использовался для переноса данных со старой версии одного сайта из свойства типа "Список" в highload-инфоблок.
