Ссылка на страницу в другой языковой версии

Материал из Umicms
Версия от 08:08, 27 марта 2014; Stexe (обсуждение | вклад)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к:навигация, поиск


Задача: Вывести ссылку для перехода в другую языковую версию, причем если существует страница с таким же адресом в другой языковой версии, что и текущая, то вывести ссылку на нее.

Реализация:
Напишем custom макрос, который будет возвращать ссылку исходя из логики задачи.
В файл \classes\modules\custom.php поместим код метода getLanguageLink:

 /* 
         * Возвращает ссылку на страницу в другой языковой версии 
         * с префиксом $lang_prefix (пример, 'en'), если она существует
         * $lang_prefix - префикс языковой версии
         */
        public function getLanguageLink($lang_prefix)
        {
//          Формируем ссылку на $lang_prefix
            $lang_prefix_new = preg_replace('/\//', '', $lang_prefix);
            $lang_prefix_link = "/{$lang_prefix_new}/";
//          Получаем id языковой версии
            $langsCollection = langsCollection::getInstance();
            $lang_id = $langsCollection->getLangId($lang_prefix_new);
//          Если языковая версия с $lang_prefix не найдена, возвращаем ее
            if ( !$lang_id )
            {
                return $lang_prefix_link;
            }
//          Получаем id текущей страницы
            $cmsController = cmsController::getInstance();
            $current_id = $cmsController->getCurrentElementId();
//          Если id страницы не число, то возращаем $lang_prefix_link         
            if ( is_numeric($current_id) === false)
            {
                return $lang_prefix_link;
            }
            
//          Получаем адрес этой страницы в текущей языковой версии
            $umiHierarchy = umiHierarchy::getInstance();
            $element_path = $umiHierarchy->getPathById($current_id);
            
//          По адресу пытаемся получить id страницы 
//          в языковой версии $lang_prefix
            $domain_id = $cmsController->getCurrentDomain()->getId();
            $element_id_lang = $umiHierarchy->getIdByPath($element_path, false, $errors_count, $domain_id, $lang_id);

            if ( !$element_id_lang || $errors_count > 0 )
            {
                return $lang_prefix_link;
            }
//          Если id найден, возвращаем полученный адрес
            $result_link = $umiHierarchy->getPathById($element_id_lang);
            
            return $result_link;
        }

Вывод ссылки для XSLT-шаблонизатора будет выглядеть следующим образом:

 <a href="{document('udata://custom/getLanguageLink/en')/udata}">Английская версия</a>

Для TPL-шаблонизатора:

 <a href="%custom getLanguageLink('en')%">Английская версия</a>