Файл page.add.php в Cotonti

предоставляет администраторам и пользователям с соответствующими правами, форму создания новый страницы, заполнять их мета-данные, описания

Описание кода файла "page.add.php" в Cotonti CMF

Основное назначение файла и его место в системе Cotonti

Файл "page.add.php" в системе Cotonti CMF предназначен для обработки добавления новых страниц в систему. Он является важной частью административного интерфейса сайта, позволяя администраторам и пользователям с соответствующими правами создавать новые страницы, заполнять их мета-данные, описания, а также управлять дополнительными полями и аттрибутами страницы.

Этот файл находится в директории модуля /modules/page/ и работает как серверный сценарий для добавления страниц через административный интерфейс сайта. Он включает логику и взаимодействие с пользователем на этапах подачи формы, обработки данных и вывода результата. Также важным аспектом является управление метаданными страниц, такими как заголовки, ключевые слова, URL-адреса, даты, категории и другие параметры.

Взаимодействие с другими частями сайта

Файл "page.add.php" взаимодействует с несколькими компонентами системы:

  1. Модуль "pages": Он используется для работы с страницами, такими как создание, редактирование, вывод и управление дополнительными полями.
  2. Шаблоны (templates): Взаимодействует с шаблонами для вывода формы добавления страницы.
  3. Плагины: Файл использует хуки для расширяемости, позволяя подключать дополнительные функции через плагины.
  4. Переменные конфигурации: Работает с переменными конфигурации, хранящими настройки для страницы и глобальные параметры системы.
  5. Функции и классы Cotonti: Использует стандартные функции и классы Cotonti для работы с данными (например, для генерации полей формы, вывода сообщений и обработки ошибок).

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

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

    • Cot::$out: Массив, который хранит данные для вывода в шаблон, такие как заголовок страницы, мета-информация, хлебные крошки и т. д.
    • Cot::$L: Массив локализованных строк, используемый для вывода текста на разных языках (например, Cot::$L['page_addtitle']).
    • Cot::$cfg: Массив конфигурационных параметров системы, например, Cot::$cfg['page']['autovalidate'] для автоподтверждения.
    • Cot::$usr: Массив данных о текущем пользователе (например, Cot::$usr['isadmin'] проверяет, является ли пользователь администратором).
    • $breadcrumbs: Массив хлебных крошек для навигации по сайту.
    • $pageadd_array: Массив данных, который передается в шаблон и содержит параметры формы добавления страницы.
  2. Хуки:

    • page.add.main: Этот хук позволяет подключать дополнительные плагины и расширения в процессе добавления страницы.
    • page.add.tags: Хук для подключения плагинов, которые могут изменять теги и элементы формы добавления страницы.
  3. Методы и функции:

    • cot_url(): Функция для генерации URL-адресов, используемая для формирования ссылки на добавление страницы.
    • cot_selectbox_structure(): Функция для генерации выпадающих списков с категориями страниц.
    • cot_inputbox(): Функция для генерации текстовых полей ввода для различных параметров страницы.
    • cot_textarea(): Функция для генерации многострочных текстовых полей.
    • cot_display_messages(): Функция для отображения сообщений об ошибках или успехах.
    • cot_build_extrafields(): Функция для генерации дополнительных полей на основе их конфигурации.
    • cot_extrafield_title(): Функция для получения заголовков дополнительных полей.
    • cot_selectbox_date(): Функция для генерации выпадающих списков с датами (например, для указания даты создания страницы).
    • cot_build_user(): Функция для генерации ссылки на пользователя (владельца страницы).
  4. Классы:

    • XTemplate: Класс для работы с шаблонами, который используется для рендеринга данных в HTML.

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

Этот файл обрабатывает запросы на создание новой страницы на сайте. Он выполняет несколько основных задач:

  1. Подготовка данных: Создание массива $pageadd_array, который включает все необходимые поля для формы добавления страницы, такие как название, описание, метаданные, дополнительные поля и т. д.
  2. Шаблонизация: Использование библиотеки XTemplate для обработки и вывода формы добавления страницы. Все данные передаются в шаблон для отображения на стороне пользователя.
  3. Обработка дополнительных полей: Если для страниц настроены дополнительные поля, они добавляются к форме.
  4. Обработка ошибок и сообщений: Вывод сообщений об ошибках или успешных действиях с помощью функции cot_display_messages().
  5. Плагины: Использование хуков для подключения дополнительных функций и плагинов через систему расширений.
  6. Управление правами доступа: Проверка прав пользователя (например, администратор может сразу публиковать страницу).
  7. Подключение внешних файлов: Файл подключает другие компоненты сайта, такие как заголовок страницы и футер.

