Файл page.admin.php в Cotonti

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

Опубликовано в: Модуль Pages в Cotonti CMF

Описание файла "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 минут чтения Sodium Carbonate

Комментарии (0)

Комментарии отсутствуют
Добавление комментариев доступно только зарегистрированным пользователям

Автор контента

webitproff

Онлайн

Sodium Carbonate

Последняя авторизация: 19.07.2026 00:02

  • Страница размещена: 02.02.2025 19:15
  • Последнее обновление: 02.02.2025 19:15

Похожие страницы

Файл "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", и он отвечает за