Сергей Прохоров
28 янв. 2014 г., 19:22

Xlexicon manual

О пакете

Пакет добавляет для всех объектов типа modResource и их производных вкладку управления персональными словарями ресурса.

Управление разделами словаря(языками)

Управление словарями идет через панель компонента: Components > Xlexicon: ? Следует обратить внимание на 3 основных параметра языка: ISO,Context,Status
Параметры
Status
Данная настройка регулирует доступность языка для вывода и словаря. Не активен === не доступен.
Context
Список контекстов, для которых доступен тот или иной язык.
ISO
Код языка. Является определяющей настройкой каждого словаря. На основе его формируется устанавливаемый cultureKey на сайте.

Управление словарями ресурса

Для ресурсов, к контекстам которых привязан активный раздел словаря, становится доступна спец. вкладка для управления словарем ресурса: ?
В процессе добавления новых языков будут появляться новые вкладки.Сохранение данных словаря происходит вместе с данными ресурса.

Особенности модуля

Установка базового языка
Формирование активных языков происходит на основе разделов словаря, созданных через панель управления разделами словаря. Для базового языка используются стандартные поля ресурса. Базовый языковой ключ сайта устанавливает настройка xlexicon.cultureKey_base. По-умолчанию ru. Это значение используется как основное и добавляется в выборку всех активных языков
Подключение сторонних словарей
Возможно у вас уже есть лексиконы с занесенными туда переводами, которые вы хотите использовать на сайте. Добавьте их имена в системную настройку xlexicon.lexicon_list. Подключение всех перечисленных словарей произойдет автоматически.
Вывод данных ресурса
Модуль спроектирован таким образом, что для выводимого ресурса нет нужды использовать какие-то специальные теги. Значения словаря, актуальные активному cultureKey, автоматически будут подставлены в плейсхолдеры типа [[*]].
Взаимодействие со сторонними модулями
Если с выводом ресурса мы не имеем проблем, то сторонние модули придется настроить. В основе популярных модулей типа Wayfinder, которые могут в том или ином виде оперировать существующими ресурсами, лежат методы getObject и getCollection и их вариации. Для вывода данных по ресурсам эти модули используют чанки. Для возможности получения значений полей ресурса в чанке был создан спец. процессор web/dictionary/getfield: Вызов:
[[!runprocessor?&res=`[[+docid]]`&field=`pagetitle`&ns=`xlexicon`&action=`web/dictionaries/getfield`]]
Параметры: res — id ресурса, поле которого мы хотим получить field — имя поля ресурса ns и action — параметры, отвечающие за логику данного сниппета
Примечание: Из примера выше видно, что выборка идет через специальный сниппет-прослойку, отвечающий за вывод данных. Мы его вынуждены использовать, т.к. например в чанке нельзя исполнять php-код. В случае использования шаблонов на основе phpTemplates+Smarty мы освобождаемся от необходимости так делать. Просто запускаем процессор через метод api modx.
Примечание 2: Если вы используете данный модуль, как основу для мультиязычного сайта, то вас никто не обязывает использовать данную прослойку. Можно сразу учитывать актуальный словарь для ресурса в запросах согласно связке ресурс–словарь. Так или иначе выбор за разработчиком.
Получение списка языков
Для вывода списка активных языков идет через процессор web/languages/getlist. Вызов:
[[!runprocessor?ns=`xlexicon`&action=`web/languages/getlist`&ph=`langs`&row=`row`&outer=`outer`]]
Параметры: row — чанк-шаблон для пункта списка outer — чанк-шаблон для обертки списка ph — плейсхолдер для вывода данных
Чтобы поменять актуальный язык достаточно передать на сервер требуемый cultureKey. Это можно сделать например через GET-параметр.
Примечание: Пользователи phpTemplates+Smarty так мучиться не обязаны. Получаем данные, оборачиваем в шаблон :)
AJAX
Если работать с ajax-запросами через коннекторы, то нельзя нативно менять текущий язык. MODX в базовом варианте просто не рассчитан на такое для контекстов, отличных от mgr. Приходилось как-то влезать и встраивать код, реагирующий на изменение языка.
В модуле данная проблема была решена. Класс-обработчик запросов был расширен и прокачан. Теперь если посылать данные на коннектор, передавая с данными требуемый cultureKey, то в исполняемом коде системная настройка cultureKey будет реагировать на входные данные. Достаточно лишь передать в запросе {cultureKey:’iso-код языка’}.
Кэширование
Для кэширования результатов не используются дополнительные системы кэширования. Кэшер выбирается в зависимости от того, какой используется в системе.
Для статичных страниц модуль меняет префикс кэша в зависимости от текущего языкового ключа.
Для основных процессоров, выдающих данные, кэширование тоже предусмотрено. По-умолчанию оно включено. Настройки, отключающей кэширвоание, не предусмотрено.
Плюшки
В модуле создано 3 чанка с примерами: example_connectortest — чанк-пример, демонстрирующий работу модуля с ajax. example_wf_row — пример вывода пункта меню для Wayfinder. example_xlexicon — комплексный пример, демонстрирующий работу (2 предыдущих чанка включены туда).
После установки пакета захожу в Приложения >> xlexicon и получаю ошибку:
Fatal error: require_once() [function.require]: Failed opening required 'W:/domains/holograma/core/components/xlexicon/controllers/index.class.php' (include_path='.;W:/modules/php/PHP-5.3.23/;W:/modules/php/PHP-5.3.23/PEAR') in W:\domains\holograma\core\model\modx\modmanagercontroller.class.php on line 936
Вот заплатка. Просто перепишите содержимое этого файла и все. Руки не доходят собрать новый пакет, все времени нет.
Ага, теперь все ОК. Спасибо. Времени никогда не хватает, если постоянно откладывать, так руки и не дойдут ;)
А как переключатель языка сделать и как это выглядит в URL? Не пойму, что-то…
Подключил чанк [[$example_xlexicon]] и все понял ) Жаль URL получается вида: site.ru/?cultureKey=en site.ru/en/ — так солиднее смотрится
И еще не подскажите, как быть с текстами, которые остаются непосредственно в шаблонах или чанках, как их переключать на другой язык? Неужели все до мелочей нужно помещать в Ресурсы? Даже банальную надпись в footere "Компания Название 2015. Все права защищены." тоже что ли помещать в Ресурсы, по-моему, как то глупо получится…
Для фикс. записей есть лексиконы
До `site.ru/en/` все руки не доходят
Приведите пример пожалуйста.
`$modx->lexicon('school.basketball')`
Вы можете поторопить процесс:) Внизу есть форма. Штуку-другую закините на эти цели и полетит дело:) А так пока более важные дела есть (включая и другие бесплатные, но более приоритетные модули).
Добрый день! ) Подскажите еще пожалуйста, почему там, где вывод через getResources текст не переключается на другой язык:
[[!getResources? &parents=`21` &includeTVs=`1` &hideContainers=`1` &showHidden=`1` &sortdir=`ASC` &tpl=`tpl.news` &limit=`3`]]
В чанках все стандартно: [[+pagetitle]] [[+description]] и т.д.
Потому что текст переключает сниппетом по названию поля, а не просто так меняются плейсхолдеры.
[[!runprocessor?&res=`[[+docid]]`&field=`pagetitle`&ns=`xlexicon`&action=`web/dictionaries/getfield`]]
Я так пробовал, тогда просто вместо заголовка из плейсхолдера [[+pagetitle]] везде просто пишется «Главная» то есть название первого документа в ресурсах.
Николай, так как правильно выводить id тогда, подскажите пожалуйста?
[[!runprocessor?&res=`[[+docid]]`&field=`pagetitle`&ns=`xlexicon`&action=`web/dictionaries/getfield`]]
&res=`[[+docid]]` — вот тут что-то не так просто… Пробовал по разному [[*docid]] [[~[[*docid]]]] [[~[[+id]]]] Все равно выводит заголовок первого Ресурса — «Главная»
По лексикону за подсказку спасибо! ) Я им еще не пользовался поэтому пришлось разбираться… Ожидал ответ более конкретный конечно, ну вроде сам разобрался.
А на будущее может кому пригодится: 1. В Управлении словарями >> Создаем запись — на тех языках, которые нужно 2. Вызываем в нужном месте через модификатор [[%имя_записи]]
Смотрите какой плейсхолдер в getResources содержит id документа в итерации. Совершенно не факт, что это [[+docid]]
Решено! Вот что значит на свежую голову ;)
[[!runprocessor?&res=`[[+id]]`&field=`pagetitle`&ns=`xlexicon`&action=`web/dictionaries/getfield`]]
Modx Revo 2.3.3 Почему когда открываю через Приложение — Xlexicon показывает пустую страницу…
Смотрите комментарий выше. Пустая страница — потому что критическая ошибка, а вывод ошибок отключен в настройках сервера. Прокачивайтесь по отладке.
Доброго дня! Xlexicon не размещался в репозитарии modx.com? Не планируете?
На данный момент есть пара багов с совместимостью. Исправить руки не доходят. Как будет исправлено — появится.
Сергей, добрый день. У меня клиент просит именно `site.ru/en/` Не подскажешь, в каком направлении двигаться, чтобы допилить компонент? Насколько я понимаю, на входе нужно поменять логику в xlexicon::sanitizeCultureKey() А как сделать, чтобы на выходе получался нужный uri?
Привет.
Зависит от структуры сайта. Если страницы под en нет, то ловить плагином ссылки с en на событие onPageNotFound и отсылать на обычную страницу, попутно выставляя en, как cultureKey. Также придется написать что-то кастомное для формирования правильного урл в зависимости от текущего языка. Я бы в таком ключе действовал.
Понял, спасибо. Буду пробовать.
Здравствуете, немогу получить список языков. Можете объяснить? [[!runprocessor?ns=`xlexicon`&action=`web/languages/getlist`&ph=`langs`&row=`row`&outer=`outer`]] вставил на шаблон. но пусто (((
[[!runprocessor?&res=`[[+id]]`&field=`content`&ns=`xlexicon`&action=`web/dictionaries/getfield`]] как сделать контент как [[+content:ellipsis=`100`]]
Пусто в плейсхолдере `[[+langs]]`?
Для текущего ресурса нет смысла получать контент через вызов сниппета. Значение, соответствующее текущему языковому ключу, доступно напрямую.
Для моей текущей задачи решил это вопрос путем добавления RewriteRule в файл .htaccess:
RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule !^(ru|en)/ /ru%{REQUEST_URI} [L,R=301] RewriteRule ^(ru|en)?/?(.*)$ index.php?cultureKey=$1&q=$2 [L,QSA]
Все на первый взгляд адекватно работает… Т.е. ссылки с ./ru/ и /en/ передаются как ссылки с соответствующим параметром cultureKey. Русский язык по умолчанию. Так же необходимо в директории manager переименовать файл ht.access в .htaccess(в этом файле отключается переадресация)
Да, и в папке ./connectors/ тоже надо добавить файл .htaccess отключающий переадресацию, с содержимым:
RewriteEngine Off
Я примерно так и начинал делать, но потом сообразил, что этого мало. Нужно еще, чтобы все ссылки на сайте генерировались не как «page_addr?cultureKey=en», а как «page_addr/en» вот тут и застопорилась разработка :(
В шаблонах вывода просто учитывать
$modx->getOption('classKey').'/'.[alias]
И так по мере необходимости везде учитывать classKey и, на мой взгляд, проблем не должно быть
Конечно, это вариант. Но я в то время переносил сайт, в котором в самом контенте было немало ссылок типа [[~444]]. Вот тут дело и встало, а не тот момент я не рискнул лезть в парсер MODX
То что xlexicon по умолчанию передает просто параметр cultureKey — это нормально, по такому же принципу построены практически все мультиязычные сайты и компоненты, только параметр может называться по другому, а формирование СЕО-дружесвенных урлов из GET параметра происходит на уровне сервера. В том же самом Babel еще надо плагином переключать контент и в два раза увеличивать дерево ресурсов.
описался переключать контекст
знаю, на babel и делал. требование заказчика было конкретным — ...page/en/… и чтобы в контенте все ссылки были именно такие. :)
Плагин на событие OnBeforeDocFormSave, в котором урлам добавлять [[++cultureKey]]/, при отсутствии такого. все же можно решить)
здравствуйте, хотела бы вернутся к вышеупомянутой задаче. Как все-таки сделать ссылки, к примеру, не site.com/text/text/?cultureKey=en, а site.com/en/text/text?? Не используя контексты
Изучите это: modxclub.ru/blog/168.html Перехватывайте запросы на OnHandleRequest, подменяйте УРЛ и выставляйте culture_key, должно все работать без проблем. Компонент просто реагирует на то, какой culture_key сейчас выставлен в MODX.
[[!runprocessor::strip_tags:ellipsis=`50`?.. или просто [[!runprocessor:ellipsis=`50`?..

Добавить комментарий