Задачи, функции и условия, выполняемые файлом

  • Создание страницы: Основная цель этого файла — создание новой страницы с помощью формы, которая заполняется пользователем.
  • Публикация и доступ: В зависимости от настроек конфигурации и прав пользователя, он может либо сразу публиковать страницу, либо оставить ее на проверку.
  • Дополнительные поля: Формы могут содержать дополнительные настраиваемые поля, которые позволяют администраторам добавлять специфичные данные к страницам.
  • Управление мета-данными: Форма позволяет задавать мета-заголовки, описание и ключевые слова для страницы, что полезно для SEO.
  • Обработка ошибок: Если пользователь вводит неверные данные или возникла ошибка, она будет отображена на странице.

Как владельцу сайта использовать данный файл

Владелец сайта может использовать этот файл для настройки и управления созданием новых страниц на своем сайте. Это включает в себя:

  • Настройка полей: Используя дополнительные поля, можно настроить формы для сбора информации о страницах, например, для SEO-оптимизации.
  • Управление доступом: Администраторы могут настраивать права доступа, чтобы только определенные пользователи могли создавать или редактировать страницы.
  • Использование плагинов: Возможность расширить функционал через хуки и плагины, подключая дополнительные функции в процесс добавления страниц.
  • SEO-оптимизация: Модификация мета-данных страниц, таких как ключевые слова, описание и заголовки.

Стиль написания PHP-кода и совместимость с версиями PHP

  • Стиль написания: Код написан в стиле PHP5 и выше. В нем используется объектно-ориентированный подход для работы с шаблонами (через класс XTemplate) и массивами для хранения данных, что характерно для более современных версий PHP. Весь код структурирован и легко расширяем.
  • Совместимость с PHP: Код совместим с версиями PHP5.6 и выше, однако рекомендуется использовать PHP7 и выше для обеспечения лучшей производительности и безопасности.

Заключение

Файл "page.add.php" является важной частью системы Cotonti, отвечающей за добавление страниц в систему. Он предоставляет форму для создания новых страниц с множеством настраиваемых полей, управляет правами пользователей, выводит ошибки и подключает дополнительные плагины для расширяемости.

 

<?php
/**
 * Add page.
 *
 * @package Page
 * @copyright (c) Cotonti Team
 * @license https://github.com/Cotonti/Cotonti/blob/master/License.txt
 */

defined('COT_CODE') or die('Wrong URL'); // Проверка на правильность вызова файла, если файл был вызван напрямую, скрипт завершится с ошибкой.

require_once cot_incfile('forms'); // Подключение файла 'forms.php' для работы с формами в системе Cotonti.

$id = cot_import('id', 'G', 'INT'); // Импорт параметра 'id' из глобальных данных GET (если есть), ожидается целое число.
$c = cot_import('c', 'G', 'TXT'); // Импорт параметра 'c' из глобальных данных GET, ожидается строка.

if (empty($c) && !isset(Cot::$structure['page'][$c])) { // Если параметр 'c' пуст или не существует в структуре страниц Cotonti.
	$c = ''; // Устанавливается пустое значение для переменной 'c'.
}

list(Cot::$usr['auth_read'], Cot::$usr['auth_write'], Cot::$usr['isadmin']) = cot_auth('page', 'any'); // Получение прав доступа пользователя (чтение, запись, администратор) для страницы.

 /* === Hook === */
foreach (cot_getextplugins('page.add.first') as $pl) { // Выполнение хуков, подключаемых для действия 'page.add.first'.
	include $pl; // Подключение каждого плагина, найденного для этого хука.
}
/* ===== */
cot_block(Cot::$usr['auth_write']); // Проверка прав на запись для текущего пользователя. Если прав нет — доступ заблокирован.

Cot::$sys['parser'] = Cot::$cfg['page']['parser']; // Устанавливается значение парсера для страниц из конфигурации.
$parser_list = cot_get_parsers(); // Получение списка доступных парсеров для контента.

 

