Сниппет:
[[!runprocessor?&res=`[[+wf.docid]]`&field=`pagetitle`&ns=`xlexicon`&action=`web/dictionaries/getfield`]]
Можно, но придется немного подшаманить шаблоны, т.к. вейфайндер дергает объект напрямую. Код сниппета ниже. Нужно просто заменить плейсхолдер, выводящий название пункта меню, на него. Также почитай мануал по модулю. Там освещены базовые моменты.
спасибо за очень нужный компонент, есть такой вопрос: с его помощью можно перевести меню, сформированное wayfinder-ом?
и все бы хорошо но в стандартном варианте нет ajax добавления товара в список
Это вы о каком таком варианте говорите? У вас запрос на assets/components/basket/connectors/connector.php?action=products/add каким образом идет? Это ли не Ajax?
но он нечего конкретного кроме id товара не навешивает. хотел сам его поправить но к сожалению запутался.
Потому что не туда смотрите. После добавления товара выполняется еще один запрос, поучающий информацию о корзине. Вот его и надо использовать. Вот гляньте такой виджет на http://unichoc.ru. И да, это тоже ShopModxBox.

О пакете

Пакет добавляет для всех объектов типа 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 предыдущих чанка включены туда).
мало мне онлайн инфы о том сколько товаров и на какую они цену в корзине. нужно чтобы постоянно отображалась актуальная инфа о корзине.
и все бы хорошо но в стандартном варианте нет ajax добавления товара в список подумывал взять с такого запроса assets/components/basket/connectors/connector.php?action=products/add но он нечего конкретного кроме id товара не навешивает. хотел сам его поправить но к сожалению запутался. в общем что мне нужно так это вывод информации о товаре
Здравствуйте, хочу представить вашему вниманию компонент Extended Lexicon (xlexicon), написанный специалистами MODX-Клуба. Extended Lexicon включает все, что нужно для организации мультиязычности на сайте. При этом администрировать такой сайт будет просто и удобно.

Зачем нужен xlexicon?

Компонентов, позволяющих создать мультиязычный сайты на MODX Revolution, не так много и фактически, кажущаяся весьма простой задача по реализации мультиязычности на самом деле является весьма сложной. Очень часто эту проблему решают путем создания нескольких контекстов, но это неудобно с точки зрения администрирования. Представьте, что сайт часто обновляется, и каждый раз приходится искать или создавать страницы в нескольких контекстах одновременно. А что если языков не два, а больше и сайт состоит из множества страниц? Администратору такого ресурса не позавидуешь.
Когда встала необходимость реализовать многоязычность мы решили написать свой компонент, который подходил бы под наши требования удобства и функциональности. Изначально компонент начинал разрабатывать Валентин Расулов, но потом приостановил работу над расширением и дал добро на доработку. Мы хорошо поработали над функционалом и в результате появился Extended Lexicon.

Основные плюсы

