Файл page.edit.php в Cotonti
предоставляет интерфейс для администратора или авторизованных пользователей с правами редактирования для изменения содержимого страниц
описание файла "page.edit.php" в Cotonti CMF
Основное назначение файла и его место в системе Cotonti
Файл page.edit.php является частью модуля управления страницами в системе управления контентом (CMS) Cotonti. Он размещен в директории /modules/page/inc и отвечает за редактирование существующих страниц на сайте. Этот файл предоставляет интерфейс для администратора или авторизованных пользователей с правами редактирования для изменения содержимого страниц, включая такие параметры, как название, описание, метаданные, статус публикации, дата создания и другие важные параметры страницы.
Файл выполняет ключевую роль в администрировании контента, обеспечивая редактирование и обновление страниц, а также обработку различных данных, которые поступают от пользователя через формы на сайте.
Взаимодействие с другими частями сайта
-
Форма редактирования страницы: Этот файл генерирует форму для редактирования страницы на основе данных, которые уже есть в базе данных (например, название страницы, описание, ключевые слова и другие поля). Пользователь, например, администратор или автор страницы, может обновить эти данные через форму, которая отправляется обратно в сервер.
-
Обработка данных формы: После отправки формы, файл обрабатывает данные, используя такие функции как
cot_import,cot_check_xgдля защиты от CSRF атак, и проверяет различные условия, например, право пользователя на редактирование страницы. В зависимости от состояния страницы (например, черновик, опубликована, ожидает подтверждения) определяются действия, которые следует выполнить. -
Хуки и плагины: Этот файл взаимодействует с внешними плагинами и хуками для добавления дополнительной функциональности, например, для обработки ошибок или для добавления дополнительных полей на страницу.
-
Публикация и сохранение страницы: В зависимости от состояния страницы (например, если страница в черновике, ожидает подтверждения или уже опубликована), файл перенаправляет пользователя на различные URL адреса, что соответствует различным результатам редактирования страницы.
Переменные, хуки, методы, функции, классы
Переменные:
$pag: Массив данных, представляющих собой редактируемую страницу, который заполняется из базы данных.$pageedit_array: Массив, который используется для передачи данных в шаблон для отображения в форме редактирования.$breadcrumbs: Массив для отображения навигации по категориям и страницам.$mskin: Путь к файлу шаблона для страницы редактирования.$usr_can_publish: Флаг, определяющий, может ли пользователь публиковать страницу (определяется для администраторов).
Хуки:
page.edit.update.first: Хук для плагинов, которые могут быть выполнены до выполнения основной логики обновления страницы.page.edit.update.import: Хук, позволяющий плагинам вмешиваться в процесс импорта данных перед их валидацией.page.edit.update.error: Хук для плагинов, которые могут быть выполнены, если в процессе обновления страницы возникли ошибки.page.edit.main: Хук для плагинов, которые могут быть выполнены в процессе работы с основной страницей редактирования.page.edit.tags: Хук для плагинов, которые могут добавлять или изменять теги страницы.
Методы, функции, классы:
cot_page_import(): Функция, которая загружает данные о странице из POST-запроса и возвращает обработанный массив с этими данными.cot_block(): Проверяет права доступа пользователя (например, на редактирование страницы). Осуществляется через проверку прав администратора или через проверку прав владельца страницы.cot_check_xg(): Функция для проверки CSRF токенов, предотвращающая подделку запросов.cot_page_delete(): Функция для удаления страницы.cot_page_validate(): Функция для валидации данных перед их сохранением.cot_page_update(): Функция для обновления данных страницы в базе данных.cot_redirect(): Функция для перенаправления пользователя на другой URL.cot_message(): Функция для отображения сообщений пользователю.cot_extrafields(): Функция для работы с дополнительными полями страниц.cot_inputbox(),cot_textarea(),cot_selectbox(),cot_checkbox(),cot_radiobox(): Функции для генерации HTML-форм для ввода данных пользователем.
Суть содержания кода, выполняемые задачи и функции
Файл выполняет несколько ключевых задач:
- Редактирование страницы: Загружает данные страницы из базы данных и отображает их в форме редактирования.
- Права доступа: Проверяет, может ли текущий пользователь редактировать страницу (администратор или владелец страницы).
- Обработка данных формы: Обрабатывает данные, отправленные через форму редактирования страницы, и обновляет их в базе данных.
- Валидация и обновление: Выполняет валидацию данных, проверяет наличие ошибок, и если данные корректны, сохраняет обновления в базе данных.
- Удаление страницы: Обрабатывает запрос на удаление страницы и удаляет её, если это необходимо.
- Дополнительные поля: Отображает и обрабатывает дополнительные поля страницы, если они есть.
- Перенаправление: Перенаправляет пользователя в зависимости от результатов работы с формой (например, редирект на страницу редактирования или на главную страницу).
Как может использоваться этот сценарий владельцем сайта
Владелец сайта использует файл page.edit.php для управления страницами на сайте, редактируя контент, обновляя информацию о страницах, добавляя метаданные, описания и устанавливая статус публикации. Владелец может:
- Обновлять тексты, изображения и другие элементы страницы.
- Устанавливать параметры публикации, такие как дата начала и окончания публикации.
- Удалять страницы или сохранять их как черновики.
- Работать с дополнительными полями, добавленными через расширения.
Стиль написания кода и совместимость с версиями PHP
Код написан с использованием базовых конструкций PHP и ориентирован на работу с версиями PHP начиная с 5.6, а также совместим с более новыми версиями (например, 7.x и 8.x). Стиль кода включает:
- Явное использование функций, предотвращающих SQL-инъекции (например, через подготовленные запросы).
- Совместимость с объектно-ориентированным программированием, хотя код преимущественно остается процедурным.
- Использование хуков и плагинов для расширяемости, что позволяет легко подключать сторонние расширения.
Код не использует новых функций, которые появились только в PHP 8 (например, именованные аргументы, атрибуты), и хорошо работает на более старых версиях PHP, таких как 7.4.
defined('COT_CODE') or die('Wrong URL'); // Проверка, был ли правильный вызов файла, иначе прекращаем выполнение (безопасность)
require_once cot_incfile('forms'); // Подключение файла с функциями работы с формами, возможно, для рендеринга или обработки данных форм
$id = cot_import('id', 'G', 'INT'); // Получение значения параметра 'id' из глобальных данных запроса (GET), преобразование в тип INT
$c = cot_import('c', 'G', 'TXT'); // Получение значения параметра 'c' из глобальных данных запроса (GET), преобразование в строку
list(Cot::$usr['auth_read'], Cot::$usr['auth_write'], Cot::$usr['isadmin']) = cot_auth('page', 'any'); // Получение прав доступа пользователя для работы с объектом 'page' (чтение, запись, админские права)
/* === Hook === */
foreach (cot_getextplugins('page.edit.first') as $pl) { // Вызов плагинов для хука 'page.edit.first', если они существуют
include $pl; // Подключение и выполнение каждого плагина из полученного списка
}
/* ===== */
cot_block(Cot::$usr['auth_read']); // Проверка, имеет ли пользователь права на чтение для работы с данной страницей
if (!$id || $id < 0) { // Проверка на валидность значения 'id', если оно не задано или меньше 0, выполнение кода прекращается
cot_die_message(404); // Генерация сообщения ошибки 404, если id страницы невалидно
}
$sql_page = Cot::$db->query( // Выполнение SQL-запроса для получения данных страницы по ее id
'SELECT * FROM ' . Cot::$db->pages . ' WHERE page_id = :pageId LIMIT 1', // SQL запрос для получения записи по id
['pageId' => $id] // Подстановка значения 'id' в запрос
);
if ($sql_page->rowCount() == 0) { // Проверка, найден ли результат в запросе
cot_die_message(404); // Если страниц нет, генерируем ошибку 404
}
$row_page = $sql_page->fetch(); // Извлечение данных страницы из результата запроса
list(Cot::$usr['auth_read'], Cot::$usr['auth_write'], Cot::$usr['isadmin']) = cot_auth('page', $row_page['page_cat']); // Получение прав доступа пользователя для страницы в выбранной категории
$parser_list = cot_get_parsers(); // Получение списка доступных парсеров для обработки контента страницы
Cot::$sys['parser'] = $row_page['page_parser']; // Установка выбранного парсера для обработки страницы, полученного из базы данных
if ($a == 'update') { // Проверка, режим 'update' (обновление страницы)
/* === Hook === */
foreach (cot_getextplugins('page.edit.update.first') as $pl) { // Вызов плагинов для хука 'page.edit.update.first', если они существуют
include $pl; // Подключение и выполнение каждого плагина из полученного списка
}
/* ===== */
cot_block(Cot::$usr['isadmin'] || Cot::$usr['auth_write'] && Cot::$usr['id'] == $row_page['page_ownerid']); // Проверка прав пользователя на редактирование страницы: админ или владелец страницы
$rpage = cot_page_import('POST', $row_page, Cot::$usr); // Импорт данных страницы с формы (POST) с учетом текущих данных страницы и пользователя
if ($_SERVER['REQUEST_METHOD'] == 'POST') { // Проверка метода запроса
$rpagedelete = cot_import('rpagedelete', 'P', 'BOL'); // Получение значения флага удаления страницы из POST-запроса
} else {
$rpagedelete = cot_import('delete', 'G', 'BOL'); // Если запрос GET, получение значения флага удаления из параметра запроса
cot_check_xg(); // Проверка CSRF токена
}
if ($rpagedelete) { // Если флаг удаления установлен
$resultOrMessage = cot_page_delete($id, $row_page); // Удаление страницы с передачей id и данных страницы
if ($resultOrMessage !== false) { // Если удаление прошло успешно
cot_message($resultOrMessage); // Вывод сообщения
cot_redirect(cot_url('page', ['c' => $row_page['page_cat']], '', true)); // Перенаправление на категорию страницы
}
}
/* === Hook === */
foreach (cot_getextplugins('page.edit.update.import') as $pl) { // Вызов плагинов для хука 'page.edit.update.import', если они существуют
include $pl; // Подключение и выполнение каждого плагина из полученного списка
}
/* ===== */
cot_page_validate($rpage); // Валидация данных страницы
/* === Hook === */
foreach (cot_getextplugins('page.edit.update.error') as $pl) { // Вызов плагинов для хука 'page.edit.update.error', если они существуют
include $pl; // Подключение и выполнение каждого плагина из полученного списка
}
/* ===== */
if (!cot_error_found()) { // Если нет ошибок в процессе валидации
cot_page_update($id, $rpage); // Обновление данных страницы в базе данных
switch ($rpage['page_state']) { // В зависимости от состояния страницы выполняется соответствующее действие
case COT_PAGE_STATE_PUBLISHED:
$r_url = cot_page_url($rpage, [], '', true); // Если страница опубликована, генерируется URL страницы
break;
case COT_PAGE_STATE_PENDING:
$r_url = cot_url('message', 'msg=300', '', true); // Если страница в ожидании, перенаправление на страницу с сообщением
break;
case COT_PAGE_STATE_DRAFT:
cot_message(Cot::$L['page_savedasdraft']); // Если страница сохранена как черновик, выводим сообщение
$r_url = cot_url('page', 'm=edit&id=' . $id, '', true); // Перенаправление на страницу редактирования
break;
}
cot_redirect($r_url); // Перенаправление в соответствии с состоянием страницы
} else {
cot_redirect(cot_url('page', "m=edit&id=$id", '', true)); // Перенаправление обратно на страницу редактирования в случае ошибки
}
}
$pag = $row_page; // Копирование данных страницы в переменную $pag для удобства дальнейшей работы
$pag['page_status'] = cot_page_status($pag['page_state'], $pag['page_begin'],$pag['page_expire']); // Определение статуса страницы с помощью функции cot_page_status, которая использует состояние страницы, дату начала и дату окончания
cot_block(Cot::$usr['isadmin'] || Cot::$usr['auth_write'] && Cot::$usr['id'] == $pag['page_ownerid']); // Проверка прав доступа: либо администратор, либо пользователь с правами на редактирование, либо владелец страницы
Cot::$out['subtitle'] = Cot::$L['page_edittitle']; // Установка подзаголовка страницы редактирования, использующего строку локализации 'page_edittitle'
if (!isset(Cot::$out['head'])) { // Проверка, установлен ли уже заголовок для страницы
Cot::$out['head'] = ''; // Если заголовок не установлен, инициализируем его как пустую строку
}
Cot::$out['head'] .= Cot::$R['code_noindex']; // Добавление мета-тега noindex для страницы, чтобы она не индексировалась поисковыми системами
Cot::$sys['sublocation'] = Cot::$structure['page'][$pag['page_cat']]['title']; // Установка подлокейшн (путь к странице) для отображения в системной части
$mskin = cot_tplfile(array('page', 'edit', Cot::$structure['page'][$pag['page_cat']]['tpl'])); // Определение пути к файлу шаблона страницы редактирования в категории, учитывая структуру и шаблон категории
/* === Hook === */
foreach (cot_getextplugins('page.edit.main') as $pl) { // Вызов плагинов для хука 'page.edit.main', если они существуют
include $pl; // Подключение и выполнение каждого плагина из полученного списка
}
/* ===== */
require_once Cot::$cfg['system_dir'] . '/header.php'; // Подключение системного заголовочного файла
$t = new XTemplate($mskin); // Создание нового экземпляра шаблона XTemplate с указанным шаблоном страницы редактирования
$breadcrumbs = cot_structure_buildpath('page', $pag['page_cat']); // Построение пути навигации (хлебных крошек) для страницы с учетом ее категории
$breadcrumbs[] = [cot_page_url($pag), $pag['page_title']]; // Добавление элемента с URL страницы и ее заголовком в хлебные крошки
$breadcrumbs[] = Cot::$L['page_edittitle']; // Добавление в хлебные крошки локализованного заголовка страницы редактирования
$pageedit_array = [ // Создание массива с параметрами для формы редактирования страницы
'PAGEEDIT_PAGETITLE' => Cot::$L['page_edittitle'], // Название страницы редактирования, локализованное
'PAGEEDIT_SUBTITLE' => Cot::$L['page_editsubtitle'], // Подзаголовок страницы редактирования, локализованный
'PAGEEDIT_BREADCRUMBS' => cot_breadcrumbs($breadcrumbs, Cot::$cfg['homebreadcrumb']), // Хлебные крошки для страницы редактирования
'PAGEEDIT_FORM_SEND' => cot_url('page', ['m' => 'edit', 'a' => 'update', 'id' => $pag['page_id']]), // URL для отправки формы с обновлением данных страницы
'PAGEEDIT_FORM_ID' => $pag['page_id'], // ID страницы
'PAGEEDIT_FORM_STATE' => $pag['page_state'], // Состояние страницы
'PAGEEDIT_FORM_STATUS' => $pag['page_status'], // Статус страницы
'PAGEEDIT_FORM_LOCAL_STATUS' => Cot::$L['page_status_' . $pag['page_status']], // Локализованный статус страницы, на основе текущего состояния
'PAGEEDIT_FORM_CAT' => cot_selectbox_structure('page', $pag['page_cat'], 'rpagecat'), // Выпадающий список с категориями страницы
'PAGEEDIT_FORM_CAT_SHORT' => cot_selectbox_structure('page', $pag['page_cat'], 'rpagecat', $c), // Выпадающий список с категориями, с учетом короткого кода
'PAGEEDIT_FORM_KEYWORDS' => cot_inputbox('text', 'rpagekeywords', $pag['page_keywords'], array('maxlength' => '255')), // Поле для ввода ключевых слов страницы
'PAGEEDIT_FORM_METATITLE' => cot_inputbox('text', 'rpagemetatitle', $pag['page_metatitle'], array('maxlength' => '255')), // Поле для мета-заголовка страницы
'PAGEEDIT_FORM_METADESC' => cot_textarea('rpagemetadesc', $pag['page_metadesc'], 2, 64, array('maxlength' => '255')), // Поле для мета-описания страницы
'PAGEEDIT_FORM_ALIAS' => cot_inputbox('text', 'rpagealias', $pag['page_alias'], array('maxlength' => '255')), // Поле для псевдонима страницы (URL alias)
'PAGEEDIT_FORM_TITLE' => cot_inputbox('text', 'rpagetitle', $pag['page_title'], array('maxlength' => '255')), // Поле для заголовка страницы
'PAGEEDIT_FORM_DESCRIPTION' => cot_textarea('rpagedesc', $pag['page_desc'], 2, 64, array('maxlength' => '255')), // Поле для описания страницы
'PAGEEDIT_FORM_AUTHOR' => cot_inputbox('text', 'rpageauthor', $pag['page_author'], array('maxlength' => '100')), // Поле для автора страницы
'PAGEEDIT_FORM_DATE' => cot_selectbox_date($pag['page_date'], 'long', 'rpagedate').' '.Cot::$usr['timetext'], // Поле для даты создания страницы
'PAGEEDIT_FORM_DATENOW' => cot_checkbox(0, 'rpagedatenow'), // Чекбокс для установки текущей даты
'PAGEEDIT_FORM_BEGIN' => cot_selectbox_date($pag['page_begin'], 'long', 'rpagebegin').' '.Cot::$usr['timetext'], // Поле для даты начала действия страницы
'PAGEEDIT_FORM_EXPIRE' => cot_selectbox_date($pag['page_expire'], 'long', 'rpageexpire').' '.Cot::$usr['timetext'], // Поле для даты истечения срока действия страницы
'PAGEEDIT_FORM_UPDATED' => cot_date('datetime_full', $pag['page_updated']).' '.Cot::$usr['timetext'], // Дата последнего обновления страницы
'PAGEEDIT_FORM_FILE' => cot_selectbox(
$pag['page_file'],
'rpagefile',
range(0, 2),
[Cot::$L['No'], Cot::$L['Yes'], Cot::$L['Members_only']],
false
), // Выпадающий список для выбора файла, который связан со страницей
'PAGEEDIT_FORM_URL' => cot_inputbox('text', 'rpageurl', $pag['page_url'], ['maxlength' => '255']), // Поле для ввода URL страницы
'PAGEEDIT_FORM_SIZE' => cot_inputbox('text', 'rpagesize', $pag['page_size'], ['maxlength' => '255']), // Поле для размера страницы
'PAGEEDIT_FORM_TEXT' => cot_textarea('rpagetext', $pag['page_text'], 24, 120, '', 'input_textarea_editor'), // Поле для текста страницы с редактором
'PAGEEDIT_FORM_DELETE' => cot_radiobox(0, 'rpagedelete', [1, 0], [Cot::$L['Yes'], Cot::$L['No']]), // Радиокнопки для удаления страницы
'PAGEEDIT_FORM_PARSER' => cot_selectbox($pag['page_parser'], 'rpageparser', cot_get_parsers(), cot_get_parsers(), false), // Выпадающий список для выбора парсера текста страницы
];
if (isset(Cot::$cfg['legacyMode']) && Cot::$cfg['legacyMode']) { // Проверка на наличие и активацию режима совместимости
// @deprecated in 0.9.24
$pageedit_array += [ // Добавление новых элементов в массив для редактирования страницы в случае использования legacyMode
'PAGEEDIT_FORM_DESC' => cot_textarea('rpagedesc', $pag['page_desc'], 2, 64, ['maxlength' => '255']), // Поле для описания страницы
'PAGEEDIT_FORM_LOCALSTATUS' => Cot::$L['page_status_'.$pag['page_status']], // Локализованный статус страницы
];
}
if (Cot::$usr['isadmin']) { // Проверка на права администратора
$pageedit_array += [ // Добавление элементов, доступных только для администраторов
'PAGEEDIT_FORM_OWNER_ID' => cot_inputbox('text', 'rpageownerid', $pag['page_ownerid'], ['maxlength' => '24']), // Поле для ввода ID владельца страницы
'PAGEEDIT_FORM_HITS' => cot_inputbox('text', 'rpagecount', $pag['page_count'], ['maxlength' => '8']), // Поле для количества просмотров страницы
'PAGEEDIT_FORM_FILE_DOWNLOADS' => cot_inputbox('text', 'rpagefilecount', $pag['page_filecount'], ['maxlength' => '8']), // Поле для количества скачиваний файлов, связанных со страницей
];
if (isset(Cot::$cfg['legacyMode']) && Cot::$cfg['legacyMode']) { // Если активирован legacyMode
// @deprecated in 0.9.24
$pageedit_array += [ // Добавление устаревших элементов в случае legacyMode
'PAGEEDIT_FORM_OWNERID' => cot_inputbox('text', 'rpageownerid', $pag['page_ownerid'], ['maxlength' => '24']), // Поле для владельца (устаревшая версия)
'PAGEEDIT_FORM_PAGECOUNT' => cot_inputbox('text', 'rpagecount', $pag['page_count'], ['maxlength' => '8']), // Поле для просмотров (устаревшая версия)
'PAGEEDIT_FORM_FILECOUNT' => cot_inputbox('text', 'rpagefilecount', $pag['page_filecount'], ['maxlength' => '8']), // Поле для скачиваний файлов (устаревшая версия)
];
}
}
$t->assign($pageedit_array); // Передача массива с данными в шаблон
// Extra fields
if (!empty(Cot::$extrafields[Cot::$db->pages])) { // Проверка наличия дополнительных полей для страниц
foreach (Cot::$extrafields[Cot::$db->pages] as $exfld) { // Перебор дополнительных полей
$uname = strtoupper($exfld['field_name']); // Преобразование имени поля в верхний регистр
$extrafieldElement = cot_build_extrafields( // Создание элемента для дополнительного поля
'rpage' . $exfld['field_name'], // Имя поля в форме
$exfld, // Данные поля
$pag['page_' . $exfld['field_name']] // Значение поля для страницы
);
$extrafieldTitle = cot_extrafield_title($exfld, 'page_'); // Получение заголовка для дополнительного поля
$t->assign([ // Передача данных в шаблон
'PAGEEDIT_FORM_' . $uname => $extrafieldElement, // Элемент дополнительного поля
'PAGEEDIT_FORM_' . $uname . '_TITLE' => $extrafieldTitle, // Заголовок для дополнительного поля
'PAGEEDIT_FORM_EXTRAFLD' => $extrafieldElement, // Элемент дополнительного поля
'PAGEEDIT_FORM_EXTRAFLD_TITLE' => $extrafieldTitle // Заголовок дополнительного поля
]);
$t->parse('MAIN.EXTRAFLD'); // Разбор дополнительного поля в шаблоне
}
}
// Error and message handling
cot_display_messages($t); // Вывод сообщений об ошибках и уведомлениях на странице
/* === Hook === */
foreach (cot_getextplugins('page.edit.tags') as $pl) { // Подключение и обработка плагинов для редактирования страницы
include $pl; // Включение каждого плагина
}
/* ===== */
$usr_can_publish = false; // Инициализация переменной для проверки возможности публикации
if (Cot::$usr['isadmin']) { // Если пользователь — администратор
if (Cot::$cfg['page']['autovalidate']) { // Если включена автоматическая валидация для страниц
$usr_can_publish = true; // Разрешение на публикацию
}
$t->parse('MAIN.ADMIN'); // Разбор блока для администраторов в шаблоне
}
$t->parse('MAIN'); // Разбор основного шаблона
$t->out('MAIN'); // Вывод разобранного шаблона
require_once Cot::$cfg['system_dir'] . '/footer.php'; // Подключение подвала страницы
Комментарии (0)
Автор контента
Оффлайн
Sodium Carbonate
Последняя авторизация: 20.07.2026 00:04
- Страница размещена: 02.02.2025 19:32
- Последнее обновление: 02.02.2025 19:40