Формирование полных url-адресов

Функционал формирования полных адресов сайта актуален для многих задач - формирование sitemap, валидация url в роутинге и тд. Особенно тонким моментом является поддержка протокола https. Для формирования url-адресов в TAO реализовано соответствующее API, которое требует определенной настройки.

Настройки основного хоста и протокола для сайта

В некоторых случаях использовать текущий протокол и хост неправильно или невозможно: у CLI-скриптов, например, вообще нет риквеста (request), откуда их можно было бы достать, да и не всегда нужно использовать текущий хост. Поэтому очень важна правильная настройка этих параметров в конфигурационном файле. Она будет отличаться для моно- и мультиязычных сайтов.

Для моноязычных сайтов

Для моноязычного сайта или в случае, когда протокол у сайта один для всех языков, указывать данные следует в конфигурационном файле сайта:

// config/site.php
...
->begin_site
    ->host('example.ru')
    ->protocol('https')
->end
...

Для мультиязычных сайтов

Для мультиязычного сайта имя хоста и протокол нужно указывать в массиве настройки модуля Lang:

// app/config/modules.php

return array(
   'CMS.Lang' => array(
       'ru' => array(
           'caption' => 'Русский',
           'alias' => array('ru'),
           'host' => 'example.ru',
           'protocol' => 'https',
       ),

       'en' => array(
          'caption' => 'English',
          'alias' => array('en'),
          'host' => 'example.com',
          'protocol' => 'http'
       ),
    ),
);

Общая логика получения данных настроек

Приоритеты получения параметров host, protocol:

1. Настройки из модуля CMS.Lang (которые задаются в app/config/modules.php).

2. Настройки приложения (config/site.php).

3. Из текущего запроса, если он есть (не CLI).

4. Протокол по умолчанию - http. Если имя хоста не было получено способами выше, то будет CMS_Exception.

Как видно по описанию выше, для CLI-скриптов единственным источником получения параметров является файлы настроек. Т.к. CLI-скрипты довольно часто используются, например, для формирования SitemapXML, формирования писем для рассылки и т.д., то очень важно не забывать добавлять данные настройки.

API для формирования url

В классе CMS для работы с урлами есть следующие методы:

  • site_host($lang) - возвращает имя хоста для указанного языка ($lang). Язык является необязательным параметром, если его опустить, то получим имя хоста для текущего языка (для дефолтного, если из консоли).
  • site_protocol($lang) - аналогично вышеуказанной функции, возвращает протокол сайта.
  • full_url($url, $host, $protocol, $lang) - возвращает полную ссылку с протоколом и именем хоста, $url - обязательный параметр, остальные нет. Если $host и $protocol не указаны и $url является относительной ссылкой, то в результирующей ссылке будут подставлены имя хоста и протокол сайта, если $url содержит протокол и / или имя хоста - эти параметры не изменятся. Если $host и $protocol указаны, то они будут подставлены в результирующую ссылку.
  • build_url($url_chunks) - обратная функция к parse_url (собирает ссылку из массива).
CMS::site_host('ru');
CMS::site_protocol('ru');
CMS::full_url('/about/');
CMS::full_url('/about/', false, false, 'ru');
Метки: CMS
16.01.2018
Все статьи