Переводы для любых типов страниц
Первое и, возможно, самое главное: компонент рассчитан на создание словарей для любых типов страниц, как стандартных modResource, так и любых других. Это значит, что xlexicon совместим с другими компонентами, формирующими другие типы страниц.
Удобство администрирования.
Фактически Вы открываете только одну страницу и получаете доступ ко всем вариантам ее перевода. На сайте может быть сколь угодно много языков, и при этом все переводы конкретной страницы находятся в одном ресурсе в Админке. Панель управления переводами встраивается в стандартное окно редактирования ресурса.
?
Такое решение позволяет создавать и редактировать страницы для мультиязычного сайта без необходимости искать версию каждой страницы в разных контекстах. Это очень удобно и экономит время.
Управление языками осуществляется также просто и удобно. Для этого нужно перейти в панель управления модулем xlexicon в верхнем меню. Вы увидите все текущие языки и сможете добавить, удалить или изменить языки по своему желанию. Изменения сразу отразятся на сайте. Допустим при добавлении нового языка каждая страница на сайте автоматически получит новую закладку для вставки туда соответствующего перевода.
MODX теги обрабатываются для всех языков
При выводе документа не нужно менять стандартные MODX теги. То есть тег [[*pagetitle]] будет обработан и будет подставлено значение в зависимости от языка страницы. Проще говоря, если вы находитесь на Русской странице – увидите Русский pagetitle, а если на Английской – Английский. Это значительно облегчает работу с шаблонами. Пока что поддерживаются только основные изменяемые теги.
AJAX запросы с языковым ключом
В MODX для реализации AJAX запросов к серверу Вы можете пользоваться встроенными классами коннекторов, обрабатывающих запросы из панели управления. Но есть один минус. Они изначально рассчитаны на учет языкового ключа только для админки. В модуле эта проблема решена. Т.е. вы можете передавать языковой ключ и получать ответы от сервера на языке, который запрашивался.
Компонент работает под MODX Revolution Установить xlexicon можно из нашего репозитория http://rest.modxstore.ru/extras/ или из официального репозитория MODX. С подробной документацией можете ознакомиться по ссылке Xlexicon manual
Информация для самых прокаченных. Только если вы уже достаточно освоили процессоры, Смарти-шаблоны и в целом наши технологии, только тогда имеет смысл играться с этим обновленным компонентом.
Так как modSociety — по прежнему всего лишь основа для разработки блого-социальных проектов, и требует окончательного оформления на каждом отдельно взятом ресурсе самостоятельно, выложу здесь примеры выполнения основных действий с топиками, комментариями и т.п.
Используя данные скрипты, вы сможете напрограммировать под себя довольно приличную социалку, с блэкджеком и гейшами.
Пока пакет доступен для скачивания только в нашем репозитории http://rest.modxstore.ru/extras/, так как будет сейчас проходить активную откатку и допиливание. Тем, кто достигнет серьезных результатов в интеграции пакета, обещаю поддержку с настройками политик безопасности и т.п. А пока что делайте доступным для супер-юзера, чтобы политики не учитывались.
Внимание! Для работы процессоров требуется установленный modxSite.
Проект на Гитхабе: github.com/Fi1osof/modSociety

Основной функционал и основные сущности