if ($a == 'add') { // Проверка, если действие равно 'add' (добавление страницы).
	cot_shield_protect(); // Защита от CSRF атак, проверка на корректность токена сессии.

	/* === Hook === */
	foreach (cot_getextplugins('page.add.add.first') as $pl) { // Выполнение хуков перед обработкой добавления страницы.
		include $pl; // Подключение каждого плагина для этого хука.
	}
	/* ===== */

	$rpage = cot_page_import('POST', array(), Cot::$usr); // Импорт данных страницы из формы, переданных через метод POST. Данные обрабатываются для текущего пользователя.

	list(Cot::$usr['auth_read'], Cot::$usr['auth_write'], Cot::$usr['isadmin']) = cot_auth('page', $rpage['page_cat']); // Получение прав доступа пользователя (чтение, запись, администратор) для категории страницы.
	cot_block(Cot::$usr['auth_write']); // Проверка прав на запись для текущего пользователя. Если прав нет — доступ заблокирован.

	/* === Hook === */
	foreach (cot_getextplugins('page.add.add.import') as $pl) { // Выполнение хуков во время импорта данных страницы.
		include $pl; // Подключение каждого плагина для этого хука.
	}
	/* ===== */

	cot_page_validate($rpage); // Валидация данных страницы перед добавлением.

	/* === Hook === */
	foreach (cot_getextplugins('page.add.add.error') as $pl) { // Выполнение хуков в случае ошибок во время добавления страницы.
		include $pl; // Подключение каждого плагина для этого хука.
	}
	/* ===== */

	if (!cot_error_found()) { // Если ошибок не найдено, продолжаем обработку добавления страницы.
		$id = cot_page_add($rpage, Cot::$usr); // Добавление страницы в базу данных и получение её ID.

		switch ($rpage['page_state']) { // Обработка состояния страницы после добавления.
			case 0:
                $r_url = cot_page_url($rpage, [], '', true); // Если страница опубликована, создается URL страницы.
				break;
			case 1:
				$r_url = cot_url('message', 'msg=300', '', true); // Если страница ожидает утверждения, перенаправление на страницу сообщения.
				break;
			case 2:
				cot_message('page_savedasdraft'); // Если страница сохранена как черновик, выводится сообщение.
				$r_url = cot_url('page', 'm=edit&id='.$id, '', true); // Перенаправление на редактирование страницы.
				break;
		}
		cot_redirect($r_url); // Перенаправление пользователя в зависимости от состояния страницы.

	} else { // Если были ошибки при добавлении страницы.
        $urlParams = ['m' => 'add']; // Параметры для URL, если произошла ошибка при добавлении.
	    if (!empty($c)) { // Если передана категория, добавляем её в параметры.
            $urlParams['c'] = $c;
        }
		cot_redirect(cot_url('page', $urlParams, '', true)); // Перенаправление на страницу добавления с ошибками.
	}
}

 

$rpage = [ // Инициализация массива с пустыми значениями для всех ключевых данных страницы.
    'page_keywords' => '', // Ключевые слова страницы.
    'page_metatitle' => '', // Мета-тайтл страницы.
    'page_metadesc' => '', // Мета-описание страницы.
    'page_alias' => '', // Псевдоним страницы (SEO-оптимизация).
    'page_title' => '', // Заголовок страницы.
    'page_desc' => '', // Описание страницы.
    'page_author' => '', // Автор страницы.
    'page_file' => '', // Файл, связанный с страницей (если есть).
    'page_url' => '', // URL страницы.
    'page_size' => '', // Размер страницы.
    'page_text' => '', // Основной текст страницы.
];

// Page cloning support
$clone = cot_import('clone', 'G', 'INT'); // Получаем параметр 'clone' из URL (если он передан) как целое число.
if ($clone > 0) { // Если параметр 'clone' больше 0 (означает, что требуется клонировать страницу).
	$rpage = Cot::$db->query('SELECT * FROM ' . Cot::$db->pages . ' WHERE page_id = ?', $clone)->fetch(); // Запрос в базу данных для получения данных страницы с указанным ID.
    if (!$rpage) { // Если страница с таким ID не найдена.
        cot_die_message(404); // Выводим сообщение об ошибке 404 (страница не найдена).
    }
}

if (empty($rpage['page_cat'])) { // Если категория страницы не указана.
    $rpage['page_cat'] = isset($c) ? $c : ''; // Устанавливаем категорию страницы, если параметр 'c' существует, или оставляем пустым.
}

