Файл page.admin.php в Cotonti
отвечает за отображение и управление страницами в админке сайта, в том числе их создание, редактирование, сортировку и фильтрацию
Описание файла "page.admin.php" в Cotonti
Основное назначение и место в системе Cotonti:
Файл page.admin.php является частью административной панели системы управления контентом (CMS) Cotonti. Он отвечает за отображение и управление страницами в админке сайта, в том числе их создание, редактирование, сортировку и фильтрацию. Этот файл взаимодействует с различными модулями и базой данных Cotonti для обработки страниц, их метаданных, состояния, а также предоставляет интерфейс для администратора сайта.
Файл расположен в директории /modules/page/admin/ или аналогичной директории модуля, и является частью административной части сайта, отвечающей за обработку страниц в системе.
Взаимодействие внутри сайта:
Файл page.admin.php используется для обработки запросов, связанных с административным управлением страницами. Он взаимодействует с базой данных для получения информации о страницах, их сортировке и фильтрации, а также предоставляет интерфейс для выполнения действий с этими страницами (например, добавление, редактирование, удаление, изменение состояния).
Переменные, хуки, методы, функции, классы:
-
Переменные:
$totalitems: Хранит количество всех страниц в базе данных, получаемое с помощью запроса к базе данных.$pagenav: Массив, содержащий информацию о пагинации (предыдущая страница, текущая страница, следующая страница) и других данных, необходимых для построения навигации.$sql_page: Результат запроса к базе данных для получения данных о страницах.$extp: Массив, содержащий пути к плагинам, которые могут быть подключены для обработки дополнительных тегов.$sub_count: Количество подстраниц для каждой категории.$sys: Массив системных переменных, таких как количество страниц в ожидании.
-
Хуки:
- Hook - Part1 : Set:
cot_getextplugins('page.admin.loop')— Хук для добавления плагинов, которые должны быть выполнены в начале обработки. - Hook - Part2 : Include: Включение плагинов в процессе работы с каждой страницей.
- Hook для тегов:
cot_getextplugins('page.admin.tags')— Позволяет подключать плагины для обработки дополнительных тегов.
- Hook - Part1 : Set:
-
Методы и функции:
Cot::$db->countRows(): Метод для подсчета количества записей в таблице.Cot::$db->query(): Метод для выполнения SQL-запросов к базе данных.cot_pagenav(): Функция для генерации навигации по страницам.cot_url(): Функция для генерации URL-адресов с учетом параметров.cot_selectbox(): Функция для создания выпадающих списков в HTML.cot_confirm_url(): Функция для создания URL, который подтверждает выполнение действия (например, удаление страницы).cot_generate_pagetags(): Генерация тегов для отображения страницы в шаблоне.cot_generate_usertags(): Генерация тегов для пользователя страницы.cot_build_user(): Формирование ссылки на пользователя.cot_display_messages(): Отображение сообщений об ошибках или успешных действиях.
-
Классы:
Cot::$db: Это экземпляр класса базы данных, который используется для взаимодействия с базой данных.$t: Это объект класса XTemplate, который используется для рендеринга шаблонов и работы с переменными.
Суть содержания кода:
Код в файле page.admin.php выполняет несколько ключевых задач:
-
Подсчет страниц: Код извлекает количество страниц в базе данных, а также количество страниц в ожидании, используя SQL-запросы. Это позволяет администратору видеть статистику по всем страницам сайта.
-
Фильтрация и сортировка: Код позволяет администратору фильтровать и сортировать страницы по различным параметрам (например, по дате, статусу и т.д.), что облегчает управление контентом.
-
Пагинация: Пагинация обеспечивается через функцию
cot_pagenav(), которая позволяет разбивать страницы на несколько частей, если количество записей слишком велико для отображения на одной странице. Это улучшает навигацию по списку страниц. -
Отображение данных: Каждая страница отображается с соответствующими тегами и данными, такими как автор страницы, ее состояние (опубликована, ожидает подтверждения), и возможность редактировать, удалить или изменить состояние страницы.
-
Подключение плагинов: Код поддерживает использование плагинов через хуки, что позволяет расширять функциональность админки без изменения основного кода.
-
Обработка действий: Код обеспечивает создание URL для выполнения различных действий с страницами, таких как добавление, редактирование, удаление и изменение состояния страниц.
Использование владельцем сайта:
Владельцу сайта этот сценарий позволяет эффективно управлять содержимым сайта, связанным с страницами. Администратор может:
- Добавлять новые страницы.
- Редактировать существующие страницы.
- Удалять страницы.
- Проверять страницы в ожидании.
- Сортировать и фильтровать страницы по различным критериям.
- Управлять дополнительными полями страниц.
- Использовать плагины для расширения функционала.
Этот код предоставляет гибкий и удобный интерфейс для работы с контентом, улучшая организацию и управляемость страницами на сайте.
Стиль написания PHP-кода и совместимость с версиями PHP:
Стиль написания кода в файле соответствует современным стандартам PHP, с использованием объектно-ориентированных принципов (например, работа с классами и методами через Cot::$db и $t). Код использует простые и понятные конструкции, что делает его легко читаемым.
Код совместим с PHP 7.2 и выше, так как использует стандартные возможности PHP, не требующие специфичных для более старых версий функций. Однако для обеспечения совместимости с новыми версиями PHP рекомендуется тестировать этот код на последних стабильных версиях PHP, чтобы избежать возможных проблем с устаревшими функциями и расширениями
/* ====================
[BEGIN_COT_EXT]
Hooks=admin
[END_COT_EXT]
==================== */
/**
* Pages manager & Queue of pages
*
* @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 CMF и что доступ есть только для администраторов, иначе завершение выполнения с сообщением 'Wrong URL.'
list(Cot::$usr['auth_read'], Cot::$usr['auth_write'], Cot::$usr['isadmin']) = cot_auth('page', 'any'); // Получение разрешений для чтения, записи и проверки является ли пользователь администратором для модуля 'page'
cot_block(Cot::$usr['isadmin']); // Ожидается, что пользователь является администратором, иначе дальнейший код не будет выполнен
$t = new XTemplate(cot_tplfile('page.admin', 'module', true)); // Инициализация XTemplate с использованием шаблона 'page.admin' для административной панели модуля 'page'
require_once cot_incfile('page', 'module'); // Подключение необходимого файла модуля 'page'
$adminPath[] = [cot_url('admin', 'm=extensions'), Cot::$L['Extensions']]; // Добавление пути для страницы администратора: "Расширения"
$adminPath[] = [cot_url('admin', 'm=extensions&a=details&mod='.$m), $cot_modules[$m]['title']]; // Добавление пути для подробной страницы расширения
$adminPath[] = [cot_url('admin', 'm='.$m), Cot::$L['Administration']]; // Добавление пути к главной странице администратора для текущего модуля 'page'
$adminHelp = Cot::$L['adm_help_page']; // Присваивание переменной $adminHelp строки помощи, связанной с администрированием страниц
$adminTitle = Cot::$L['Pages']; // Присваивание переменной $adminTitle заголовка для административной страницы модуля страниц
$id = cot_import('id', 'G', 'INT'); // Импорт данных из GET-запроса с параметром 'id', ожидается целое число
list($pg, $d, $durl) = cot_import_pagenav('d', Cot::$cfg['maxrowsperpage']); // Импорт данных для пагинации с помощью функции cot_import_pagenav, получает текущую страницу, количество элементов на странице и ссылку для пагинации
$sorttype = cot_import('sorttype', 'R', 'ALP'); // Импорт параметра сортировки ('sorttype') из запроса (метод 'R' — POST или GET), значение ограничено алфавитным (ALP)
$sorttype = empty($sorttype) ? 'id' : $sorttype; // Если параметр сортировки не задан, используется сортировка по умолчанию по полю 'id'
if ($sorttype != 'id' && !Cot::$db->fieldExists(Cot::$db->pages, "page_$sorttype")) { // Если параметр сортировки не равен 'id' и поле не существует в таблице страниц, то сортировка будет по 'id'
$sorttype = 'id'; // Установка сортировки по умолчанию (по 'id')
}
$sqlsorttype = 'page_'.$sorttype; // Создание строки для использования в SQL-запросе, указывающей, по какому полю сортировать
$sort_type = cot_page_config_order(true); // Получение конфигурации сортировки страниц, с параметром 'true', что может указывать на необходимость учесть активные настройки сортировки
$sortway = cot_import('sortway', 'R', 'ALP'); // Импорт параметра порядка сортировки ('sortway') из запроса (метод 'R' — POST или GET), значение ограничено алфавитным (ALP)
$sortway = empty($sortway) ? 'desc' : $sortway; // Если параметр порядка сортировки не задан, используется сортировка по убыванию ('desc')
$sort_way = [ // Создание массива для отображения текстовых значений для сортировки
'asc' => Cot::$L['Ascending'], // 'Ascending' — восходящий порядок
'desc' => Cot::$L['Descending'], // 'Descending' — нисходящий порядок
];
$sqlsortway = $sortway; // Присваивание значения порядка сортировки для использования в SQL-запросе
$filter = cot_import('filter', 'R', 'ALP'); // Импорт параметра фильтрации ('filter') из запроса (метод 'R' — POST или GET), значение ограничено алфавитным (ALP)
$filter = empty($filter) ? 'valqueue' : $filter; // Если фильтр не задан, используется фильтрация по умолчанию — 'valqueue'
$filter_type = [ // Создание массива для отображения типов фильтров
'all' => Cot::$L['All'], // 'All' — все страницы
'valqueue' => Cot::$L['adm_valqueue'], // 'adm_valqueue' — страницы в очереди на проверку
'validated' => Cot::$L['adm_validated'], // 'adm_validated' — страницы, прошедшие валидацию
'expired' => Cot::$L['adm_expired'], // 'adm_expired' — страницы, которые устарели
'drafts' => Cot::$L['page_drafts'], // 'page_drafts' — страницы в черновиках
];
$urlParams = ['m' => 'page']; // Создание массива параметров URL с параметром модуля 'page'
if ($sorttype != 'id') { // Если сортировка не по 'id', добавляем параметр 'sorttype' в URL
$urlParams['sorttype'] = $sorttype;
}
if ($sortway != 'desc') { // Если порядок сортировки не 'desc', добавляем параметр 'sortway' в URL
$urlParams['sortway'] = $sortway;
}
if ($filter != 'valqueue') { // Если фильтр не 'valqueue', добавляем параметр 'filter' в URL
$urlParams['filter'] = $filter;
}
/**
* Common UrlParams without pagination
* @deprecated
*/
$common_params = http_build_query($urlParams, '', '&'); // Создание строки запроса URL без пагинации, используя параметры из массива $urlParams. Этот метод устарел.
if ($pg > 1) { // Если текущая страница больше 1 (то есть не первая страница)
$urlParams['d'] = $durl; // Добавляем параметр 'd' с URL для текущей страницы пагинации в массив $urlParams
}
if ($filter == 'all') { // Если выбран фильтр 'all' (все страницы)
$sqlwhere = "1 "; // Условие SQL запроса будет всегда истинным, то есть выбираются все страницы
} elseif ($filter == 'valqueue') { // Если выбран фильтр 'valqueue' (страницы в очереди на проверку)
$sqlwhere = 'page_state = ' . COT_PAGE_STATE_PENDING ; // Условие SQL для выбора страниц с состоянием "в очереди"
} elseif ($filter == 'validated') { // Если выбран фильтр 'validated' (проверенные страницы)
$sqlwhere = 'page_state = ' . COT_PAGE_STATE_PUBLISHED ; // Условие SQL для выбора опубликованных страниц
} elseif ($filter == 'drafts') { // Если выбран фильтр 'drafts' (черновики)
$sqlwhere = 'page_state = ' . COT_PAGE_STATE_DRAFT; // Условие SQL для выбора черновиков
} elseif ($filter == 'expired') { // Если выбран фильтр 'expired' (истекшие страницы)
$sqlwhere = "page_begin > {$sys['now']} OR (page_expire <> 0 AND page_expire < {$sys['now']})"; // Условие SQL для выбора страниц с истекшим сроком действия
}
$catsub = cot_structure_children('page', ''); // Получение подкатегорий страниц с помощью функции cot_structure_children
if (count($catsub) < count(Cot::$structure['page'])) { // Если подкатегорий меньше, чем общее количество категорий
$sqlwhere .= " AND page_cat IN ('" . join("','", $catsub) . "')"; // Добавляем условие SQL для фильтрации по категориям, только для тех страниц, которые относятся к этим подкатегориям
}
$backUrl = cot_import('back', 'G', 'HTM'); // Импорт параметра 'back' из GET-запроса, который может содержать URL для возврата
$backUrl = !empty($backUrl) ? // Если параметр 'back' не пустой
base64_decode($backUrl) : cot_url('admin', $urlParams, '', true); // Декодируем URL из base64, если он есть, или создаем новый URL на страницу администратора с параметрами
/* === Hook === */
foreach (cot_getextplugins('page.admin.first') as $pl) { // Выполняем хуки для расширений в контексте 'page.admin.first'
include $pl; // Подключаем файл плагина, если существует
}
/* ===== */
if ($a == 'validate') { // Если значение переменной $a равно 'validate', выполняем проверку и валидацию страницы
cot_check_xg(); // Проверка на соответствие CSRF токена, для защиты от атак
/* === Hook === */
foreach (cot_getextplugins('page.admin.validate') as $pl) { // Выполняем хуки для расширений в контексте 'page.admin.validate'
include $pl; // Подключаем каждый плагин, если существует
}
/* ===== */
$row = Cot::$db->query( // Запрос к базе данных для получения информации о странице по ее идентификатору
'SELECT page_id, page_alias, page_cat, page_begin, page_state FROM ' . Cot::$db->pages
. ' WHERE page_id = ?', // Извлекаем данные страницы по ее ID
$id // Параметр для запроса (ID страницы)
)->fetch(); // Выполняем запрос и получаем результат
if ($row) { // Если страница найдена в базе
if ($row['page_state'] == COT_PAGE_STATE_PUBLISHED) { // Если страница уже опубликована
cot_message('#' . $id . ' - ' . Cot::$L['adm_already_updated']); // Выводим сообщение, что страница уже обновлена
cot_redirect($backUrl); // Перенаправляем на предыдущую страницу
}
$usr['isadmin_local'] = cot_auth('page', $row['page_cat'], 'A'); // Проверяем, есть ли у пользователя права администратора для категории страницы
cot_block($usr['isadmin_local']); // Блокируем доступ, если нет прав администратора для этой категории
$data = ['page_state' => COT_PAGE_STATE_PUBLISHED]; // Подготавливаем данные для обновления статуса страницы на опубликованный
if ($row['page_begin'] < Cot::$sys['now']) { // Если дата начала страницы меньше текущего времени
$data['page_begin'] = Cot::$sys['now']; // Устанавливаем дату начала как текущее время
}
$sql_page = Cot::$db->update(Cot::$db->pages, $data, "page_id = $id"); // Обновляем статус страницы в базе данных
/* === Hook === */
foreach (cot_getextplugins('page.admin.validate.done') as $pl) { // Выполняем хуки для расширений в контексте 'page.admin.validate.done'
include $pl; // Подключаем каждый плагин, если существует
}
/* ===== */
cot_log( // Логируем действие в системе
Cot::$L['Page'].' #' . $id . ' - ' . Cot::$L['adm_queue_validated'],
'page', // Тип лога (страница)
'validate', // Действие (валидация)
'done' // Статус выполнения
);
if (Cot::$cache) { // Если кэширование включено
Cot::$cache->db->remove('structure', 'system'); // Удаляем кэш структуры
if (Cot::$cfg['cache_page']) { // Если кэширование страниц включено
Cot::$cache->static->clearByUri(cot_page_url($row)); // Очищаем кэш для текущей страницы
Cot::$cache->static->clearByUri(cot_url('page', ['c' => $row['page_cat']])); // Очищаем кэш для категории страницы
}
if (Cot::$cfg['cache_index']) { // Если кэширование главной страницы включено
Cot::$cache->static->clear('index'); // Очищаем кэш главной страницы
}
}
cot_message('#' . $id . ' - ' . Cot::$L['adm_queue_validated']); // Выводим сообщение о том, что страница успешно прошла валидацию
} else { // Если страница не найдена
cot_error('#' . $id . ' - ' . Cot::$L['nf']); // Выводим сообщение об ошибке, что страница не найдена
}
cot_redirect($backUrl); // Перенаправляем на предыдущую страницу
} elseif ($a == 'unvalidate') { // Если значение переменной $a равно 'unvalidate', выполняем действия для отмены валидации
} elseif ($a == 'unvalidate') { // Если значение переменной $a равно 'unvalidate', выполняем отмену валидации страницы
cot_check_xg(); // Проверка на соответствие CSRF токена, для защиты от атак
/* === Hook === */
foreach (cot_getextplugins('page.admin.unvalidate') as $pl) { // Выполняем хуки для расширений в контексте 'page.admin.unvalidate'
include $pl; // Подключаем каждый плагин, если существует
}
/* ===== */
$row = Cot::$db->query( // Запрос к базе данных для получения информации о странице по ее идентификатору
'SELECT page_id, page_alias, page_cat, page_state FROM ' . Cot::$db->pages . ' WHERE page_id = ?', // Извлекаем данные страницы по ее ID
$id // Параметр для запроса (ID страницы)
)->fetch(); // Выполняем запрос и получаем результат
if ($row) { // Если страница найдена в базе
if ($row['page_state'] == COT_PAGE_STATE_PENDING) { // Если страница уже в статусе "Ожидает проверки"
cot_message('#' . $id . ' - ' . Cot::$L['adm_already_updated']); // Выводим сообщение, что страница уже обновлена
cot_redirect($backUrl); // Перенаправляем на предыдущую страницу
}
Cot::$usr['isadmin_local'] = cot_auth('page', $row['page_cat'], 'A'); // Проверяем, есть ли у пользователя права администратора для категории страницы
cot_block($usr['isadmin_local']); // Блокируем доступ, если нет прав администратора для этой категории
$sql_page = Cot::$db->update( // Обновляем статус страницы на "Ожидает проверки" в базе данных
Cot::$db->pages,
['page_state' => COT_PAGE_STATE_PENDING], // Новое состояние страницы - в ожидании
'page_id = ?', // Условие для обновления по ID страницы
$id // Параметр ID страницы
);
cot_log( // Логируем действие в системе
Cot::$L['Page'] . ' #' . $id . ' - ' . Cot::$L['adm_queue_unvalidated'],
'page', // Тип лога (страница)
'unvalidated', // Действие (отмена валидации)
'done' // Статус выполнения
);
if (Cot::$cache) { // Если кэширование включено
Cot::$cache->db->remove('structure', 'system'); // Удаляем кэш структуры
if (Cot::$cfg['cache_page']) { // Если кэширование страниц включено
Cot::$cache->static->clearByUri(cot_page_url($row)); // Очищаем кэш для текущей страницы
Cot::$cache->static->clearByUri(cot_url('page', ['c' => $row['page_cat']])); // Очищаем кэш для категории страницы
}
if (Cot::$cfg['cache_index']) { // Если кэширование главной страницы включено
Cot::$cache->static->clear('index'); // Очищаем кэш главной страницы
}
}
cot_message('#' . $id . ' - ' . Cot::$L['adm_queue_unvalidated']); // Выводим сообщение о том, что валидация страницы отменена
} else { // Если страница не найдена
cot_error('#' . $id . ' - ' . Cot::$L['nf']); // Выводим сообщение об ошибке, что страница не найдена
}
cot_redirect($backUrl); // Перенаправляем на предыдущую страницу
} elseif ($a == 'delete') { // Если значение переменной $a равно 'delete', выполняем удаление страницы
} elseif ($a == 'delete') { // Если значение переменной $a равно 'delete', выполняем удаление страницы
cot_check_xg(); // Проверка на соответствие CSRF токена для защиты от атак
/* === Hook === */
foreach (cot_getextplugins('page.admin.delete') as $pl) { // Выполняем хуки для расширений в контексте 'page.admin.delete'
include $pl; // Подключаем каждый плагин, если существует
}
/* ===== */
$resultOrMessage = cot_page_delete($id); // Вызов функции для удаления страницы с данным ID
if ($resultOrMessage !== false) { // Если удаление прошло успешно
/* === Hook === */
foreach (cot_getextplugins('page.admin.delete.done') as $pl) { // Выполняем хуки для расширений после удаления страницы
include $pl; // Подключаем каждый плагин, если существует
}
/* ===== */
cot_message('#' . $id . ' - ' . $resultOrMessage); // Выводим сообщение об успешном удалении страницы
} else { // Если удаление страницы не удалось
cot_error('#' . $id . ' - ' . Cot::$L['adm_failed']); // Выводим сообщение об ошибке
}
cot_redirect(cot_url('admin', $urlParams, '', true)); // Перенаправляем на страницу админки с обновленными параметрами
} elseif ($a == 'update_checked') { // Если значение переменной $a равно 'update_checked', выполняем обновление выбранных страниц
} elseif ($a == 'update_checked') { // Если значение переменной $a равно 'update_checked', выполняем массовое обновление выбранных страниц
$paction = cot_import('paction', 'P', 'TXT'); // Получаем действие (validate или delete) из запроса
$s = cot_import('s', 'P', 'ARR'); // Получаем список выбранных страниц из массива
if ($paction == 'validate' && is_array($s)) { // Если действие 'validate' и список выбранных страниц существует
cot_check_xp(); // Проверка на соответствие CSRF токена для защиты от атак
$perelik = ''; // Переменная для хранения успешных идентификаторов страниц
$notfoundet = ''; // Переменная для хранения сообщений об ошибках
foreach ($s as $i => $k) { // Для каждой выбранной страницы
if ($s[$i] == '1' || $s[$i] == 'on') { // Проверяем, выбрана ли страница
/* === Hook === */
foreach (cot_getextplugins('page.admin.checked_validate') as $pl) { // Выполняем хуки для расширений в контексте 'page.admin.checked_validate'
include $pl; // Подключаем каждый плагин, если существует
}
/* ===== */
$sql_page = Cot::$db->query('SELECT * FROM ' . Cot::$db->pages . ' WHERE page_id = ?', $i); // Запрашиваем данные страницы по ее ID
if ($row = $sql_page->fetch()) { // Если страница найдена
$id = $row['page_id']; // Получаем ID страницы
$usr['isadmin_local'] = cot_auth('page', $row['page_cat'], 'A'); // Проверяем права администратора для данной страницы
cot_block($usr['isadmin_local']); // Блокируем, если у пользователя нет прав
$sql_page = Cot::$db->update( // Обновляем состояние страницы
Cot::$db->pages,
['page_state' => COT_PAGE_STATE_PUBLISHED], // Устанавливаем состояние как опубликованное
'page_id= ?',
$id
);
cot_log( // Логируем успешное изменение состояния
Cot::$L['Page'] . ' #' . $id . ' - ' . Cot::$L['adm_queue_validated'],
'page',
'validate',
'done'
);
if (Cot::$cache && Cot::$cfg['cache_page']) { // Если включен кэш, очищаем кэш для страницы и категории
Cot::$cache->static->clearByUri(cot_page_url($row));
Cot::$cache->static->clearByUri(cot_url('page', ['c' => $row['page_cat']]));
}
$perelik .= '#' . $id . ', '; // Добавляем ID страницы в список успешных
} else { // Если страница не найдена
$notfoundet .= '#' . $id . ' - ' . Cot::$L['Error'] . '<br />'; // Добавляем ошибку для этой страницы
}
}
}
if (Cot::$cache) { // Если включен кэш
Cot::$cache->db->remove('structure', 'system'); // Очищаем кэш структуры
if (Cot::$cfg['cache_index']) { // Если включен кэш для индекса
Cot::$cache->static->clear('index'); // Очищаем кэш индекса
}
}
if (!empty($notfoundet)) { // Если есть ошибки
cot_error($notfoundet); // Выводим ошибки
}
if (!empty($perelik)) { // Если есть успешные страницы
cot_message($perelik . ' - ' . Cot::$L['adm_queue_validated']); // Выводим сообщение об успешной валидации
}
cot_redirect(cot_url('admin', $urlParams, '', true)); // Перенаправляем на страницу админки с обновленными параметрами
} elseif ($paction == 'delete' && is_array($s)) { // Если действие 'delete' и список выбранных страниц существует
cot_check_xp(); // Проверка на соответствие CSRF токена для защиты от атак
$perelik = ''; // Переменная для хранения успешных идентификаторов страниц
$notfoundet = ''; // Переменная для хранения сообщений об ошибках
foreach ($s as $id => $k) { // Для каждой выбранной страницы
if ($s[$id] == '1' || $s[$id] == 'on') { // Проверяем, выбрана ли страница
/* === Hook === */
foreach (cot_getextplugins('page.admin.checked_delete') as $pl) { // Выполняем хуки для расширений в контексте 'page.admin.checked_delete'
include $pl; // Подключаем каждый плагин, если существует
}
/* ===== */
$resultOrMessage = cot_page_delete($id); // Удаляем страницу с данным ID
if ($resultOrMessage !== false) { // Если удаление прошло успешно
/* === Hook === */
foreach (cot_getextplugins('page.admin.delete.done') as $pl) { // Выполняем хуки для расширений после удаления страницы
include $pl; // Подключаем каждый плагин, если существует
}
/* ===== */
if ($perelik !== '') { // Если уже есть успешные страницы
$perelik .= ', '; // Добавляем разделитель
}
$perelik .= '#' . $id; // Добавляем ID удаленной страницы
} else { // Если удаление не удалось
$notfoundet .= '#'. $id . ' - ' . Cot::$L['Error'] . '<br />'; // Добавляем ошибку для этой страницы
}
}
}
if (!empty($notfoundet)) { // Если есть ошибки
cot_error($notfoundet); // Выводим ошибки
}
if (!empty($perelik)) { // Если есть успешные страницы
cot_message($perelik . ' - ' . Cot::$L['page_deleted']); // Выводим сообщение об успешном удалении
}
cot_redirect(cot_url('admin', $urlParams, '', true)); // Перенаправляем на страницу админки с обновленными параметрами
}
} // Конец обработки действия 'update_checked'
$totalitems = Cot::$db->query('SELECT COUNT(*) FROM ' . Cot::$db->pages . ' WHERE ' . $sqlwhere)->fetchColumn(); // Запрос для получения общего числа страниц, соответствующих условиям $sqlwhere
$pagenav = cot_pagenav( // Генерация пагинации для страниц
'admin', // Страница админки
$common_params, // Общие параметры для URL
$d, // Текущая страница
$totalitems, // Общее количество элементов
Cot::$cfg['maxrowsperpage'], // Максимальное количество строк на странице
'd', // Параметр для передачи в URL
'', // Дополнительные параметры
Cot::$cfg['jquery'] && Cot::$cfg['turnajax'] // Условие для использования AJAX в пагинации
);
$sql_page = Cot::$db->query("SELECT p.*, u.user_name
FROM $db_pages as p
LEFT JOIN $db_users AS u ON u.user_id = p.page_ownerid
WHERE $sqlwhere
ORDER BY $sqlsorttype $sqlsortway
LIMIT $d, ".Cot::$cfg['maxrowsperpage']); // Запрос для получения данных страниц с ограничением по количеству и сортировке
$ii = 0; // Инициализация переменной-счетчика для обработки страниц
/* === Hook - Part1 : Set === */
$extp = cot_getextplugins('page.admin.loop'); // Загружаем расширения для обработки каждой страницы в цикле
/* ===== */
foreach ($sql_page->fetchAll() as $row) { // Проходим по всем страницам, полученным из запроса
$sub_count = 0; // Инициализация переменной для подсчета вложенных страниц
if (isset(Cot::$structure['page'][$row["page_cat"]])) { // Проверка, существует ли структура для категории страницы
$sql_page_subcount = Cot::$db->query("SELECT SUM(structure_count) FROM $db_structure WHERE structure_path LIKE '" .
Cot::$db->prep(Cot::$structure['page'][$row["page_cat"]]['rpath']) . "%' "); // Запрос для получения суммы количества вложенных страниц
$sub_count = $sql_page_subcount->fetchColumn(); // Получение результата запроса
}
$row['page_file'] = intval($row['page_file']); // Преобразуем значение поля page_file в целое число
$t->assign(cot_generate_pagetags($row, 'ADMIN_PAGE_', 200)); // Генерация тегов для страницы и передача их в шаблон
$t->assign([ // Присваиваем значения переменным шаблона
'ADMIN_PAGE_ID_URL' => cot_url('page', 'c=' . $row['page_cat'] . '&id=' . $row['page_id']), // URL для страницы
'ADMIN_PAGE_OWNER' => cot_build_user($row['page_ownerid'], $row['user_name']), // Построение тега для владельца страницы
'ADMIN_PAGE_FILE_BOOL' => $row['page_file'], // Преобразование флага file в булево значение
'ADMIN_PAGE_URL_FOR_VALIDATED' => cot_confirm_url(cot_url('admin', $common_params . '&a=validate&id=' . $row['page_id'] . '&d=' . $durl . '&' . cot_xg()), 'page', 'page_confirm_validate'), // URL для подтверждения валидации страницы
'ADMIN_PAGE_URL_FOR_UNVALIDATE' => cot_confirm_url(cot_url('admin', $common_params . '&a=unvalidate&id=' . $row['page_id'] . '&d=' . $durl . '&' . cot_xg()), 'page', 'page_confirm_unvalidate'), // URL для подтверждения отмены валидации страницы
'ADMIN_PAGE_URL_FOR_DELETED' => cot_confirm_url(cot_url('admin', $common_params . '&a=delete&id=' . $row['page_id'] . '&d=' . $durl . '&' . cot_xg()), 'page', 'page_confirm_delete'), // URL для подтверждения удаления страницы
'ADMIN_PAGE_URL_FOR_EDIT' => cot_url('page', 'm=edit&id=' . $row['page_id']), // URL для редактирования страницы
'ADMIN_PAGE_ODDEVEN' => cot_build_oddeven($ii), // Четность/нечетность строки для чередования стилей
'ADMIN_PAGE_CAT_COUNT' => $sub_count, // Количество вложенных страниц в категории
]);
$t->assign(cot_generate_usertags($row['page_ownerid'], 'ADMIN_PAGE_OWNER_'), htmlspecialchars($row['user_name'])); // Генерация тегов для пользователя (владельца страницы)
/* === Hook - Part2 : Include === */
foreach ($extp as $pl) { // Подключение плагинов для обработки данных страницы
include $pl;
}
/* ===== */
$t->parse('MAIN.PAGE_ROW'); // Отображение строки страницы в шаблоне
$ii++; // Увеличиваем счетчик строк
}
$totaldbpages = Cot::$db->countRows($db_pages); // Подсчитываем количество всех страниц в базе данных
$sql_page_queued = Cot::$db->query('SELECT COUNT(*) FROM ' . Cot::$db->pages . ' WHERE page_state = ' .
COT_PAGE_STATE_PENDING); // Запрос для подсчета страниц в состоянии ожидания
$sys['pagesqueued'] = $sql_page_queued->fetchColumn(); // Сохраняем количество страниц в ожидании в системную переменную
$t->assign([ // Присваиваем значения переменным шаблона
'ADMIN_PAGE_URL_CONFIG' => cot_url('admin', 'm=config&n=edit&o=module&p=page'), // URL для настройки модуля страницы
'ADMIN_PAGE_URL_ADD' => cot_url('page', 'm=add'), // URL для добавления новой страницы
'ADMIN_PAGE_URL_EXTRAFIELDS' => cot_url('admin', 'm=extrafields&n=' . $db_pages), // URL для редактирования дополнительных полей страницы
'ADMIN_PAGE_URL_STRUCTURE' => cot_url('admin', 'm=structure&n=page'), // URL для настройки структуры страниц
'ADMIN_PAGE_FORM_URL' => cot_url('admin', $common_params.'&a=update_checked&d=' . $durl), // URL для обновления выбранных страниц
'ADMIN_PAGE_ORDER' => cot_selectbox($sorttype, 'sorttype', array_keys($sort_type), array_values($sort_type), false), // Селектор для сортировки по типу
'ADMIN_PAGE_WAY' => cot_selectbox($sortway, 'sortway', array_keys($sort_way), array_values($sort_way), false), // Селектор для сортировки по направлению (возрастание/убывание)
'ADMIN_PAGE_FILTER' => cot_selectbox($filter, 'filter', array_keys($filter_type), array_values($filter_type), false), // Селектор для фильтрации
'ADMIN_PAGE_TOTALDBPAGES' => $totaldbpages, // Общее количество страниц в базе данных
'ADMIN_PAGE_ON_PAGE' => $ii, // Количество страниц, отображаемых на текущей странице
]);
if (isset(Cot::$cfg['legacyMode']) && Cot::$cfg['legacyMode']) { // Проверка на устаревший режим
// @deprecated in 0.9.25
$is_row_empty = $sql_page->rowCount() == 0 ? true : false; // Проверка на наличие данных в запросе
// @deprecated in 0.9.24
$t->assign([ // Присваиваем переменные для пагинации
'ADMIN_PAGE_PAGINATION_PREV' => $pagenav['prev'], // Ссылка на предыдущую страницу
'ADMIN_PAGE_PAGNAV' => $pagenav['main'], // Главная навигация пагинации
'ADMIN_PAGE_PAGINATION_NEXT' => $pagenav['next'], // Ссылка на следующую страницу
'ADMIN_PAGE_TOTALITEMS' => $totalitems, // Общее количество элементов
]);
}
$t->assign(cot_generatePaginationTags($pagenav)); // Генерация тегов для пагинации
cot_display_messages($t); // Отображение сообщений (например, ошибок или успешных операций)
/* === Hook === */
foreach (cot_getextplugins('page.admin.tags') as $pl) { // Подключение плагинов для обработки дополнительных тегов
include $pl; // Подключение плагинов
}
/* ===== */
$t->parse('MAIN'); // Отображаем шаблон для основной части страницы
$adminMain = $t->text('MAIN'); // Сохраняем результат шаблона в переменную
Комментарии (0)
Автор контента
Онлайн
Sodium Carbonate
Последняя авторизация: 19.07.2026 00:02
- Страница размещена: 02.02.2025 19:15
- Последнее обновление: 02.02.2025 19:15