|
|
| Код |
|---|
<?/**
* Рекурсивная функция, записи и обновления отделов
* @param array $tree Дерево элементов
* @param bool $debug Режим отладки. Не используется
* @param array $logger Переменные для логирования. [добавлено, обновлено, пропущено]
* @return int[] Возращает данные для лога
*/
function write_down_the_tree(array $tree, array $logger = [0, 0, 0], bool $debug = false): array
{
$added = $logger[0];
$updated = $logger[1];
$skipped = $logger[2];
foreach ($tree as $key => $branch) {
if (gettype($branch) == 'string') {//Слищком глубоко зашли
error_log('branch is string');
break;
}
$parent = [];
//Патч для случаев когда в названии слова разделяются с помощью " - " (с пробелами) вместо "-" (без пробелов)
$branch['name'] = str_replace(' - ', "-", $branch['name']);
//Патч для НОЦ "Точка кипения"
$branch['name'] = preg_replace('/НОЦ "Точка кипения.*"/', "", $branch['name']);
//Исправление названия головных отделов
$branch['name'] = preg_replace('/^Административная$/', "Администрация", $branch['name']);
$branch['name'] = preg_replace('/^Административно-хозяйственная$/', "Кампус", $branch['name']);
$branch['name'] = preg_replace('/^Учебная$/', "Образование", $branch['name']);
error_log('--------------------очередной элемент--------------------');
error_log('Запись ' . (!empty($branch['children']) ? 'Раздела ' : 'Отдела ') . $branch['name'] . ' (iduniv: ' . $branch['iduniv'] . ') Родитель:' . $branch['parentIduniv']);
//error_log(print_r($branch,true));
if (!empty($branch['parentIduniv'])) { // Удаление лишних слов из названия отдела, но только если есть Родитель
$parent = get_local_section('564', $branch['parentIduniv']);
if (!empty($parent)) {
$parent['NAME'] = str_replace('"', "\"", $parent['NAME']);
$grandparent = get_local_section('564', '', ['ID' => $parent['IBLOCK_SECTION_ID']]);
if (!empty($grandparent)) {//Если есть Дед, то его тоже попробуем удалить
$grandparent['NAME'] = str_replace('"', "\"", $grandparent['NAME']);
$branch['name'] = removeParentFromChild($branch['name'], $grandparent['NAME']);
}
$branch['name'] = removeParentFromChild($branch['name'], $parent['NAME']);
}
}
//Создание аббривеатуры и ссылки (CODE)
if ($branch['shortname'] == '')
[$branch['shortname'], $branch['shortname_code']] = get_shortname($branch['name']);
else
$branch['shortname_code'] = transliterate($branch['shortname']);
error_log(print_r('Короткое имя: ' . $branch['shortname'] . ' Короткое имя английское: ' . $branch['shortname_code'], true));
if (!empty($branch['children'])) { //Если у элемента есть дети, то сделать из него раздел инфоблока
$is_update_needed = check_for_update(['name' => $branch['name'], 'iduniv' => $branch['iduniv'], 'parent_iduniv' => $branch['parentIduniv']], empty($parent) ? $parent : [], true);
[$added, $updated, $skipped] = writeDepartment($branch, !empty($parent) ? $parent['ID'] : '', true, $is_update_needed, $key * 100, [$added, $updated, $skipped], false);
unset($parent);
checkOrCreateDepContentFolder($branch);
//Уходим глубже в кроличью нору
[$added, $updated, $skipped] = write_down_the_tree($branch['children'], [$added, $updated, $skipped]);
//Статистика
} else {//Если у элемента нет детей, то делаем из него элемент инфоблока
if ($branch['iduniv'] == '000000283' || $branch['iduniv'] == '000000232')
continue;
$is_update_needed = check_for_update(['name' => $branch['name'], 'iduniv' => $branch['iduniv'], 'parent_iduniv' => $branch['parentIduniv']], empty($parent) ? $parent : [], false);
[$added, $updated, $skipped] = writeDepartment($branch, !empty($parent) ? $parent['ID'] : '', false, $is_update_needed, $key * 100, [$added, $updated, $skipped], false);
unset($parent);
checkOrCreateDepContentFolder($branch);
}
}
return [$added, $updated, $skipped];
}
?> |
В функции ниже, как раз и происходит проблема. При вызове здесь функций CIBlockSection::GetList() или get_local_section() (код которой представлен внизу, в последнем блоке кода), в ответ ничего не приходит. Добавлю, что заранее известно, что разделы, которые запрашивает скрипт, в системе, к моменту вызова, уже есть. Я сейчас проверяю ситуации изменения внутренней структуры и иерархии, а так же пытаюсь починить построение иерархии. Все нужные разделы и элементы уже есть в системе. | Код |
|---|
<?/**
* Функция проверки наличия папки для контента отдела.
* @param array $dep отдел, для которого нужно проверить наличие и/или создать папку
* @return void
*/
function checkOrCreateDepContentFolder($dep)
{
error_log('Проверяем папку для ' . $dep['name']);
//error_log(print_r($dep, true));
// $ob = CIBlockSection::GetList([], ['IBLOCK_ID' => '565', 'UF_IDUNIV' => $dep['iduniv']], false, ['IBLOCK_ID', 'ID', 'NAME', 'IBLOCK_SECTION_ID', 'UF_IDUNIV']);
// if($res = $ob->GetNextElement())
// $folder = $res;
// $ob = CIBlockSection::GetList([], ['IBLOCK_ID' => '565', 'UF_IDUNIV' => $dep['parentIduniv']], false, ['IBLOCK_ID', 'ID', 'NAME', 'IBLOCK_SECTION_ID', 'UF_IDUNIV']);
// if($res = $ob->GetNextElement())
// $parent = $res;
$folder = get_local_section('565', $dep['iduniv'], [], [], false, false, [], 'checkOrCreateDepContentFolder');
$parent = get_local_section('565', $dep['parentIduniv'], [], [], false, false, [], 'checkOrCreateDepContentFolder');
error_log(print_r($folder, true));
error_log(print_r($parent, true));
$section = false;
$name = false;
if (!empty($folder)) {
$folder_parent = get_local_section('565', '', ['ID' => $folder['IBLOCK_SECTION_ID']], ['UF_IDUNIV'], true);
if ($dep['paretn_iduniv'] != $folder_parent['UF_IDUNIV']) {
error_log('Уже есть папка для ' . $dep['name'] . ', но ее положение (' . $folder_parent['NAME'] . ') не актуально. Исправляем.');
$section = true;
}
if ($dep['name'] != $folder['NAME']) {
error_log('Уже есть папка для ' . $dep['name'] . ', но ее имя (' . $folder['NAME'] . ') не актуально. Исправляем.');
$name = true;
}
if (!($section && $name)) {
error_log('Уже есть папка для ' . $dep['name'] . '. Положение и имя актуально');
return;
} else {
$arFields = array(
'MODIFIED_BY' => $GLOBALS['USER']->GetID(),
'NAME' => !$name ? $folder['NAME'] : $dep['name'],
'IBLOCK_SECTION_ID' => !$section ? $folder['IBLOCK_SECTION_ID'] : $parent['ID'],
'IBLOCK_ID' => '565',
);
$bs = new CIBlockSection;
$bs->Update($folder['ID'], $arFields);
}
}
$arFields = array(
'MODIFIED_BY' => $GLOBALS['USER']->GetID(),
'NAME' => $dep['name'],
'CODE' => $dep['shortname_code'],
'IBLOCK_SECTION_ID' => $parent['ID'],
'ACTIVE' => 'Y',
'IBLOCK_ID' => '565',
"UF_IDUNIV" => $dep['iduniv'],
);
$bs = new CIBlockSection;
$ID = $bs->Add($arFields);
$res = ($ID > 0);
if ($res)
error_log('Создана папка для ' . $dep['name'] . ' (ID: ' . $ID . '). Родитель: ' . $parent['NAME'] . '(iduniv: ' . $dep['parentIduniv'] . ')');
else {
error_log("---------------ОШИБКА---------------------");
error_log('Ошибка при создании папки ' . $dep['name'] . '. Родитель: ' . $parent['NAME']);
error_log(print_r($bs->LAST_ERROR, true));
error_log("------------------------------------------");
}
}?>
|
| Код |
|---|
<?/**
* Функция записи, относительно типа (Элемент/Раздел) и статуса актуальности
* @param array $department Набор данных
* @param bool $is_section Является ли элемент разделом
* @param int $status статус актуальности
* 0 - Актуальный элемент
* 1 - Новый элемент
* 2 - Элемент переименован, положение актуально
* 3 - Элемент перенесен, имя актуально
* 4 - Элемент существует, но имя и положение не актуально
* @param array $logger Переменные для логирования. [добавленно, обновлено, пропущено]
* @param bool $is_extLog Расширенное логгирование
* @return int[] Данные для логирования
*/
function writeDepartment(array $department, string $parent = '', bool $is_section = false, int $status = 0, int $sort = 100, array $logger = [0, 0, 0], bool $is_extLog = false)
{
if ($status == 0) {
error_log("Отдел " . $department['name'] . ' (iduniv: ' . $department['iduniv'] . ') актуален.');
return [$logger[0], $logger[1], $logger[2]++];
}
if ($is_extLog) {
unset($department['children']);
error_log('----------------------Сырые данные------------------');
error_log(print_r($department, true));
error_log('----------------------------------------------------');
}
$cib=null;
if($is_section)
$cib = new CIBlockSection();
else
$cib = new CIBlockElement();
$elem = $status == 1 ? null :
($is_section ?
get_local_section(
'564',
$department['iduniv'],
[],
['UF_IDUNIV', "UF_PERSONS", "UF_CONTENT", "UF_SHORTNAME", "UF_CONTACTS", "UF_SOCIALS"]
) :
get_local_content(
'564',
['ID', 'IBLOCK_ID', 'NAME', "IBLOCK_SECTION_ID"],
['PROPERTY_IDUNIV' => $department['iduniv']],
false,
true
)
);
if ($is_extLog) {
error_log('--------------------------РОДИТЕЛЬ--------------------------');
error_log(print_r($parent, true));
error_log('------------------------------------------------------------');
}
$arProp = $is_section ?
array(
"UF_IDUNIV" => $status == 1 || empty($elem['UF_IDUNIV']) ? $department['iduniv'] : $elem['UF_IDUNIV'],
"UF_EMPLOYEES" => $elem['UF_EMPLOYEES'],
"UF_CONTENT" => $elem['UF_CONTENT'],
"UF_SHORTNAME" => $status == 1 || empty($elem['UF_SHORTNAME']) ? $department['shortname'] : $elem['UF_SHORTNAME'],
"UF_CONTACTS" => $elem['UF_CONTACTS'],
"UF_SOCIALS" => $elem['UF_SOCIALS']
) :
array(
"PROPERTY_VALUES" => array(
"IDUNIV" => $status == 1 || empty($elem['IDUNIV']['VALUE']) ? $department['iduniv'] : $elem['IDUNIV']['VALUE'],
"CONTENT" => $elem['CONTENT']['VALUE'],
"SHORTNAME" => $status == 1 || empty($elem['SHORTNAME']['VALUE']) ? $department['shortname'] : $elem['SHORTNAME']['VALUE'],
"EMPLOYEES" => $elem['EMPLOYEES']['VALUE'],
"CONTACTS" => $elem['CONTACTS']['VALUE'],
"SOCIALS" => $elem['SOCIALS']['VALUE']
)
);
$arFields = array(
'MODIFIED_BY' => $GLOBALS['USER']->GetID(),
'NAME' => $status != 3 ? ($department['name'] != '' ? $department['name'] : $department['fullname']) : $elem['NAME'],
'CODE' => $status != 3 || empty($elem['CODE']) ? $department['shortname_code'] : $elem['CODE'],
'IBLOCK_SECTION_ID' => $status != 2 ? $parent : $elem['IBLOCK_SECTION_ID'],
'ACTIVE' => 'Y',
'IBLOCK_ID' => '564',
'SORT' => $sort,
);
$arFields += $arProp;
if ($is_extLog) {
error_log('---------------Подготовленное, новой функцией, значение-----------------');
error_log(print_r($arFields, true));
error_log('------------------------------------------------------------------------');
}
if ($status == 1) {
$cib->Add($arFields);
error_log("Отдел " . $department['name'] . ' (iduniv: ' . $department['iduniv'] . ') добавлен.');
unset($cib);
return [$logger[0]++, $logger[1], $logger[2]];
} else {
error_log("Отдел " . $department['name'] . ' (iduniv: ' . $department['iduniv'] . ') обновлен.');
$cib->Update($elem['ID'], $arFields);
unset($cib);
return [$logger[0], $logger[1]++, $logger[2]];
}
}
?> |
| Код |
|---|
<?/**
* Получить или проверить наличие Раздела
* @param string $iblock_id Информационный блок
* @param string $iduniv IDUNIV отдела из 1С.
* @param array $additional_filter Массив дополнительных фильтров для запроса ['*Код*' => '*значение*']
* @param array $additional_fields Массив дополнительных полей для запроса
* @param bool $check Флаг проверки. Если true, то вернет только информацию о наличии запрошеного инфоблока (1/0), в противном случае, вернет запрошенные данные
* @param bool $more_than_one Запрос более чем одного значения
* @param array $arOrder Параметры сортировки
* @return array|bool Массив значений из инфоблока согласно запросу | существование элемента инфоблока (1/0)
*/
function get_local_section($iblock_id, $iduniv, $additional_filter=[],$additional_fields=[], $check=false, bool $more_than_one=false, $arOrder=[], string $method_name = ''){
$result=[];
$arFilter = [
'IBLOCK_ID'=>$iblock_id
];
if($iduniv!='')
$arFilter['UF_IDUNIV']=$iduniv;
if($additional_filter!=[])
$arFilter = array_merge($arFilter,$additional_filter);
if($method_name!='')
error_log($method_name);
error_log(print_r($arFilter,true));
$arSelect = array_merge(['IBLOCK_ID','CODE','NAME','IBLOCK_SECTION_ID','ID','UF_*'],$additional_fields);
$query = CIBlockSection::GetList(
$arOrder,
$arFilter,
false,
$arSelect
);
if($check){
$data = $query->Fetch();
if($method_name!=''){
error_log('fetch_res');
error_log(print_r($data,true));
}
return $data;
}
if($more_than_one)
while ($data = $query->GetNext()){
if($method_name!=''){
error_log('More_res');
error_log(print_r($data,true));
}
$result[] = $data;
}
else{
if ($data = $query->GetNext()) {
if($method_name!=''){
error_log('res');
error_log(print_r($data,true));
}
$result = $data;
}
}
return $result;
}
?> |
|