$breadcrumbs = []; // Инициализация массива для хлебных крошек (не используется на данном этапе).
$urlParams = ['m' => 'add']; // Параметры для URL, указывающие на действие добавления страницы.

 

if (!empty($rpage['page_cat'])) { // Если категория страницы не пуста.
    list(Cot::$usr['auth_read'], Cot::$usr['auth_write'], Cot::$usr['isadmin']) = cot_auth('page', $rpage['page_cat']); // Проверка прав пользователя для данной категории страницы.
    cot_block(Cot::$usr['auth_write']); // Если у пользователя нет прав на запись, выполнение будет остановлено.

    if (!Cot::$usr['isadmin'] && Cot::$structure['page'][$rpage['page_cat']]['locked']) { // Если пользователь не является администратором и категория страницы заблокирована.
        cot_die_message(602, TRUE); // Выводим сообщение об ошибке (код 602 — доступ запрещен для категории).
    }

    Cot::$sys['sublocation'] = Cot::$structure['page'][$rpage['page_cat']]['title']; // Устанавливаем подзаголовок (sublocation) в зависимости от категории страницы.
    $mskin = cot_tplfile(['page', 'add', Cot::$structure['page'][$rpage['page_cat']]['tpl']]); // Загружаем шаблон для страницы в зависимости от категории.
    $breadcrumbs = cot_structure_buildpath('page', $rpage['page_cat']); // Строим хлебные крошки для текущей категории.
    $urlParams['c'] = $rpage['page_cat']; // Добавляем параметр категории в URL.
} else { // Если категория страницы пуста.
    if (!Cot::$usr['isadmin']) { // Если пользователь не является администратором.
        // User can add page to these categories
        $categories = []; // Инициализация массива доступных категорий.
        if (!empty(Cot::$structure['page'])) { // Если есть страницы в структуре.
            foreach (Cot::$structure['page'] as $i => $x) { // Проходим по всем категориям страниц.
                $display = cot_auth('page', $i, 'W'); // Проверяем права на запись для категории.
                if ($display && !empty($subcat) && isset(Cot::$structure['page'][$subcat])) { // Если категория доступна для записи и существует подкатегория.
                    $mtch = Cot::$structure['page'][$subcat]['path'] . "."; // Получаем путь подкатегории.
                    $mtchlen = mb_strlen($mtch); // Длина пути подкатегории.
                    $display = (mb_substr($x['path'], 0, $mtchlen) == $mtch || $i === $subcat); // Проверяем, соответствует ли путь категории подкатегории.
                }
                if ($i != 'all' && $display) { // Если категория не является "all" и доступна для записи.
                    $categories[] = $i; // Добавляем категорию в список доступных.
                }
            }
        }
        cot_block(count($categories) > 0); // Если нет доступных категорий для добавления страницы, выполнение будет остановлено.
    }

    Cot::$sys['sublocation'] = Cot::$L['page_addtitle']; // Устанавливаем подзаголовок для страницы добавления.
    $mskin = cot_tplfile(['page', 'add']); // Загружаем шаблон для страницы добавления.
}

 

Cot::$out['subtitle'] = Cot::$L['page_addsubtitle']; // Устанавливаем подзаголовок страницы в вывод (заголовок страницы добавления).
if (!isset(Cot::$out['head'] )) { // Если в выводе не установлен блок 'head'.
    Cot::$out['head']  = ''; // Инициализируем блок 'head' как пустую строку.
}
Cot::$out['head'] .= Cot::$R['code_noindex']; // Добавляем мета-тег для запрета индексирования страницы (noindex) в блок 'head'.

$breadcrumbs[] = [cot_url('page', $urlParams), Cot::$L['page_addtitle']]; // Добавляем хлебные крошки для страницы добавления.

 /* === Hook === */
foreach (cot_getextplugins('page.add.main') as $pl) { // Подключаем расширения плагинов, связанных с добавлением страницы.
	include $pl; // Включаем каждый найденный плагин.
}
/* ===== */

require_once Cot::$cfg['system_dir'].'/header.php'; // Подключаем файл заголовка системы (обычно для подключения необходимых библиотек и файлов).
$t = new XTemplate($mskin); // Инициализируем объект шаблонизатора XTemplate с выбранным шаблоном.

 

