Файл admin.rightsbyitem.php в Cotonti CMF

Код файла отвечает за управление правами пользователей в системе Cotonti CMF на уровне отдельных элементов (модулей, плагинов и т. д.).

Файл "admin.rightsbyitem.php" в движке Cotonti CMF выполняет роль интерфейса для администраторов, позволяя управлять правами доступа пользователей по отдельным элементам или группам элементов (например, модулям, плагинам, страницам и т. д.). Этот файл является частью административной панели и предоставляет интерфейс для назначения или обновления прав доступа для различных групп пользователей.

Основное назначение и задачи:

  1. Управление правами доступа:

    • Файл позволяет администраторам изменять права доступа к различным элементам системы. Эти элементы могут быть модулями, страницами, плагинами или другими структурными частями системы.
    • Присваиваются права на чтение и запись для групп пользователей.
  2. Механизм обновления прав:

    • В коде реализована логика для обработки запросов на обновление прав для конкретных групп и элементов. Администратор может применить изменения только для выбранных групп или для всех групп сразу.
  3. Гибкость в управлении правами:

    • Система разделяет права на более простые (например, только доступ на чтение) и более сложные (например, расширенные права).
    • В зависимости от режима (обычный или расширенный) изменяется количество доступных прав для групп пользователей.
  4. Поддержка плагинов:

    • Есть механизмы для интеграции с плагинами, что позволяет расширить функциональность панели управления правами доступа с помощью сторонних расширений.
  5. Подготовка и вывод данных:

    • Код управляет формированием HTML-кода для отображения прав доступа и генерирует ссылки на страницы редактирования, а также на страницу пользователей для каждой группы.

Список функций/методов:

  1. cot_rights_parseline()

    • Назначение: Эта функция используется для генерации HTML-кода для отображения прав доступа для каждой группы пользователей. Она получает данные о праве для конкретной группы и отображает форму с флажками для каждого права.
    • Параметры:
      • $row: Массив с данными о правах группы.
      • $title: Заголовок для группы.
      • $link: Ссылка на страницу редактирования прав для данной группы.
    • Взаимодействие:
      • Используется для обновления переменных шаблона, которые потом рендерятся на странице.
      • Генерирует HTML для флажков прав доступа, используя методы шаблонизатора XTemplate.
  2. cot_auth_getvalue()

    • Назначение: Эта функция используется для получения значения прав по их коду.
    • Параметры: Код права (например, "R", "W", "A" и т. д.).
    • Взаимодействие: Возвращает числовое значение для конкретного права, которое используется в других вычислениях.
  3. cot_block()

    • Назначение: Блокирует доступ к странице, если у пользователя нет нужных прав (например, если он не является администратором).
    • Параметры: Логическое значение, определяющее, разрешен ли доступ.
    • Взаимодействие: Проверяет, имеет ли текущий пользователь права для выполнения действия на данной странице.
  4. cot_auth_reorder()

    • Назначение: Функция для перестановки прав в базе данных (если требуется).
    • Параметры: Нет явных параметров в коде.
    • Взаимодействие: Выполняет действия с базой данных для изменения порядка прав.
  5. cot_auth_clear()

    • Назначение: Очищает кэш прав доступа для всех или выбранных групп.
    • Параметры: Параметр, указывающий, какие права очистить (например, "all" для всех).
    • Взаимодействие: После изменений прав очищается кэш, чтобы обновления вступили в силу.
  6. cot_message()

    • Назначение: Отправляет сообщение пользователю (например, сообщение об успешном обновлении прав).
    • Параметры: Сообщение, которое нужно отобразить.
    • Взаимодействие: Используется для отправки информации об успешных действиях (например, обновление прав).
  7. cot_url()

    • Назначение: Генерирует URL для страницы.
    • Параметры: Строки с параметрами, которые должны быть вставлены в URL.
    • Взаимодействие: Генерирует ссылки для навигации по админ-панели и странице прав доступа.

Взаимодействие с классами и объектами:

  1. XTemplate:

    • Этот класс используется для рендеринга шаблонов. В нем загружаются и обрабатываются файлы шаблонов для формирования HTML-страниц. Код взаимодействует с этим классом через метод assign для передачи данных в шаблон и метод parse для рендеринга.
  2. Cot::$db:

    • Это объект, который взаимодействует с базой данных. Он используется для выполнения SQL-запросов к таблицам, связанным с правами доступа, группами пользователей и другими данными системы. Например, используется в запросах на выборку и обновление прав доступа.
  3. Cot::$usr:

    • Это объект, представляющий информацию о текущем пользователе. Он хранит данные о правах доступа пользователя, его идентификаторе и группе.

Стиль PHP:

  1. Старый стиль PHP:

    • В коде используется глобальная область видимости с прямым доступом к глобальным переменным, таким как Cot::$usr, Cot::$db, Cot::$L. Это старый стиль, который был характерен для ранних версий PHP и фреймворков.
  2. Использование глобальных переменных:

    • Код активно использует глобальные переменные, что не является хорошей практикой в современных фреймворках. Вместо этого рекомендуется использовать объектно-ориентированные подходы и инкапсуляцию данных.
  3. Процессинг данных через шаблоны:

    • Все данные передаются в шаблон с помощью методов типа $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'); // Парсим шаблон строки для отображения
}

 

 

 

 

14 minutes read Administrator

Comments (0)

No comments yet
Only registered users can post new comments

Content author

Administrator

Offline

Administrator

Last logged: 2026-07-05 18:32

  • Page published: 2025-01-28 19:07
  • Last update: 2025-01-28 19:20

Similar pages

Файл admin.cache.disk.php в Cotonti CMF
1 Файл admin.cache.disk.php в движке Cotonti CMF является частью административной панели, предназначенной для управления
Файл admin.config.php в Cotonti CMF
2 Основное назначение файла и его место в системе Файл admin.config.php является частью административной панели системы
Файл admin.extensions.php в Cotonti CMF
3 Файл "admin.extensions.php" в движке Cotonti CMF является важным компонентом административной части системы,
Файл admin.extrafields.php в Cotonti CMF
4 Файл admin.extrafields.php в движке Cotonti CMF предназначен для управления дополнительными полями (extra fields) в
Файл admin.functions.php в Cotonti CMF
5 Основное назначение файла admin.functions.php и его место в системе Файл admin.functions.php в системе Cotonti CMF