SVSP
TECHNOLOGIES

Документация

CrmWorkspaceLeftMenu

Общее описание

Класс CrmWorkspaceLeftMenu представляет собой сущность левого меню в рабочей области системы Ultralight CRM. Это техническая сущность, которая создается автоматически при установке системы и используется для формирования структуры меню в пользовательской части системы.

Основная информация

Назначение

Сущность CrmWorkspaceLeftMenu предназначена для:

Методы

Класс CrmWorkspaceLeftMenu наследует все методы от базового класса Entity и не содержит собственных методов, так как не требует описания кастомной бизнес-логики. Все необходимые операции выполняются через родительский класс.

Наследуемые методы от Entity

initialize(int $id, int $typeId, bool $dnCheckRights = false)

Инициализирует экземпляр сущности с указанными параметрами.

Параметры:

getField(string $name)

Получает значение поля сущности по его имени.

Параметры:

Возвращает: Значение поля

setField(string $name, $value)

Устанавливает значение поля сущности.

Параметры:

delete()

Удаляет экземпляр сущности из базы данных.

save()

Сохраняет изменения в экземпляре сущности.

Поля сущности

Сущность CrmWorkspaceLeftMenu содержит стандартные поля, созданные при миграции:

Особенности реализации

  1. Техническая сущность — не содержит кастомной бизнес-логики, используется исключительно для хранения данных
  2. Интеграция с EntityTrait — использует trait для дополнительной функциональности
  3. Автоматическое создание — таблица и сущность создаются автоматически при установке системы
  4. Иерархическая структура — поддержка вложенных пунктов меню через поле parent_id

Механизм работы

Структура меню

Меню организовано в виде древовидной структуры:

Принцип работы

  1. При загрузке рабочей области система получает все пункты меню
  2. Пункты сортируются по sort_order
  3. Формируется иерархическая структура на основе parent_id
  4. Для каждого пользователя проверяются права доступа к пунктам меню
  5. Пользователю отображаются только пункты, к которым у него есть доступ

Права доступа

Уровни доступа к пунктам меню:

УровеньОписание
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;
}

Интеграция с интерфейсом

В шаблонах Blade

{{-- Рекурсивный шаблон для отображения меню --}}
<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>

В JavaScript

// Функция для динамической загрузки меню
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;
}

Безопасность

Права доступа

Защита от обхода

Рекомендации по использованию

  1. Соблюдайте иерархию — используйте parent_id для организации структуры меню
  2. Учитывайте сортировку — используйте sort_order для контроля порядка отображения
  3. Документируйте права — ведите реестр прав доступа к разделам
  4. Тестируйте производительность — большое количество пунктов меню может замедлить загрузку
  5. Кэшируйте — при необходимости кэшируйте структуру меню для улучшения производительности

Заключение

Сущность CrmWorkspaceLeftMenu является важным компонентом пользовательского интерфейса Ultralight CRM, обеспечивающим гибкую настройку навигации в рабочей области. Благодаря своей простой структуре и иерархической организации, она эффективно выполняет свою основную функцию — хранение и предоставление данных о структуре меню. Интеграция с системой прав доступа обеспечивает безопасность и контроль доступа к различным разделам системы.

SVSP
TECHNOLOGIES
Политика конфиденциальности
Политика конфиденциальности