$pageadd_array = [ // Массив, содержащий все данные, необходимые для формы добавления страницы.
	'PAGEADD_PAGETITLE' => Cot::$L['page_addtitle'], // Заголовок страницы добавления.
    'PAGEADD_BREADCRUMBS' => cot_breadcrumbs($breadcrumbs, Cot::$cfg['homebreadcrumb']), // Хлебные крошки для страницы.
	'PAGEADD_SUBTITLE'  => Cot::$L['page_addsubtitle'], // Подзаголовок страницы добавления.
	'PAGEADD_ADMINEMAIL' => 'mailto:' . Cot::$cfg['adminemail'], // Ссылка для отправки email администратору.
	'PAGEADD_FORM_SEND' => cot_url('page', 'm=add&a=add&c=' . $c), // URL для отправки формы добавления страницы.
	'PAGEADD_FORM_CAT' => cot_selectbox_structure('page', $rpage['page_cat'], 'rpagecat'), // Выпадающий список для выбора категории страницы.
	'PAGEADD_FORM_CAT_SHORT' => cot_selectbox_structure('page', $rpage['page_cat'], 'rpagecat', $c), // Короткая версия выбора категории страницы.
	'PAGEADD_FORM_KEYWORDS' => cot_inputbox('text', 'rpagekeywords', $rpage['page_keywords'], ['maxlength' => '255']), // Поле для ввода ключевых слов страницы.
	'PAGEADD_FORM_METATITLE' => cot_inputbox('text', 'rpagemetatitle', $rpage['page_metatitle'], ['maxlength' => '255']), // Поле для ввода мета-заголовка страницы.
	'PAGEADD_FORM_METADESC' => cot_textarea('rpagemetadesc', $rpage['page_metadesc'], 2, 64, ['maxlength' => '255']), // Поле для ввода мета-описания страницы.
	'PAGEADD_FORM_ALIAS' => cot_inputbox('text', 'rpagealias', $rpage['page_alias'], ['maxlength' => '255']), // Поле для ввода псевдонима (алиаса) страницы.
	'PAGEADD_FORM_TITLE' => cot_inputbox('text', 'rpagetitle', $rpage['page_title'], ['maxlength' => '255']), // Поле для ввода заголовка страницы.
	'PAGEADD_FORM_DESCRIPTION' => cot_textarea('rpagedesc', $rpage['page_desc'], 2, 64, ['maxlength' => '255']), // Поле для ввода описания страницы.
	'PAGEADD_FORM_AUTHOR' => cot_inputbox('text', 'rpageauthor', $rpage['page_author'], ['maxlength' => '100']), // Поле для ввода автора страницы.
	'PAGEADD_FORM_OWNER' => cot_build_user(Cot::$usr['id'], Cot::$usr['name']), // Отображение владельца страницы (пользователя, который добавляет страницу).
	'PAGEADD_FORM_OWNER_ID' => Cot::$usr['id'], // ID владельца страницы.
	'PAGEADD_FORM_DATE' => cot_selectbox_date(Cot::$sys['now'], 'long', 'rpagedate'), // Поле для выбора даты создания страницы.
	'PAGEADD_FORM_BEGIN' => cot_selectbox_date(Cot::$sys['now'], 'long', 'rpagebegin'), // Поле для выбора даты начала действия страницы.
	'PAGEADD_FORM_EXPIRE' => cot_selectbox_date(0, 'long', 'rpageexpire'), // Поле для выбора даты окончания действия страницы.
	'PAGEADD_FORM_FILE' => cot_selectbox( // Поле для выбора типа файла страницы (файл или ссылка).
        $rpage['page_file'],
        'rpagefile',
        range(0, 2),
        [Cot::$L['No'], Cot::$L['Yes'], Cot::$L['Members_only']],
        false
    ),
	'PAGEADD_FORM_URL' => cot_inputbox('text', 'rpageurl', $rpage['page_url'], ['maxlength' => '255']), // Поле для ввода URL страницы.
	'PAGEADD_FORM_SIZE' => cot_inputbox('text', 'rpagesize', $rpage['page_size'], ['maxlength' => '255']), // Поле для ввода размера страницы.
	'PAGEADD_FORM_TEXT' => cot_textarea('rpagetext', $rpage['page_text'], 24, 120, '', 'input_textarea_editor'), // Основное поле для ввода текста страницы (с редактором).
	'PAGEADD_FORM_PARSER' => cot_selectbox(Cot::$cfg['page']['parser'], 'rpageparser', $parser_list, $parser_list, false), // Поле для выбора парсера (форматирования) текста страницы.
];

 

