Файл admin.rightsbyitem.php в Cotonti CMF
Код файла отвечает за управление правами пользователей в системе Cotonti CMF на уровне отдельных элементов (модулей, плагинов и т. д.).
Файл "admin.rightsbyitem.php" в движке Cotonti CMF выполняет роль интерфейса для администраторов, позволяя управлять правами доступа пользователей по отдельным элементам или группам элементов (например, модулям, плагинам, страницам и т. д.). Этот файл является частью административной панели и предоставляет интерфейс для назначения или обновления прав доступа для различных групп пользователей.
Основное назначение и задачи:
-
Управление правами доступа:
- Файл позволяет администраторам изменять права доступа к различным элементам системы. Эти элементы могут быть модулями, страницами, плагинами или другими структурными частями системы.
- Присваиваются права на чтение и запись для групп пользователей.
-
Механизм обновления прав:
- В коде реализована логика для обработки запросов на обновление прав для конкретных групп и элементов. Администратор может применить изменения только для выбранных групп или для всех групп сразу.
-
Гибкость в управлении правами:
- Система разделяет права на более простые (например, только доступ на чтение) и более сложные (например, расширенные права).
- В зависимости от режима (обычный или расширенный) изменяется количество доступных прав для групп пользователей.
-
Поддержка плагинов:
- Есть механизмы для интеграции с плагинами, что позволяет расширить функциональность панели управления правами доступа с помощью сторонних расширений.
-
Подготовка и вывод данных:
- Код управляет формированием HTML-кода для отображения прав доступа и генерирует ссылки на страницы редактирования, а также на страницу пользователей для каждой группы.
Список функций/методов:
-
cot_rights_parseline()
- Назначение: Эта функция используется для генерации HTML-кода для отображения прав доступа для каждой группы пользователей. Она получает данные о праве для конкретной группы и отображает форму с флажками для каждого права.
- Параметры:
$row: Массив с данными о правах группы.$title: Заголовок для группы.$link: Ссылка на страницу редактирования прав для данной группы.
- Взаимодействие:
- Используется для обновления переменных шаблона, которые потом рендерятся на странице.
- Генерирует HTML для флажков прав доступа, используя методы шаблонизатора
XTemplate.
-
cot_auth_getvalue()
- Назначение: Эта функция используется для получения значения прав по их коду.
- Параметры: Код права (например, "R", "W", "A" и т. д.).
- Взаимодействие: Возвращает числовое значение для конкретного права, которое используется в других вычислениях.
-
cot_block()
- Назначение: Блокирует доступ к странице, если у пользователя нет нужных прав (например, если он не является администратором).
- Параметры: Логическое значение, определяющее, разрешен ли доступ.
- Взаимодействие: Проверяет, имеет ли текущий пользователь права для выполнения действия на данной странице.
-
cot_auth_reorder()
- Назначение: Функция для перестановки прав в базе данных (если требуется).
- Параметры: Нет явных параметров в коде.
- Взаимодействие: Выполняет действия с базой данных для изменения порядка прав.
-
cot_auth_clear()
- Назначение: Очищает кэш прав доступа для всех или выбранных групп.
- Параметры: Параметр, указывающий, какие права очистить (например, "all" для всех).
- Взаимодействие: После изменений прав очищается кэш, чтобы обновления вступили в силу.
-
cot_message()
- Назначение: Отправляет сообщение пользователю (например, сообщение об успешном обновлении прав).
- Параметры: Сообщение, которое нужно отобразить.
- Взаимодействие: Используется для отправки информации об успешных действиях (например, обновление прав).
-
cot_url()
- Назначение: Генерирует URL для страницы.
- Параметры: Строки с параметрами, которые должны быть вставлены в URL.
- Взаимодействие: Генерирует ссылки для навигации по админ-панели и странице прав доступа.
Взаимодействие с классами и объектами:
-
XTemplate:
- Этот класс используется для рендеринга шаблонов. В нем загружаются и обрабатываются файлы шаблонов для формирования HTML-страниц. Код взаимодействует с этим классом через метод
assignдля передачи данных в шаблон и методparseдля рендеринга.
- Этот класс используется для рендеринга шаблонов. В нем загружаются и обрабатываются файлы шаблонов для формирования HTML-страниц. Код взаимодействует с этим классом через метод
-
Cot::$db:
- Это объект, который взаимодействует с базой данных. Он используется для выполнения SQL-запросов к таблицам, связанным с правами доступа, группами пользователей и другими данными системы. Например, используется в запросах на выборку и обновление прав доступа.
-
Cot::$usr:
- Это объект, представляющий информацию о текущем пользователе. Он хранит данные о правах доступа пользователя, его идентификаторе и группе.
Стиль PHP:
-
Старый стиль PHP:
- В коде используется глобальная область видимости с прямым доступом к глобальным переменным, таким как
Cot::$usr,Cot::$db,Cot::$L. Это старый стиль, который был характерен для ранних версий PHP и фреймворков.
- В коде используется глобальная область видимости с прямым доступом к глобальным переменным, таким как
-
Использование глобальных переменных:
- Код активно использует глобальные переменные, что не является хорошей практикой в современных фреймворках. Вместо этого рекомендуется использовать объектно-ориентированные подходы и инкапсуляцию данных.
-
Процессинг данных через шаблоны:
- Все данные передаются в шаблон с помощью методов типа
$t->assign(), что является стандартом для фреймворков, использующих шаблоны для разделения логики и представления.
- Все данные передаются в шаблон с помощью методов типа
Вывод:
- Файл "admin.rightsbyitem.php" отвечает за управление правами пользователей в системе Cotonti CMF на уровне отдельных элементов (модулей, плагинов и т. д.).
- Используется старый стиль с глобальными переменными, что может быть не так удобно для поддержки и масштабируемости кода.
- Код интегрирует взаимодействие с базой данных, шаблонизатором и пользователем через глобальные объекты системы, что делает его эффективным для администрирования прав доступа, но требует осторожности в обновлениях и расширении функциональности.
находится по адресу: /system/admin/admin.rightsbyitem.php движка php-фреймворка Cotonti
<?php
/**
* Административная панель - Редактор прав по элементам
*
* @package Cotonti
* @copyright (c) Cotonti Team
* @license https://github.com/Cotonti/Cotonti/blob/master/License.txt
*/
(defined('COT_CODE') && defined('COT_ADMIN')) or die('Wrong URL.'); // Проверка, что файл был вызван в контексте Cotonti и администратора, иначе завершение скрипта.
list(Cot::$usr['auth_read'], Cot::$usr['auth_write'], Cot::$usr['isadmin']) = cot_auth('users', 'a'); // Получение прав доступа пользователя для чтения, записи и администрирования в разделе 'users'
Cot::$usr['isadmin'] &= cot_auth('admin', 'a', 'A'); // Дополнительная проверка прав администрирования в разделе 'admin'
if (Cot::$usr['maingrp'] == COT_GROUP_SUPERADMINS) { // Если пользователь является суперадминистратором
Cot::$usr['auth_read'] = true; // Устанавливаем право на чтение
Cot::$usr['auth_write'] = true; // Устанавливаем право на запись
Cot::$usr['isadmin'] = true; // Устанавливаем право администрирования
}
cot_block(Cot::$usr['isadmin']); // Если пользователь не администратор, блокируем доступ
$t = new XTemplate(cot_tplfile('admin.rightsbyitem', 'core')); // Создаем новый объект шаблона XTemplate с шаблоном 'admin.rightsbyitem' для панели администратора
$ic = cot_import('ic', 'G', 'ALP'); // Получаем параметр 'ic' (код элемента) из глобальных данных GET
$io = cot_import('io', 'G', 'ALP'); // Получаем параметр 'io' (опция элемента) из глобальных данных GET
$advanced = cot_import('advanced', 'G', 'BOL'); // Получаем параметр 'advanced' (режим расширенных настроек) из глобальных данных GET
Cot::$L['adm_code']['admin'] = Cot::$L['Administration']; // Присваиваем метку для 'admin' в локализации как 'Администрирование'
Cot::$L['adm_code']['message'] = Cot::$L['Messages']; // Присваиваем метку для 'message' в локализации как 'Сообщения'
/* === Hook === */
foreach (cot_getextplugins('admin.rightsbyitem.first') as $pl) { // Загружаем плагины, связанные с хуком 'admin.rightsbyitem.first'
include $pl; // Включаем каждый плагин
}
/* ===== */
if ($a == 'update') { // Проверка, если действие равно 'update' (обновление прав)
$mask = []; // Инициализация массива для маски прав
$auth = cot_import('auth', 'P', 'ARR'); // Получаем данные прав доступа для групп пользователей из POST запроса
$items = cot_import('items', 'P', 'TXT'); // Получаем список элементов для обновления прав из POST запроса
if (!empty($items)) { // Если список элементов не пуст
// Обновляем права только для этих групп пользователей
$items = json_decode($items, true); // Декодируем JSON-строку в массив
$items = !empty($items) ? $items : []; // Если массив не пуст, присваиваем его переменной, иначе делаем пустым массивом
} else { // Если список элементов пуст
// Обновляем права для всех групп
$sql = Cot::$db->query(
'SELECT a.* FROM ' . Cot::$db->auth . ' as a ' .
'LEFT JOIN ' . Cot::$db->groups . ' AS g ON g.grp_id=a.auth_groupid ' .
"WHERE auth_code = ? AND auth_option = ? AND grp_skiprights = 0 ORDER BY grp_level DESC, grp_id DESC",
[$ic, $io] // Запрос прав для всех групп для указанного элемента
);
$items = []; // Инициализация массива для групп
while ($row = $sql->fetch()) { // Проходим по всем группам, полученным из запроса
$items[$row['auth_groupid']] = $row['auth_rights']; // Сохраняем права для каждой группы
}
}
/* === Hook === */
foreach (cot_getextplugins('admin.rightsbyitem.update') as $pl) { // Загружаем плагины, связанные с хуком 'admin.rightsbyitem.update'
include $pl; // Включаем каждый плагин
}
/* ===== */
//foreach ($auth as $i => $j) {
foreach ($items as $groupId => $oldMaskValue) { // Проходим по всем группам и их старым правам
$newValue = !empty($auth[$groupId]) && is_array($auth[$groupId]) ? $auth[$groupId] : []; // Получаем новые права для группы, если они есть
$mask = 0; // Инициализация переменной для маски прав
foreach ($newValue as $l => $m) { // Проходим по всем правам группы
$mask += cot_auth_getvalue($l); // Добавляем значение права в маску
}
$oldRights = Cot::$db->query("SELECT auth_id, auth_rights FROM " . Cot::$db->auth .
" WHERE auth_groupid=? AND auth_code=? AND auth_option=?", [$groupId, $ic, $io])->fetch(); // Получаем старые права для группы
if (!empty($oldRights) && $oldRights['auth_rights'] != $mask) { // Если права группы изменились
Cot::$db->update(Cot::$db->auth, ['auth_rights' => $mask, 'auth_setbyuserid' => Cot::$usr['id']], // Обновляем права в базе данных
"auth_id=".$oldRights['auth_id']);
}
}
cot_auth_reorder(); // Пересчитываем и пересортировываем права
cot_auth_clear('all'); // Очищаем кеш прав для всех
cot_message('Updated'); // Отправляем сообщение об успешном обновлении
cot_log('Updated rights for ' . $ic . ' "' . $io . '"', 'adm', 'user_groups_rights', 'update'); // Логируем событие обновления прав
$urlParams = ['m' => 'rightsbyitem', 'ic' => $ic, 'io' => $io,]; // Формируем параметры для редиректа
if ($advanced) { // Если включен режим расширенных настроек
$urlParams['advanced'] = 1; // Добавляем параметр для расширенного режима
}
cot_redirect(cot_url('admin', $urlParams, '', true)); // Перенаправляем на страницу с правами
}
$sql = Cot::$db->query('SELECT a.*, u.user_name, g.grp_name, g.grp_level FROM ' . Cot::$db->auth . ' as a ' . // Запрос к базе данных для получения прав пользователей
'LEFT JOIN ' . Cot::$db->users . ' AS u ON u.user_id=a.auth_setbyuserid ' . // Левое соединение с таблицей пользователей для получения имени пользователя, который установил права
'LEFT JOIN ' . Cot::$db->groups . ' AS g ON g.grp_id=a.auth_groupid ' . // Левое соединение с таблицей групп для получения имени группы и её уровня
"WHERE auth_code = ? AND auth_option = ? AND grp_skiprights = 0 ORDER BY grp_level DESC, grp_id DESC", [$ic, $io]); // Условия для выборки по коду элемента и опции, игнорируя группы, пропускающие права, сортировка по уровню и ID группы
cot_die($sql->rowCount() == 0); // Проверка, если не найдено ни одной строки, завершаем выполнение скрипта
$title = ''; // Инициализация переменной для названия элемента
/* === Hook for the plugins === */
foreach (cot_getextplugins('admin.rightsbyitem.case') as $pl) { // Загрузка плагинов, подключенных к хуку 'admin.rightsbyitem.case'
include $pl; // Включение каждого плагина
}
/* ===== */
if ($ic == 'message' || $ic == 'admin') { // Если элемент относится к сообщениям или админской панели
$adminPath[] = [cot_url('admin'), Cot::$L['adm_code'][$ic]]; // Добавляем путь на админскую панель с соответствующим названием
} else { // Если элемент не относится к сообщениям или админской панели
$adminPath[] = [cot_url('admin', 'm=extensions'), Cot::$L['Extensions']]; // Добавляем путь на страницу расширений
if ($ic == 'plug') { // Если элемент связан с плагином
$itemTitle = !empty($cot_plugins_enabled[$io]) ? $cot_plugins_enabled[$io]['title'] : $io; // Получаем название плагина или его код
$title = $itemTitle; // Присваиваем название элементу
$adminPath[] = [cot_url('admin', 'm=extensions&a=details&pl='.$io), $itemTitle]; // Добавляем путь к детальной странице плагина
} elseif ($ic == 'structure') { // Если элемент связан со структурой
$adminPath[] = [cot_url('admin', 'm=structure'), Cot::$L['Structure']]; // Добавляем путь к странице структуры
} else { // Для всех остальных случаев
$itemTitle = !empty($cot_modules[$ic]) ? $cot_modules[$ic]['title'] : $ic; // Получаем название модуля или его код
$title = $itemTitle; // Присваиваем название элементу
$adminPath[] = [cot_url('admin', 'm=extensions&a=details&mod='.$ic), $itemTitle]; // Добавляем путь к детальной странице модуля
if ($io != 'a') { // Если элемент не является основным
$adminPath[] = [cot_url('admin', 'm=structure&n='.$ic), Cot::$L['Structure']]; // Добавляем путь к странице структуры модуля
$itemTitle = !empty(Cot::$structure[$ic][$io]) ? Cot::$structure[$ic][$io]['title'] : $io; // Получаем название элемента структуры или его код
$title .= '(' . $itemTitle . ')'; // Добавляем название структуры в заголовок
$adminPath[] = [cot_url('admin', 'm=structure&n='.$ic.'&al='.$io), $itemTitle]; // Добавляем путь к детальной странице элемента структуры
}
}
}
//m=extensions&a=details&mod=page
$adminPath[] = [cot_url('admin', 'm=rightsbyitem&ic='.$ic.'&io='.$io), Cot::$L['Rights']]; // Добавление пути к правам для текущего элемента с кодом и опцией, с использованием локализованного названия "Rights"
($advanced) && $adminPath[] = [cot_url('admin', 'm=rightsbyitem&ic='.$ic.'&io='.$io.'&advanced=1'), Cot::$L['More']]; // Если активирован режим advanced, добавляем путь к расширенным правам, с локализованным названием "More"
$adminTitle = Cot::$L['Rights']; // Устанавливаем заголовок админ-панели на "Rights" с локализацией
$adv_columns = ($advanced) ? 8 : 3; // Устанавливаем количество столбцов для расширенной версии (8) или обычной (3)
$adv_columns = (!$advanced && $ic == 'page') ? 4 : $adv_columns; // Если не расширенный режим и элемент - это 'page', устанавливаем 4 столбца
$l_custom1 = ($ic == 'page') ? Cot::$L['Download'] : Cot::$L['Custom'].' #1'; // Если элемент - это 'page', устанавливаем локализованное название "Download", иначе "Custom #1"
// Все элементы, которые присутствуют в форме редактирования прав
$items = []; // Инициализация массива для хранения прав для каждого элемента
while ($row = $sql->fetch()) { // Цикл по результатам SQL-запроса
$link = cot_url('admin', 'm=rights&g=' . $row['auth_groupid']); // Генерация ссылки для редактирования прав для группы
cot_rights_parseline($row, $row['grp_name'], $link); // Вызов функции для парсинга прав и отображения их на странице
$items[$row['auth_groupid']] = $row['auth_rights']; // Сохранение прав для каждой группы
}
$sql->closeCursor(); // Закрытие курсора после выполнения запроса
$is_adminwarnings = isset($adminwarnings); // Проверка наличия предупреждений для админа
// Установка параметров URL для обновления прав
$urlParams = ['m' => 'rightsbyitem', 'ic' => $ic, 'io' => $io, 'a' => 'update',];
if ($advanced) { // Если включен режим advanced
$urlParams['advanced'] = 1; // Добавляем параметр для расширенного режима
}
// Установка заголовка страницы
$pageTitle = $adminTitle;
if (!empty($title)) {
$pageTitle .= ': ' . $title; // Если есть дополнительное название, добавляем его
}
// Назначение значений в шаблон
$t->assign([
'ADMIN_RIGHTSBYITEM_TITLE' => $pageTitle, // Заголовок страницы
'ADMIN_RIGHTSBYITEM_FORM_URL' => cot_url('admin', $urlParams), // URL для формы обновления прав
'ADMIN_RIGHTSBYITEM_FORM_ITEMS' => '', // Права для всех групп
'ADMIN_RIGHTSBYITEM_ADVANCED_URL' => cot_url('admin', 'm=rightsbyitem&ic=' . $ic . '&io=' . $io .
'&advanced=1'), // URL для расширенной версии страницы
'ADMIN_RIGHTSBYITEM_ADV_COLUMNS' => $adv_columns, // Количество столбцов для расширенной версии
'ADMIN_RIGHTSBYITEM_4ADV_COLUMNS' => 4 + $adv_columns // Дополнительное количество столбцов для расширенного режима
]);
cot_display_messages($t); // Отображение сообщений пользователю
/* === Hook === */
foreach (cot_getextplugins('admin.rightsbyitem.tags') as $pl) { // Вызов плагинов для обработки тегов
include $pl; // Подключение плагинов
}
/* ===== */
// Парсинг шаблона и вывод контента
$t->parse('MAIN');
$adminMain = $t->text('MAIN'); // Получение текста из основного шаблона
$t->parse('RIGHTSBYITEM_HELP');
$adminHelp = $t->text('RIGHTSBYITEM_HELP'); // Получение текста из шаблона помощи
function cot_rights_parseline($row, $title, $link) // Объявление функции cot_rights_parseline, принимающей 3 параметра: строку данных, название и ссылку
{
global $L, $advanced, $t, $out, $ic; // Объявление глобальных переменных, используемых внутри функции
$mn['R'] = 1; // Инициализация массива $mn с правом "чтение" (R), значением 1
$mn['W'] = 2; // Инициализация массива $mn с правом "запись" (W), значением 2
if ($advanced || $ic == 'page') { // Если режим "advanced" активирован или текущий элемент - это страница
$mn['1'] = 4; // Устанавливаем право "1" (например, разрешение на доступ) равным 4
} else {
$rv['1'] = 4; // В противном случае (если не advanced и не страница) устанавливаем в массиве $rv право "1" равным 4
}
if ($advanced) { // Если режим "advanced" активирован
$mn['2'] = 8; // Устанавливаем право "2" равным 8
$mn['3'] = 16; // Устанавливаем право "3" равным 16
$mn['4'] = 32; // Устанавливаем право "4" равным 32
$mn['5'] = 64; // Устанавливаем право "5" равным 64
} else {
$rv['2'] = 8; // В противном случае устанавливаем в массиве $rv право "2" равным 8
$rv['3'] = 16; // Устанавливаем в массиве $rv право "3" равным 16
$rv['4'] = 32; // Устанавливаем в массиве $rv право "4" равным 32
$rv['5'] = 64; // Устанавливаем в массиве $rv право "5" равным 64
}
$mn['A'] = 128; // Устанавливаем право "A" (административное право) равным 128
foreach ($mn as $code => $value) { // Для каждого элемента в массиве $mn (права доступа)
$state[$code] = (($row['auth_rights'] & $value) == $value) ? true : false; // Определяем состояние права доступа (активно или нет)
$locked[$code] = (($row['auth_rights_lock'] & $value) == $value) ? true : false; // Определяем, заблокировано ли это право доступа (если оно заблокировано, то true)
// Deprecated. Use tags instead // Устарело. Используйте теги вместо этого
$out['tpl_rights_parseline_locked'] = $locked[$code]; // Присваиваем переменной $out информацию о том, заблокировано ли право
$out['tpl_rights_parseline_state'] = $state[$code]; // Присваиваем переменной $out состояние права доступа (активно или нет)
$t->assign([ // Присваиваем значения переменным шаблона
'ADMIN_RIGHTSBYITEM_ROW_ITEMS_NAME' => 'auth['.$row['auth_groupid'].']['.$code.']', // Имя элемента формы с правами
'ADMIN_RIGHTSBYITEM_ROW_ITEMS_CHECKED' => ($state[$code]) ? " checked=\"checked\"" : '', // Если право активно, то отмечаем его в форме
'ADMIN_RIGHTSBYITEM_ROW_ITEMS_DISABLED' => ($locked[$code]) ? " disabled=\"disabled\"" : '', // Если право заблокировано, то делаем его недоступным для изменения
'ADMIN_RIGHTSBYITEM_ROW_ITEMS_LOCKED' => $locked[$code], // Присваиваем информацию о блокировке
'ADMIN_RIGHTSBYITEM_ROW_ITEMS_STATE' => $state[$code], // Присваиваем информацию о состоянии
]);
$t->parse('MAIN.RIGHTSBYITEM_ROW.ROW_ITEMS'); // Парсим шаблон для отображения
}
if (!$advanced) { // Если не используется режим "расширенные права"
$preserve = ''; // Инициализация переменной для скрытых полей формы
foreach ($rv as $code => $value) { // Для каждого значения в массиве $rv (права доступа, когда режим не расширенный)
if (($row['auth_rights'] & $value) == $value) { // Проверяем, установлено ли соответствующее право
$preserve .= '<input type="hidden" name="auth['.$row['auth_groupid'].']['.$code.']" value="1" />'; // Если право установлено, добавляем скрытое поле в форму
}
}
$t->assign('ADMIN_RIGHTSBYITEM_ROW_PRESERVE', $preserve); // Присваиваем скрытые поля переменной шаблона
}
$t->assign([ // Присваиваем значения переменным шаблона
'ADMIN_RIGHTSBYITEM_ROW_TITLE' => $title, // Название для строки (например, название группы)
'ADMIN_RIGHTSBYITEM_ROW_LINK' => $link, // Ссылка на страницу редактирования прав для группы
'ADMIN_RIGHTSBYITEM_ROW_USER' => cot_build_user($row['auth_setbyuserid'], $row['user_name']), // Строим ссылку на пользователя, который установил права
'ADMIN_RIGHTSBYITEM_ROW_JUMPTO' => cot_url('users', 'g='.$row['auth_groupid']), // Ссылка для перехода на страницу пользователей с данной группой
]);
$t->parse('MAIN.RIGHTSBYITEM_ROW'); // Парсим шаблон строки для отображения
}
Комментарии (0)
Автор контента
Оффлайн
Administrator
Последняя авторизация: 05.07.2026 18:32
- Страница размещена: 28.01.2025 19:07
- Последнее обновление: 28.01.2025 19:20