[QUOTE]
Гершберг Илья написал:
[QUOTE] max k написал:
а что касается встроенного импорта битрикса, который через админку, то там вообще по минимуму проверок и т.п. им можно пользоваться только для 100% проверенных структур. т.е., на мой взгляд, дорожка одна - писать свой обработчик.[/QUOTE]
Можете помочь с таким обработчиком? Какой оцениваете бюджет? [/QUOTE]
Илья, приветствую.
Ниже наш собственный скрипт импорта данных из CSV в инфоблок (с различными проверками). Если Вы программист, должны разобрать, переписать под себя не составит труда. Код рабочий, скопирован из папки local/php_interface/include/... (сейчас отрабатывает по расписанию, через Агенты на Cron'e)
[CODE]<?php
//Updating or creating infoblock elements Contact information when reading the CSV file
function PersonInfoImport()
{
require_once($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/classes/general/csv_data.php");
$filePath = $_SERVER["DOCUMENT_ROOT"]."/data_exchange/ForImport/iblock/person_info/PersonInfoImpor
t.csv";
$csvFile = new CCSVData('R', false);
$csvFile->LoadFile($filePath);
$csvFile->SetDelimiter(';');
if(CModule::IncludeModule("iblock"))
{
$iblockID = 27; //ID of the infoblock where the import is made
//Create an array with Employee ID for verification
$resEmployeeID = CIBlockElement::GetList(false, array('IBLOCK_ID' => $iblockID), false, false, array('NAME'));
while($obEmployeeID = $resEmployeeID->GetNextElement())
{
$arEmployeeIDProps = $obEmployeeID->GetFields();
$arCheckEmployeeID[] = $arEmployeeIDProps['NAME'];
}
$el = new CIBlockElement;
while($arFields = $csvFile->Fetch()) //Creating or updating an infoblock element
{
if($arFields[14] == '000001') {
$PROP = array();
$PROP['PI_DISPLAY_NAME'] = $arFields[2];
$PROP['PI_DEP'] = $arFields[3];
$PROP['PI_EMAIL'] = $arFields[4];
$PROP['PI_LOCAL_PHONE'] = $arFields[5];
$PROP['PI_WORK_PHONE'] = $arFields[6];
$PROP['PI_CELL_PHONE'] = $arFields[7];
$PROP['PI_POSITION'] = $arFields[8];
$PROP['PI_ROOM'] = $arFields[9];
$PROP['PI_EXTENDED_STATUS'] = $arFields[10];
$PROP['PI_EXTENDED_STATUS_END_DATE'] = $arFields[11];
$PROP['PI_STATUS'] = $arFields[12];
$PROP['PI_DEP_HEAD'] = $arFields[13] == '1' ? array(68) : '';
$arAddArray = array(
'CREATED_BY' => 1,
'IBLOCK_ID' => $iblockID,
'PROPERTY_VALUES' => $PROP,
'NAME' => $arFields[0],
'ACTIVE' => !empty($arFields[4]) || !empty($arFields[5]) || !empty($arFields[6]) || !empty($arFields[7]) ? 'Y' : 'N'
);
if(empty($arFields[1])) //If there is no Bitrix element ID in the CSV line
{
if($arFields[12] == '1' || in_array($arFields[0], $arCheckEmployeeID)) //If the infoblock already has such EmployeeID OR CSV status = 1
{
//Nothing to do
} else
{
$el->Add($arAddArray);
}
} else
{
//Updating element properties. If the status in CSV = 0 AND one of the fields with contact information is filled in, the item becomes active.
CIBlockElement::SetPropertyValuesEx($arFields[1], false, $PROP);
$el->Update($arFields[1], array('ACTIVE' => $arFields[12] == '0' && (!empty($arFields[4]) || !empty($arFields[5]) || !empty($arFields[6]) || !empty($arFields[7])) ? 'Y' : 'N', 'MODIFIED_BY' => 1));
}
}
}
}
return "PersonInfoImport();";
}
?>
[/CODE]Ну а чтобы загружать картинки, попробуйте, например, $PROP['PICTURE'] = CFile::MakeFileArray($arFields[12]);, где в поле $arFields[12] содержится ссылка на изображение. Это в случае, если свойство с изображением пользовательское. А если это, например, детальное изображение, то поместите CFile::MakeFileArray($arFields[12]) в $arAddArray:[CODE]$arAddArray = array(
'CREATED_BY' => 1,
'IBLOCK_ID' => $iblockID,
'PROPERTY_VALUES' => $PROP,
'NAME' => $arFields[0],
'DETAIL_PICTURE' => CFile::MakeFileArray($arFields[12]),
'ACTIVE' => !empty($arFields[4]) || !empty($arFields[5]) || !empty($arFields[6]) || !empty($arFields[7]) ? 'Y' : 'N'
);[/CODE]Это в теории, сам не проверял. Если возьметесь, то советую сначала на тестовом. :) Или обратитесь к
max k, когда он освободится :)