if (isset(Cot::$cfg['legacyMode']) && Cot::$cfg['legacyMode']) { // Проверка, включен ли устаревший режим (legacy mode).
    // @deprecated in 0.9.24
    $t->assign([ // Назначение значений для шаблона, если legacyMode включен.
        'PAGEADD_FORM_OWNERID' => Cot::$usr['id'], // ID владельца страницы.
        'PAGEADD_FORM_DESC' => cot_textarea('rpagedesc', $rpage['page_desc'], 2, 64, ['maxlength' => '255']), // Текстовое поле для ввода описания страницы.
    ]);
}

$t->assign($pageadd_array); // Назначение значений из массива $pageadd_array в шаблон.


// Extra fields - Дополнительные поля
if (!empty(Cot::$extrafields[Cot::$db->pages])) { // Проверка, существуют ли дополнительные поля для страниц.
    foreach (Cot::$extrafields[Cot::$db->pages] as $exfld) { // Проходим по всем дополнительным полям.
        $uname = strtoupper($exfld['field_name']); // Преобразование имени поля в верхний регистр.
        $data = isset($rpage['page_' . $exfld['field_name']]) ? $rpage['page_' . $exfld['field_name']] : null; // Получение данных для поля, если они есть.
        $exfld_val = cot_build_extrafields('rpage' . $exfld['field_name'], $exfld, $data); // Генерация HTML для дополнительного поля.
        $exfld_title = cot_extrafield_title($exfld, 'page_'); // Получение заголовка для дополнительного поля.

        $t->assign([ // Назначение значений для шаблона.
            'PAGEADD_FORM_' . $uname => $exfld_val, // Назначение значения для поля.
            'PAGEADD_FORM_' . $uname . '_TITLE' => $exfld_title, // Назначение заголовка для поля.
            'PAGEADD_FORM_EXTRAFLD' => $exfld_val, // Назначение значения для дополнительного поля.
            'PAGEADD_FORM_EXTRAFLD_TITLE' => $exfld_title, // Назначение заголовка для дополнительного поля.
        ]);
        $t->parse('MAIN.EXTRAFLD'); // Разбор дополнительного поля в шаблоне.
    }
}

// Error and message handling - Обработка ошибок и сообщений
cot_display_messages($t); // Отображение сообщений об ошибках или успехах.

 /* === Hook === */
foreach (cot_getextplugins('page.add.tags') as $pl) { // Подключение внешних плагинов для страницы добавления.
	include $pl; // Включение плагина.
}
/* ===== */

$usr_can_publish = false; // Переменная, которая будет определять, может ли пользователь публиковать страницу.
if (Cot::$usr['isadmin']) { // Если пользователь является администратором.
	if (Cot::$cfg['page']['autovalidate']) { // Если автоподтверждение включено в конфигурации страницы.
        $usr_can_publish = true; // Администратор может публиковать страницу.
    }
	$t->parse('MAIN.ADMIN'); // Разбор блока для администраторов в шаблоне.
}

$t->parse('MAIN'); // Разбор основного шаблона.
$t->out('MAIN'); // Вывод основного шаблона.

require_once Cot::$cfg['system_dir'] . '/footer.php'; // Подключение файла footer.php для завершения страницы.

Пояснения:

  1. Legacy Mode: Если установлен флаг legacyMode, то назначаются специфические переменные для формы добавления страницы.
  2. Дополнительные поля: Код добавляет дополнительные пользовательские поля для страницы, если они есть в конфигурации (Cot::$extrafields).
  3. Обработка сообщений: Используется функция cot_display_messages(), чтобы отображать сообщения об ошибках или успехах.
  4. Плагины: Включаются внешние плагины, если они зарегистрированы в системе.
  5. Административные функции: Если пользователь администратор и включено автоподтверждение, ему разрешается публиковать страницы без предварительного утверждения.
  6. Шаблон: Основной шаблон парсится и выводится с помощью $t->parse() и $t->out().
14 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-19 10:26

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:18
  • Last update: 2025-02-02 19:28

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