Методы для работы с URL.
Преобразует URL в любом виде в абсолютный URL.
Преобразует URL в любом виде в относительный URL.
Метод используется для раскодирования строк, закодированных методом Url::encode().
Кодирует строку следующими знаками: буквы латинского алфавита обоих регистров, цифры, дефис и нижняя черта.
Используется обычно для передачи через URL другого URL как параметра, в основном в служебных скриптах системы управления. Хотя для этой цели годится и функция urlencode(), однако последняя не подойдет для повторной передачи того же параметра, так как при получении параметр будет автоматически раскодирован.
Закодированный же методом Url::encode() параметр можно подвергать многократным редиректам. В конце цепочки передач этот параметр нужно раскодировать с помощью метода Url::decode(). Кодирование основано на функции base64_encode() с доп. заменой трех запрещенных в URL знаков: +/=.
Проверить, существует ли URL. Рекомендуется использовать для внешних ссылок.
Разбирает URL вида:http://username:password@hostname:port/path?query#fragment
и возвращает его компоненты.
Данный метод сделан на основе php-функции parse_url(). Отличие заключается в том, что метод возвращает элементы массива вместе со спецсимволами URL. Таким образом, собрать URL можно путем конкатенации элементов массива:
$c = Url::parse($url);
#url2 =
$c['scheme']
.$c['username']
.$c['password']
.$c['hostname']
.$c['port']
.$c['path']
.$c['query']
.$c['fragment']
;
'scheme' => http:// 'host' => hostname 'port' => :port 'user' => username ИЛИ username@ 'pass' => :password@ 'path' => /path 'query' => ?query 'fragment' => #fragment
'scheme' => http 'host' => hostname 'port' => port 'user' => username 'pass' => password 'path' => /path 'query' => query 'fragment' => fragment
Декодирует доменное имя в составе URL из punycode в оригинальный вид.
Пример: $decodedUrl = Url::punyDecode($encodedUrl);
Кодирует доменное имя, написанное не ASCII-символами, в составе URL в punycode, который будет состоять только из алфавитно-цифровых символов, разрешенных в доменных именах.
Пример: $encodedUrl = Url::punyEncode($url);
По состоянию на ноябрь 2015 года, для современных браузеров кодирование URL производить не нужно, кроме Mozilla Firefox.
$options = [
'encode'=>true, # Кодировать значения параметров с помощью функции urlencode()..
];
Можно применять короткую форму записи опций — см. Arr::formatOptions().
Пример: echo Url::arrayToQuery(['pick' => [1=>['eq'=>3], 2=>['eq'=>'https://bloxcms.net']]]);
выведет '&pick[1][eq]=3&pick[2][eq]=https%3A%2F%2Fbloxcms.net'.
См. также Request::convertToQuery()
$options = [
'decode'=>true, # Декодировать значения параметров с помощью функции urldecode().
'remove-lost'=>true, # Удалить элементы с потерянными значениями,
# то есть, знак "=" после имени параметра имеется, но значение пусто.
];
Можно применять короткую форму записи опций — см. Arr::formatOptions().
Метод для перенаправления на другой URL.
$options = [
'exit'=>false, # Сразу прекратить выполнение скрипта и перенаправить.
'status'=>301, # Код статуса перенаправления (трехзначное число, начинающееся с цифры 3),
# по умолчанию 301 (Moved Permanently), то есть, перемещено навсегда.
'replacements'=>[], # Регулярные замены в $url.
# Структура массива: [$pattern1 => $replacement1, ...]
'loop-protection'=>false, # Защита от циклической переадресации
# Пример:
# if (!Url::redirect($href, ['loop-protection'=>true,'exit'=>true]) foo();
# Если при перенаправлении произойдет зацикливание, будет выполнена функция foo().
'puny-encode'=>false, # Конвертировать доменное имя в punycode.
# По состоянию на ноябрь 2015 года, для современных браузеров
# кодирование URL производить не нужно, кроме Mozilla Firefox.
];
Для булевых опций можно применять короткую форму записи. Подробности см. в описании метода Arr::formatOptions(), который и применен внутри описываемого метода.
Булевы опции допустимо записывать как неассоциативный массив:
$options = ['exit', 'puny-encode'];
Более того, если опция только одна, допустимо записывать ее в виде строки:
$options = 'exit';
Список всех кодов для опции status:
300: Multiple Choices (множество выборов)
301: Moved Permanently (перемещено навсегда)
302: Moved Temporarily (перемещено временно, устарело, используй 303 или 307)
302: Found (найдено, устарело, используй 303 или 307)
303: See Other (смотреть другое, использовать вместо 302)
304: Not Modified (не изменялось)
305: Use Proxy (использовать прокси)
306: зарезервировано, код использовался только в ранних спецификациях
307: Temporary Redirect (временное перенаправление, использовать вместо 302)
Пример шаблона для перенаправления
<?php # Режим посетителя, но не во время назначения шаблона if (empty($edit) && !in_array(Blox::getScriptName(), ['change','check'])) { if ($dat[1]) Url::redirect($dat[1],'exit'); } # В режиме редактирования else { echo $dat['edit']; echo ' Блок для перенаправления на страницу: <a href='$dat[1]' target='_blank'>$dat[1]</a><br> В режиме посетителя эта страница открываться не будет, и перенаправление произойдет автоматически.'; } ?>
redirect.tdd
<?php
$titles[1] = 'URL страницы (например: http://site.ru/)';
$types[1] = 'varchar(255)';
$params['description'] = 'Шаблон для перенаправления на другую страницу.
Для внутренних страниц желательно использовать относительные
параметрические ссылки (например: ?page=22&block=33&part=4).';
?>
Перенаправление обратно на предыдущую страницу. Описание параметра $options см. выше в Url::redirect().
Если в URL есть параметр pagehref, он кодируется заново, так как в $_SERVER['HTTP_REFERER'] этот параметр идет в раскодированном виде.