Класс CrmWorkspaceLeftMenu представляет собой сущность левого меню в рабочей области системы Ultralight CRM. Это техническая сущность, которая создается автоматически при установке системы и используется для формирования структуры меню в пользовательской части системы.
App\Models\CrmWorkspaceLeftMenucrm_workspace_left_menuEntityСущность CrmWorkspaceLeftMenu предназначена для:
Класс CrmWorkspaceLeftMenu наследует все методы от базового класса Entity и не содержит собственных методов, так как не требует описания кастомной бизнес-логики. Все необходимые операции выполняются через родительский класс.
initialize(int $id, int $typeId, bool $dnCheckRights = false)Инициализирует экземпляр сущности с указанными параметрами.
Параметры:
$id — идентификатор экземпляра сущности$typeId — идентификатор типа сущности$dnCheckRights — флаг, указывающий, нужно ли проверять права доступаgetField(string $name)Получает значение поля сущности по его имени.
Параметры:
$name — имя поляВозвращает: Значение поля
setField(string $name, $value)Устанавливает значение поля сущности.
Параметры:
$name — имя поля$value — новое значение поляdelete()Удаляет экземпляр сущности из базы данных.
save()Сохраняет изменения в экземпляре сущности.
Сущность CrmWorkspaceLeftMenu содержит стандартные поля, созданные при миграции:
id — первичный ключname — название пункта менюurl — URL-адрес пункта менюicon — иконка пункта менюparent_id — идентификатор родительского пункта меню (для иерархии)sort_order — порядок сортировкиaccess_level — уровень доступа к пункту менюcreated_at — дата созданияupdated_at — дата обновленияparent_idМеню организовано в виде древовидной структуры:
parent_id = 0parent_idsort_ordersort_orderparent_idУровни доступа к пунктам меню:
| Уровень | Описание |
|---|---|
| 0 | Полный доступ (отображается и доступен для перехода) |
| 1 | Только чтение (отображается, но переход запрещен) |
| 2 | Доступ запрещен (не отображается) |
// Создание нового пункта меню
$menuItem = EntityTable::createEntity(7, [
'name' => 'Новый раздел',
'url' => '/workspace/new-section',
'icon' => 'fa fa-newspaper-o',
'parent_id' => 0,
'sort_order' => 10,
'access_level' => 0
]);
// Создание подпункта меню
$submenuItem = EntityTable::createEntity(7, [
'name' => 'Подраздел',
'url' => '/workspace/new-section/sub',
'icon' => 'fa fa-file-o',
'parent_id' => $menuItem->getField('id'),
'sort_order' => 1,
'access_level' => 0
]);
// Получение всех пунктов меню
$menuItems = EntityTable::getEntities([
'ENTITY_TYPE_ID' => 7,
'ORDER_BY' => ['sort_order', 'ASC']
]);
// Получение корневых пунктов меню
$rootItems = EntityTable::getEntities([
'ENTITY_TYPE_ID' => 7,
'FILTER' => [['parent_id', '=', 0]],
'ORDER_BY' => ['sort_order', 'ASC']
]);
// Получение подпунктов определенного раздела
$submenuItems = EntityTable::getEntities([
'ENTITY_TYPE_ID' => 7,
'FILTER' => [['parent_id', '=', 5]],
'ORDER_BY' => ['sort_order', 'ASC']
]);
// Функция для формирования иерархической структуры меню
function buildMenuHierarchy($items) {
$menu = [];
$itemsByParent = [];
// Группировка пунктов по parent_id
foreach ($items as $item) {
$parentId = $item->getField('parent_id');
$itemsByParent[$parentId][] = $item;
}
// Рекурсивное построение иерархии
$buildTree = function($parentId = 0) use (&$buildTree, $itemsByParent) {
$result = [];
if (isset($itemsByParent[$parentId])) {
foreach ($itemsByParent[$parentId] as $item) {
$node = [
'id' => $item->getField('id'),
'name' => $item->getField('name'),
'url' => $item->getField('url'),
'icon' => $item->getField('icon'),
'access_level' => $item->getField('access_level'),
'children' => $buildTree($item->getField('id'))
];
$result[] = $node;
}
}
return $result;
};
return $buildTree();
}
// Использование
$hierarchy = buildMenuHierarchy($menuItems);
// Функция для фильтрации меню по правам пользователя
function filterMenuByAccess($menu, $userId) {
$filteredMenu = [];
foreach ($menu as $item) {
$accessLevel = $item->getField('access_level');
// Проверка прав доступа через CrmAuthorization
$entityAccess = CrmAuthorization::getAccess(7, $item->getField('id'));
// Отображаем пункт, только если есть доступ
if ($entityAccess < 2) {
$filteredItem = [
'id' => $item->getField('id'),
'name' => $item->getField('name'),
'url' => $entityAccess === 0 ? $item->getField('url') : '#',
'icon' => $item->getField('icon'),
'access_level' => $entityAccess
];
// Рекурсивная фильтрация дочерних элементов
$children = EntityTable::getEntities([
'ENTITY_TYPE_ID' => 7,
'FILTER' => [['parent_id', '=', $item->getField('id')]],
'ORDER_BY' => ['sort_order', 'ASC']
]);
$filteredItem['children'] = filterMenuByAccess($children, $userId);
$filteredMenu[] = $filteredItem;
}
}
return $filteredMenu;
}
{{-- Рекурсивный шаблон для отображения меню --}}
<ul class="sidebar-menu">
@foreach($menu as $item)
<li class="{{ $item['children'] ? 'treeview' : '' }}">
<a href="{{ $item['url'] }}">
<i class="{{ $item['icon'] }}"></i>
<span>{{ $item['name'] }}</span>
@if($item['children'])
<span class="pull-right-container">
<i class="fa fa-angle-left pull-right"></i>
</span>
@endif
</a>
@if($item['children'])
<ul class="treeview-menu">
{{-- Рекурсивный вызов для дочерних элементов --}}
@include('workspace.menu.submenu', ['menu' => $item['children']])
</ul>
@endif
</li>
@endforeach
</ul>
// Функция для динамической загрузки меню
function loadWorkspaceMenu() {
return fetch('/api/workspace/menu')
.then(response => response.json())
.then(data => {
renderMenu(data.menu);
})
.catch(error => {
console.error('Error loading menu:', error);
});
}
function renderMenu(menuItems) {
const menuContainer = document.getElementById('sidebar-menu');
menuContainer.innerHTML = '';
menuItems.forEach(item => {
const menuItem = createMenuItem(item);
menuContainer.appendChild(menuItem);
});
}
function createMenuItem(item) {
const li = document.createElement('li');
if (item.children && item.children.length > 0) {
li.className = 'treeview';
}
const a = document.createElement('a');
a.href = item.url;
a.innerHTML = `<i class="${item.icon}"></i> <span>${item.name}</span>`;
if (item.children && item.children.length > 0) {
a.innerHTML += '<span class="pull-right-container"><i class="fa fa-angle-left pull-right"></i></span>';
const ul = document.createElement('ul');
ul.className = 'treeview-menu';
item.children.forEach(child => {
ul.appendChild(createMenuItem(child));
});
li.appendChild(ul);
}
li.appendChild(a);
return li;
}
CrmAuthorizationparent_id для организации структуры менюsort_order для контроля порядка отображенияСущность CrmWorkspaceLeftMenu является важным компонентом пользовательского интерфейса Ultralight CRM, обеспечивающим гибкую настройку навигации в рабочей области. Благодаря своей простой структуре и иерархической организации, она эффективно выполняет свою основную функцию — хранение и предоставление данных о структуре меню. Интеграция с системой прав доступа обеспечивает безопасность и контроль доступа к различным разделам системы.