Сущности:
Пользователь
Пользователи могут создавать Блоги, Топики, Комментарии, а так же голосовать за Блоги, Топики, Комментарии, других юзеров и т.п.
Блог
Блоги — это разделы, содержащие отдельные топики. Блоги могут быть открытые и закрытые. Права рулятся на уровне стандартный политик безопасности MODX-а. В блоги могут вступать отдельные пользователи.
Топик
Статья, конечный документ. Обычно как раз статьи и обрастают комментариями, рейтингами и т.п. Но комментироваться и рейтинговаться в modSociety может любой тип объекта, хоть документ, хоть пользователь, хоть что.
Комментарий
Как и говорил, комментироваться может что угодно, в том числе и другие комментарии.
Голос
Рейтинг. Голос может быть отдан так же за любой объект. Одно ограничение — только один голос на один объект. Голоса бывают положительные, отрицательные и нейтральные. При этом может выть указано четкое значение голоса, к пример, +0.57.
Функционал:
Создание нового блога
Здесь и далее будут коды для выполнения в Консоли. То есть вы уже сможете эти примеры использовать у себя на сайте для выполнения тех или иных действий.
<?php print '<pre>'; ini_set('display_errors', 1); $modx->switchContext('web'); $modx->setLogLevel(3); $modx->setLogTarget('HTML'); $template = 15; // Задаем id своего шаблона блога $parent = 149; // Задаем свой id раздела Блогов // Следует учитывать, что по дефолту политики безопасности не // позволят создавать документы в корне сайта $namespace = 'modsociety'; if(!$response = $modx->runProcessor('society/web/blogs/create', array( "pagetitle" => "Новый блог", "parent" => $parent, "template" => $template ), array( 'processors_path' => $modx->getObject('modNamespace', $namespace)->getCorePath().'processors/', ))){ print "Не удалось выполнить процессор"; return; } print_r($response->getResponse());
С помощью этого кода будет создан документ типа Блог. И хотя по сути блогом или топиком может быть любой документ, лучше придерживаться заданных типов документов. Да и в админке будет лучше различать. ?
Имейте ввиду, что даже если вы передаете документу published=1, документ не будет опубликован, если нет у пользователя прав publish_document. В данном случае придется или давать эти права, или в процессоре явно указывать это свойство:
public function beforeSave(){ $this->object->set('published', 1); return parent::beforeSave(); }
Создание нового топика
Собственно, почти то же самое, что и с блогом, только конечно же процессор другой, и контент — обязательное поле.
<?php print '<pre>'; ini_set('display_errors', 1); $modx->switchContext('web'); $modx->setLogLevel(3); $modx->setLogTarget('HTML'); $template = 16; // Задаем id своего шаблона блога $parent = 151; // Задаем свой id родительского блога // Следует учитывать, что по дефолту политики безопасности не // позволят создавать документы в корне сайта $namespace = 'modsociety'; if(!$response = $modx->runProcessor('society/web/topics/create', array( "pagetitle" => "Новый топик", "parent" => $parent, "template" => $template, "content" => "Bla-Bla-Bla", ), array( 'processors_path' => $modx->getObject('modNamespace', $namespace)->getCorePath().'processors/', ))){ print "Не удалось выполнить процессор"; return; } print_r($response->getResponse());
Еще есть момент: по умолчанию топики имеют свойство show_in_tree = 0, то есть они не выводятся в дерево документов. Или придется задавать это свойство show_in_tree = 1, или допиливать механизм модерации топиков во фронте (собственно, мы именно так и делали), или использовать в админке типа группового редактора (как у нас в ShopModxBox идет).
?
Создаем новый комментарий.
<?php print '<pre>'; ini_set('display_errors', 1); $modx->switchContext('web'); $modx->setLogLevel(3); $modx->setLogTarget('HTML'); $namespace = 'modsociety'; if(!$response = $modx->runProcessor('society/web/threads/comments/create', array( "text" => "test", "target_id" => 1, ), array( 'processors_path' => $modx->getObject('modNamespace', $namespace)->getCorePath().'processors/', ))){ print "Не удалось выполнить процессор"; return; } print_r($response->getResponse());
Здесь довольно хитрая логика. Дело в том, что для комментария основная связующая сущность — Диалоговая ветка SocietyThread, при этом ветка может быть создана на любой объект, будь то документом или пользователем. И в расширенном сценарии сначала надо создать диалоговую ветку с указанием id целевого документа (если ее нет), и только потом уже создать комментарий на нее. В нашем же примере это происходит автоматически, то есть передаем id целевого документа и текст комментария, и система сама проверит наличие целевой диалоговой ветки, если ее нет, то создаст ее, и уже на нее добавит этот комментарий.
Если передать параметр parent, то комментарий будет создан дочерним для указанного комментария. При этом так как у всех комментариев id-шники уникальные, то не надо дополнительно указывать id целевого документа, комментарий будет создан непосредственно на указанный комментарий.
Голосование
<?php print '<pre>'; ini_set('display_errors', 1); $modx->switchContext('web'); $modx->setLogLevel(3); $modx->setLogTarget('HTML'); $namespace = 'modsociety'; if(!$response = $modx->runProcessor('society/web/threads/vote', array( "target_id" => 8, "target_class" => "modResource", "vote_value" => 1 ), array( 'processors_path' => $modx->getObject('modNamespace', $namespace)->getCorePath().'processors/', ))){ print "Не удалось выполнить процессор"; return; } print_r($response->getResponse());
Вывести блоги
Процессор:
<?php print '<pre>'; ini_set('display_errors', 1); $modx->switchContext('web'); $modx->setLogLevel(3); $modx->setLogTarget('HTML'); $namespace = 'modsociety'; if(!$response = $modx->runProcessor('society/web/blogs/getdata', array( // "limit" => 1, ), array( 'processors_path' => $modx->getObject('modNamespace', $namespace)->getCorePath().'processors/', ))){ print "Не удалось выполнить процессор"; return; } print_r($response->getResponse());
Простенький шаблон:
{processor action="society/web/blogs/getdata" ns="modsociety" assign=blogs_result} {foreach $blogs_result.object as $object} <div class="blog"> <a href="{$object.uri}"><h3>{$object.pagetitle}</h3></a> </div> {/foreach}
Вывод топиков
Процессор:
<?php print '<pre>'; ini_set('display_errors', 1); $modx->switchContext('web'); $modx->setLogLevel(3); $modx->setLogTarget('HTML'); $namespace = 'modsociety'; if(!$response = $modx->runProcessor('society/web/topics/getdata', array( ), array( 'processors_path' => $modx->getObject('modNamespace', $namespace)->getCorePath().'processors/', ))){ print "Не удалось выполнить процессор"; return; } print_r($response->getResponse());
Краткий шаблон
{$params = [ "where" => [ "parent" => $modx->resource->id ] ]} {processor action="society/web/topics/getdata" ns="modsociety" params=$params assign=topics_result} {foreach $topics_result.object as $object} <div class="topic"> <a href="{$object.uri}"><h3>{$object.pagetitle}</h3></a> </div> {/foreach}