UMIhelp

Разработка сайта на UMI.CMS => Шаблоны XSLT => Тема начата: 31rus от 09 Января 2016, 11:09:06

Название: Как получить значение поля из другой языковой версии?
Отправлено: 31rus от 09 Января 2016, 11:09:06
Есть несколько языковых версий, в каждой одинаковая структура с идентичными url страницами

Для облегчения управлением сайтом, требуется получать поля из основной языковой версии.

Протокол Upage позволяет получить по id и пути, но посколько url идентичны, то выводится данные из текущего языка.
Как без кастом макросов решить данную проблему?

Например
http://wbhcambodia.com/ru/our-rooms/ (http://wbhcambodia.com/ru/our-rooms/)
Имеется Grop[@name='slider'], что бы не вставлять в другие языки заново фото, вывести данную группу из основного языка
Название: Re: Как получить значение поля из другой языковой версии?
Отправлено: crazygeorgio от 10 Января 2016, 12:08:28
как-то так document(concat('upage://(', substring-after(result/page/@link, result/@pre-lang) ,')'))//group[@name='slider']
Название: Re: Как получить значение поля из другой языковой версии?
Отправлено: 31rus от 16 Января 2016, 09:57:46
У меня не срабатывает(

Буду ковырять дальше
Название: Re: Как получить значение поля из другой языковой версии?
Отправлено: ilyar от 16 Января 2016, 14:59:28
Рекомендую посмотреть в сторону Выборки из БД: протокол USel (http://dev.docs.umi-cms.ru/shablony_i_makrosy/xslt-shablonizator_umi_cms/vyborki_iz_bd_protokol_usel/) и построить  usel://getOriginPage/?pagePath=/foo/bar/&group=slider или usel://getOriginPage/(/foo/bar/)/slider/ это пример использования, еще надо сам запрос построить см. доку.
Название: Re: Как получить значение поля из другой языковой версии?
Отправлено: crazygeorgio от 16 Января 2016, 15:51:54
Цитировать
У меня не срабатывает(

Буду ковырять дальше

так а куда вы вставляете, в какую ноду, какой доступ к переменным, естественно document(concat('upage://(', substring-after(result/page/@link, result/@pre-lang) ,')'))//group[@name='slider'] достаточно образный запрос, если нет доступа к result/page/@link result/@pre-lang, то их можно задать как переменные или параметры в корневом шаблоне

естественно если мы в языковой версии по-умолчанию, то там это не сработает, так что можно использовать xsl:choose c проверкой на result/@pre-lang
Название: Re: Как получить значение поля из другой языковой версии?
Отправлено: 31rus от 16 Января 2016, 16:11:39
Цитировать
У меня не срабатывает(

Буду ковырять дальше

так а куда вы вставляете, в какую ноду, какой доступ к переменным, естественно document(concat('upage://(', substring-after(result/page/@link, result/@pre-lang) ,')'))//group[@name='slider'] достаточно образный запрос, если нет доступа к result/page/@link result/@pre-lang, то их можно задать как переменные или параметры в корневом шаблоне

естественно если мы в языковой версии по-умолчанию, то там это не сработает, так что можно использовать xsl:choose c проверкой на result/@pre-lang


Вызываю с основного шаблона layouts/default.xsl, построен на основе demodizzy. вызываю из дополнительного языка, не основного.

Решил получить ID страницы из основного языка <xsl:value-of select="document(concat('upage://(',substring-after(result/page/@link, result/@pre-lang),')'))/result/@pageId"/>
В выводе отсутсвует ID

<xsl:value-of select="document(concat('upage://(', substring-after(result/page/@link, result/@pre-lang) ,')'))//property[@name ='slider-foto1']/value != ''"> выводит данные из текущего языка
substring-after(result/page/@link, result/@pre-lang) вывод правльный URl
Все переменные lang и pre-lang присутствуют в выдаче xml
Название: Re: Как получить значение поля из другой языковой версии?
Отправлено: 31rus от 16 Января 2016, 16:30:55
Рекомендую посмотреть в сторону Выборки из БД: протокол USel (http://dev.docs.umi-cms.ru/shablony_i_makrosy/xslt-shablonizator_umi_cms/vyborki_iz_bd_protokol_usel/) и построить  usel://getOriginPage/?pagePath=/foo/bar/&group=slider или usel://getOriginPage/(/foo/bar/)/slider/ это пример использования, еще надо сам запрос построить см. доку.

А какой смысл делать выборку usel ради одной страницы?
Upage должен решить мою задачу, вопрос почему он не хочет отрабатывать корректно?
Название: Re: Как получить значение поля из другой языковой версии?
Отправлено: crazygeorgio от 16 Января 2016, 16:35:32
ага, точно upage выводит из текущей языковой версии, даже и не знал об этом, тогда я бы написал кастомный метод, те же манипуляции с адресом, а потом по адресу получаешь id страницы с помощью метода getidbypath, ну а дальше можешь id через upage или сразу через extGroups

Цитировать
Решил получить ID страницы из основного языка <xsl:value-of select="document(concat('upage://(',substring-after(result/page/@link, result/@pre-lang),')'))/result/@pageId"/>
В выводе отсутсвует ID

upage не отдает result, там udata/page/@id
Название: Re: Как получить значение поля из другой языковой версии?
Отправлено: 31rus от 16 Января 2016, 18:22:07
ага, точно upage выводит из текущей языковой версии, даже и не знал об этом, тогда я бы написал кастомный метод, те же манипуляции с адресом, а потом по адресу получаешь id страницы с помощью метода getidbypath, ну а дальше можешь id через upage или сразу через extGroups

Цитировать
Решил получить ID страницы из основного языка <xsl:value-of select="document(concat('upage://(',substring-after(result/page/@link, result/@pre-lang),')'))/result/@pageId"/>
В выводе отсутсвует ID

upage не отдает result, там udata/page/@id

Сильно не меняет это решения проблемы, что за странность с upage(
Название: Re: Как получить значение поля из другой языковой версии?
Отправлено: crazygeorgio от 16 Января 2016, 20:31:51
Я же написал в первой части, напишите кастомный метод, возвращающий id страницы или сразу все данные
Название: Re: Как получить значение поля из другой языковой версии?
Отправлено: ilyar от 17 Января 2016, 01:12:15
А какой смысл делать выборку usel ради одной страницы?
Upage должен решить мою задачу, вопрос почему он не хочет отрабатывать корректно?

Используя Upage также происходит выборка и теоретически она будет работать в рамках текущей языковой версии т.е. не получить в EN страницу RU (не проверял, могу ошибаться).

Я предлагаю Usel т.е. вместо выборки которую реализует протокол Upage использовать Usel полностью полностью контролируемую выборку с возможностью оптимизировать запрос под задачу. Так же, в данном случае, это лучшая альтернатива реализации кастомнного метод в котором тоже придется решать через выборку,
Название: Re: Как получить значение поля из другой языковой версии?
Отправлено: 31rus от 17 Января 2016, 07:36:04
А какой смысл делать выборку usel ради одной страницы?
Upage должен решить мою задачу, вопрос почему он не хочет отрабатывать корректно?

Используя Upage также происходит выборка и теоретически она будет работать в рамках текущей языковой версии т.е. не получить в EN страницу RU (не проверял, могу ошибаться).

Я предлагаю Usel т.е. вместо выборки которую реализует протокол Upage использовать Usel полностью полностью контролируемую выборку с возможностью оптимизировать запрос под задачу. Так же, в данном случае, это лучшая альтернатива реализации кастомнного метод в котором тоже придется решать через выборку,

Спасибо за идею и не только за эту!
Ну я не специалист конечно, но мне кажется что, при варианте с Usel сначала происходите выборка страницы с учетом требований, а потом результат обрабатывается, вто время как при Upage сразу обрабатываем полученные результат, разве это не так?

На данном проекте это не критично, а вот с проектом тысяч на 10 страниц, может быть серьезным приростом в скорости.
Название: Re: Как получить значение поля из другой языковой версии?
Отправлено: crazygeorgio от 17 Января 2016, 20:58:45
upage думаю будет работать если использовать id страницы, а не путь, и врядли upage можно назвать выборкой, это скорее всего просто обращение к странице. Если речь о производительности, то как раз вместо usel лучше использовать кастомный метод без всяких выборок и прочего.
Название: Re: Как получить значение поля из другой языковой версии?
Отправлено: 31rus от 24 Января 2016, 12:07:47
набросал кастом

public function getLanguageId($url, $lang_prefix)
                {
                              
                     $pattern = "/\/$lang_prefix/";
                      $lang_prefix_new = preg_replace($pattern,'' ,$url);
                   
                      $hierarchy = umiHierarchy::getInstance();
                      //Получим id страницы по ее url'у
                     $elementId = $hierarchy->getIdByPath($lang_prefix_new);
                     
                      return "$elementId";
                 }   

Но все равно возвращает id из текущей языковой версии(   
Название: Re: Как получить значение поля из другой языковой версии?
Отправлено: 31rus от 24 Января 2016, 12:36:34
А какой смысл делать выборку usel ради одной страницы?
Upage должен решить мою задачу, вопрос почему он не хочет отрабатывать корректно?

Используя Upage также происходит выборка и теоретически она будет работать в рамках текущей языковой версии т.е. не получить в EN страницу RU (не проверял, могу ошибаться).

Я предлагаю Usel т.е. вместо выборки которую реализует протокол Upage использовать Usel полностью полностью контролируемую выборку с возможностью оптимизировать запрос под задачу. Так же, в данном случае, это лучшая альтернатива реализации кастомнного метод в котором тоже придется решать через выборку,

А как мы через USEL это можем получит, ну найти потомков от текущей страницы, понятно.
Но поля мы не получим, нам все равно нужен будет Upage потом, для обработки результатов выдачи?
Или я что то не понимаю(
Название: Re: Как получить значение поля из другой языковой версии?
Отправлено: crazygeorgio от 31 Января 2016, 22:18:09
и ведь реально даже через апи выводит страницу текущей языковой версии... вот зараза-то
Название: Re: Как получить значение поля из другой языковой версии?
Отправлено: ilyar от 07 Февраля 2016, 13:10:34
набросал кастом

public function getLanguageId($url, $lang_prefix)
                {
                              
                     $pattern = "/\/$lang_prefix/";
                      $lang_prefix_new = preg_replace($pattern,'' ,$url);
                   
                      $hierarchy = umiHierarchy::getInstance();
                      //Получим id страницы по ее url'у
                     $elementId = $hierarchy->getIdByPath($lang_prefix_new);
                     
                      return "$elementId";
                 }   

Но все равно возвращает id из текущей языковой версии(   

Кастом будет работать, если указать идентификатор языка версии сайта с базовым контентом:

$errors = array();
$elementId = $hierarchy->getIdByPath($elementPath, false, $errors, false, $langId);

Идентификатор языка можно просто указать, но это будет не универсально, можно воспользоваться API, например:

$baseLangPrefix = 'ru';
$langId = langsCollection::getInstance()->getLangId($baseLangPrefix);

или

$langId = langsCollection::getInstance()->getDefaultLang()->getId();
Название: Re: Как получить значение поля из другой языковой версии?
Отправлено: ilyar от 07 Февраля 2016, 13:33:53
upage думаю будет работать если использовать id страницы, а не путь...

Если известен id страницы то проще воспользоваться API:
$page = umiHierarchy::getInstance()->getElement($pageId);

...и врядли upage можно назвать выборкой, это скорее всего просто обращение к странице...

UPage и другие протоколы и тоже в своей реализации так или иначе используют выборки к базе.

... Если речь о производительности, то как раз вместо usel лучше использовать кастомный метод без всяких выборок и прочего.

Кастомный метод не волшебник и данные без обращения к базе не предоставит, кроме случая когда данные находятся в другом месте.

Если реализовать Вашу задачу в кастомный методе, то придется воспользоваться либо new selector() (на нем построен протокол USel), либо методы API страниц umiHierarchy::getInstance() в обоих случаях это запрос к базе.

Можно посмотреть результирующий SQL, для этого надо включить отладку запросов:
define('SQL_QUERY_DEBUG', true);
define('DEBUG_SQL_SELECTOR',  true);
Название: Re: Как получить значение поля из другой языковой версии?
Отправлено: crazygeorgio от 07 Февраля 2016, 15:59:06
Цитировать
UPage и другие протоколы и тоже в своей реализации так или иначе используют выборки к базе.
ок, я то думал все из воздуха берется!) речь об оптимальном выборе решения задачи

Цитировать
Кастомный метод не волшебник и данные без обращения к базе не предоставит, кроме случая когда данные находятся в другом месте.
Евгений говорил как-то что лучше использовать кастом с селектором, нежели подобный usel, я поверил на слово
Название: Re: Как получить значение поля из другой языковой версии?
Отправлено: crazygeorgio от 08 Февраля 2016, 02:35:46
Цитировать
$errors = array();
$elementId = $hierarchy->getIdByPath($elementPath, false, $errors, false, $langId);

ок! не понимаю почему в доках не описать было два последних параметра, как обычно в общем-то)