Пример кода, который безопасно ищет пользователей по ФИО с помощью UserUtils::getUserSearchFilter, корректно обрабатывает отсутствие поля UF_DEPARTMENT при неустановленном модуле «Интранет» и выводит данные о пользователях, включая подразделения — только если они доступны.
Код |
---|
<?php
require $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php';
use Bitrix\Main\UserUtils;
use Bitrix\Main\UserTable;
use Bitrix\Main\Loader;
use Bitrix\Main\UserFieldTable;
if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) {
die();
}
if (!Loader::includeModule('main')) {
die('Модуль "main" не загружен');
}
// === 1. Проверяем, существует ли поле UF_DEPARTMENT ===
$ufDepartmentExists = false;
try {
$field = UserFieldTable::getList([
'filter' => ['ENTITY_ID' => 'USER', 'FIELD_NAME' => 'UF_DEPARTMENT']
])->fetch();
$ufDepartmentExists = !empty($field);
} catch (\Exception $e) {
// Поле может не существовать — это нормально
$ufDepartmentExists = false;
}
// === 2. Формируем фильтр поиска ===
$searchString = 'Troy Adams'; // Пример строки поиска
$filter = UserUtils::getUserSearchFilter([
'FIND' => $searchString
]);
$filter['ACTIVE'] = 'Y';
$filter['IS_REAL_USER'] = 'Y';
// === 3. Формируем SELECT в зависимости от наличия UF_DEPARTMENT ===
$select = ['ID', 'NAME', 'LAST_NAME', 'SECOND_NAME', 'WORK_POSITION'];
if ($ufDepartmentExists) {
$select[] = 'UF_DEPARTMENT';
}
// === 4. Выполняем запрос ===
try {
$users = UserTable::getList([
'select' => $select,
'filter' => $filter,
'limit' => 10
])->fetchAll();
} catch (\Exception $e) {
die('Ошибка при получении пользователей: ' . $e->getMessage());
}
// === 5. Вывод результатов ===
foreach ($users as $user) {
echo "<h3>";
echo htmlspecialcharsbx($user['LAST_NAME'] ?? '') . ' ';
echo htmlspecialcharsbx($user['NAME'] ?? '');
if (!empty($user['SECOND_NAME'])) {
echo ' ' . htmlspecialcharsbx($user['SECOND_NAME']);
}
echo "</h3>";
echo "<p><strong>Должность:</strong> ";
echo !empty($user['WORK_POSITION']) ? htmlspecialcharsbx($user['WORK_POSITION']) : 'не указана';
echo "</p>";
// === 6. Показываем подразделения ТОЛЬКО если поле существует и установлен модуль intranet ===
if ($ufDepartmentExists && !empty($user['UF_DEPARTMENT']) && is_array($user['UF_DEPARTMENT'])) {
// Попробуем подключить intranet для getDepartmentNames
if (Loader::includeModule('intranet')) {
$departments = UserUtils::getDepartmentNames($user['UF_DEPARTMENT']);
if (!empty($departments)) {
echo "<p><strong>Подразделения:</strong></p><ul>";
foreach ($departments as $dept) {
echo "<li>";
echo str_repeat(' ', ($dept['DEPTH_LEVEL'] - 1) * 4);
echo htmlspecialcharsbx($dept['NAME']);
echo " (ID: {$dept['ID']})";
echo "</li>";
}
echo "</ul>";
}
} else {
echo "<p><em>Подразделения: данные доступны, но модуль «Интранет» не установлен — не могу отобразить названия.</em></p>";
}
} else {
echo "<p><strong>Подразделения:</strong> не назначены или недоступны</p>";
}
echo "<hr>";
} |