Функция cot_url в Cotonti
Функция cot_url() формирует корректный URL, следуя заданным правилам. Она поддерживает параметры в виде массива или строки, обработку якорей (постфиксов), глобальные дополнения URL
1. Тема и описание функции cot_url в Cotonti:
Функция cot_url() формирует корректный URL, следуя заданным правилам. Она поддерживает параметры в виде массива или строки, обработку якорей (постфиксов), глобальные дополнения URL, а также возможность кастомизации через функцию cot_url_custom().
Функция принимает параметры в виде имени модуля или скрипта, массива параметров или строки, постфикса URL и двух логических флагов.
Сначала параметры нормализуются: строка преобразуется в массив, пустые значения удаляются, а булевые значения приводятся к числам.
Если существует пользовательская функция cot_url_custom, управление передается ей.
Формируется базовый URL на основе имени модуля, при необходимости добавляются дополнительные параметры.
Создается строка запроса, и URL возвращается как результат.
2. Код штатной функции cot_url в Cotonti:
/**
* Преобразует параметры в URL с учетом пользовательских правил.
* Эта функция может быть перегружена функцией cot_url_custom().
*
* @param string $name Имя модуля или скрипта
* @param array|string $params Параметры URL в виде массива или строки
* @param string $tail Постфикс URL, например, якорь
* @param bool $htmlspecialcharsBypass Если TRUE, не преобразует & в & и другие специальные символы
* @param bool $ignoreAppendix Если TRUE, $cot_url_appendix игнорируется для данного URL
* @return string Корректный HTTP URL
*/
function cot_url($name, $params = '', $tail = '', $htmlspecialcharsBypass = false, $ignoreAppendix = false)
{
global $cot_url_appendix; // Используется глобальная переменная $cot_url_appendix для добавления параметров к URL.
// Предварительная обработка аргументов
if (is_string($params)) {
$params = cot_parse_str($params);
// Если $params переданы в виде строки, вызывается функция cot_parse_str, которая преобразует строку в массив параметров.
} elseif (!is_array($params)) {
$params = [];
// Если $params не является массивом, оно приводится к пустому массиву.
}
if (!$ignoreAppendix && count($cot_url_appendix) > 0) {
$params = $params + $cot_url_appendix;
// Если $ignoreAppendix равно FALSE и $cot_url_appendix содержит параметры, они добавляются к массиву $params.
}
// Обработка параметров
foreach ($params as $k => $param) {
if (is_bool($param)) {
$params[$k] = (int) $param;
// Если параметр является булевым значением, он преобразуется в целое число (0 или 1).
}
if (!is_array($param) && !is_object($param)) {
$params[$k] = strval($param);
// Если параметр не является массивом или объектом, он приводится к строке.
}
if ($params[$k] === '' || $params[$k] === null) {
unset($params[$k]);
// Если значение параметра пустое или равно null, оно удаляется из массива $params.
}
}
// Проверка наличия пользовательской функции cot_url_custom
if (function_exists('cot_url_custom')) {
return cot_url_custom($name, $params, $tail, $htmlspecialcharsBypass);
// Если существует функция cot_url_custom, управление передается ей, и текущая функция завершает работу.
}
// Определение базового URL
$url = in_array($name, array('admin', 'login', 'message')) ? "$name.php" : 'index.php';
// Если $name является одним из 'admin', 'login' или 'message', базовый URL устанавливается как $name.php, иначе используется 'index.php'.
if (!in_array($name, array('admin', 'index', 'login', 'message', 'plug'))) {
$params = array('e' => $name) + $params;
// Если $name не находится в списке определенных значений, параметр 'e' с именем скрипта добавляется в массив $params.
}
// Добавление строки запроса, если это необходимо
if (count($params) > 0) {
$sep = $htmlspecialcharsBypass ? '&' : '&';
// Определяем разделитель параметров: & для $htmlspecialcharsBypass = TRUE, или & для FALSE.
$url .= '?' . http_build_query($params, '', $sep, PHP_QUERY_RFC3986);
// Формируем строку запроса из массива $params с использованием функции http_build_query, указывая стандарт RFC3986.
}
$url .= $tail;
// Добавляем к URL значение параметра $tail, если оно задано.
//$url = str_replace('&', '&', $url);
// Этот закомментированный код устраняет лишнее экранирование &, но он не используется.
return $url;
// Возвращаем сформированный URL.
}
Разбираем сновной код функции:
global $cot_url_appendix;
Комментарий:
Глобальная переменная $cot_url_appendix содержит дополнения, которые будут автоматически добавлены ко всем URL, если это не отключено через параметр $ignoreAppendix.
Обработка входных параметров:
// Предобработка аргументов
if (is_string($params)) {
$params = cot_parse_str($params);
} elseif (!is_array($params)) {
$params = [];
}
Комментарий:
Если $params передан как строка (например, param1=value1¶m2=value2), он преобразуется в массив с помощью функции cot_parse_str() (ранее разобранной).
Пример: "param1=value1¶m2=value2" станет ['param1' => 'value1', 'param2' => 'value2'].
Если $params не является массивом и не строкой (например, null), он инициализируется как пустой массив.
Добавление глобального $cot_url_appendix:
if (!$ignoreAppendix && count($cot_url_appendix) > 0) {
$params = $params + $cot_url_appendix;
}
Комментарий:
Если параметр $ignoreAppendix равен false, а глобальный $cot_url_appendix содержит данные, они добавляются в массив $params.
Оператор + добавляет элементы из $cot_url_appendix, если они ещё не существуют в $params.
Это позволяет автоматически добавлять глобальные параметры, такие как токены сессии.
Обработка значений параметров:
foreach ($params as $k => $param) {
if (is_bool($param)) {
$params[$k] = (int) $param;
}
if (!is_array($param) && !is_object($param)) {
$params[$k] = strval($param);
}
if ($params[$k] === '' || $params[$k] === null) {
unset($params[$k]);
}
}
Комментарий:
Если значение параметра — булево (true или false), оно преобразуется в 1 или 0.
Это необходимо, так как URL-строка не поддерживает булевы значения.
Если значение не массив и не объект, оно преобразуется в строку.
Параметры с пустыми значениями ('' или null) удаляются из массива $params.
Проверка на существование кастомной функции:
if (function_exists('cot_url_custom')) {
return cot_url_custom($name, $params, $tail, $htmlspecialcharsBypass);
}
Комментарий:
Если существует пользовательская функция cot_url_custom(), она вызывается вместо стандартной реализации cot_url().
Это позволяет разработчикам переопределять логику генерации URL, если требуется.
Формирование базового URL:
$url = in_array($name, array('admin', 'login', 'message')) ? "$name.php" : 'index.php';
if (!in_array($name, array('admin', 'index', 'login', 'message', 'plug'))) {
$params = array('e' => $name) + $params;
}
Комментарий:
Если $name равен 'admin', 'login' или 'message', базовый URL устанавливается как $name.php.
Например, 'admin' → 'admin.php'.
В остальных случаях базовый URL — это 'index.php'.
Если $name не равен 'admin', 'index', 'login', 'message' или 'plug', в параметры добавляется элемент 'e' => $name.
Это позволяет указать имя модуля или плагина, который будет обработан.
Добавление строки запроса:
if (count($params) > 0) {
$sep = $htmlspecialcharsBypass ? '&' : '&';
$url .= '?' . http_build_query($params, '', $sep, PHP_QUERY_RFC3986);
}
Комментарий:
Если в $params есть параметры, они преобразуются в строку запроса с помощью http_build_query().
Разделитель между параметрами (& или &) зависит от значения $htmlspecialcharsBypass:
Если true, используется & (без преобразования для HTML).
Если false, используется & (для корректного отображения в HTML).
Добавление постфикса (якори):
$url .= $tail;
Комментарий:
Если указан постфикс $tail (например, #anchor), он добавляется в конец URL.
Возврат результата:
return $url;
Комментарий:
Возвращается готовый URL.
3. Пример работы функции:
$url = cot_url('page', ['id' => 123, 'cat' => 'news'], '#comments');
echo $url;
Результат:
index.php?e=page&id=123&cat=news#comments
4. Заключение:
Функция cot_url() — мощный инструмент в Cotonti, который упрощает формирование корректных и универсальных ссылок. Она поддерживает кастомизацию, автоматическое добавление параметров, и обработку специфических условий.
Комментарии (0)
Автор контента
Оффлайн
Administrator
Последняя авторизация: 05.07.2026 18:32
- Страница размещена: 23.01.2025 20:30
- Последнее обновление: 23.01.2025 20:30