Файл page.admin.php в Cotonti

отвечает за отображение и управление страницами в админке сайта, в том числе их создание, редактирование, сортировку и фильтрацию

Описание файла "page.admin.php" в Cotonti

Основное назначение и место в системе Cotonti:

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

Файл расположен в директории /modules/page/admin/ или аналогичной директории модуля, и является частью административной части сайта, отвечающей за обработку страниц в системе.

Взаимодействие внутри сайта:

Файл page.admin.php используется для обработки запросов, связанных с административным управлением страницами. Он взаимодействует с базой данных для получения информации о страницах, их сортировке и фильтрации, а также предоставляет интерфейс для выполнения действий с этими страницами (например, добавление, редактирование, удаление, изменение состояния).

Переменные, хуки, методы, функции, классы:

  1. Переменные:

    • $totalitems: Хранит количество всех страниц в базе данных, получаемое с помощью запроса к базе данных.
    • $pagenav: Массив, содержащий информацию о пагинации (предыдущая страница, текущая страница, следующая страница) и других данных, необходимых для построения навигации.
    • $sql_page: Результат запроса к базе данных для получения данных о страницах.
    • $extp: Массив, содержащий пути к плагинам, которые могут быть подключены для обработки дополнительных тегов.
    • $sub_count: Количество подстраниц для каждой категории.
    • $sys: Массив системных переменных, таких как количество страниц в ожидании.
  2. Хуки:

    • Hook - Part1 : Set: cot_getextplugins('page.admin.loop') — Хук для добавления плагинов, которые должны быть выполнены в начале обработки.
    • Hook - Part2 : Include: Включение плагинов в процессе работы с каждой страницей.
    • Hook для тегов: cot_getextplugins('page.admin.tags') — Позволяет подключать плагины для обработки дополнительных тегов.
  3. Методы и функции:

    • 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(): Отображение сообщений об ошибках или успешных действиях.
  4. Классы:

    • Cot::$db: Это экземпляр класса базы данных, который используется для взаимодействия с базой данных.
    • $t: Это объект класса XTemplate, который используется для рендеринга шаблонов и работы с переменными.

Суть содержания кода:

Код в файле page.admin.php выполняет несколько ключевых задач:

  1. Подсчет страниц: Код извлекает количество страниц в базе данных, а также количество страниц в ожидании, используя SQL-запросы. Это позволяет администратору видеть статистику по всем страницам сайта.

  2. Фильтрация и сортировка: Код позволяет администратору фильтровать и сортировать страницы по различным параметрам (например, по дате, статусу и т.д.), что облегчает управление контентом.

  3. Пагинация: Пагинация обеспечивается через функцию cot_pagenav(), которая позволяет разбивать страницы на несколько частей, если количество записей слишком велико для отображения на одной странице. Это улучшает навигацию по списку страниц.

  4. Отображение данных: Каждая страница отображается с соответствующими тегами и данными, такими как автор страницы, ее состояние (опубликована, ожидает подтверждения), и возможность редактировать, удалить или изменить состояние страницы.

  5. Подключение плагинов: Код поддерживает использование плагинов через хуки, что позволяет расширять функциональность админки без изменения основного кода.

  6. Обработка действий: Код обеспечивает создание 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'); // Сохраняем результат шаблона в переменную

 

20 minutes read Sodium Carbonate

Comments (0)

No comments yet
Only registered users can post new comments

Article multicategories

Additional categories where this article is shown as similar.

Content author

webitproff

Offline

Sodium Carbonate

Last logged: 2026-09-18 20:01

About me briefly
Support and development of web projects on the CMF Cotonti: private messengers via the website, open and closed small social networks, trading platforms and marketplaces, freelance and services exchange portal, catalogs of goods from wholesale suppliers, dropshipping platforms, online stores, and much more.
View developments and download
Public portfolio of my works and developments
Telegram for messages
@webitproff
Telegram channel
@s/aBuyFILE
  • Page published: 2025-02-02 19:15
  • Last update: 2025-02-02 19:15

Similar pages

Файл "page.admin.home.php" модуль "Page" в Cotonti
1 Описание файла "page.admin.home.php" в Cotonti CMF Файл "page.admin.home.php" является частью
Файл page.php в Cotonti
2 описание файла page.php в Cotonti CMF Основное назначение и место в системе Cotonti Файл page.php — это главный
Файл page.setup.php в Cotonti
3 Основное назначение файла и его место в системе Cotonti Файл page.setup.php является конфигурационным файлом модуля
Файл page.header.php в Cotonti
4 описание файла page.header.php в Cotonti CMF  1. Основное назначение и место в системе Cotonti Файл page.header.php
Файл "page.extrafields.php" в Cotonti CMF
5 Файл "page.extrafields.php" в системе Cotonti CMF является частью модуля "page", и он отвечает за