Мультиязычность динамического контента в MODX
Александр и снова здравствуйте:) Не получается сообразить, как переводить динамический контент на сайте. Со статическим всё более понятно, если коротко, создать компонент лексиконов, прописать там метод вывода, создать пространство имён, создать плагин и повесить его на определённое событие, прописать вывод в шаблоне, тут всё понятно, но а как быть к примеру с полями extendresource и вообще с динамическим контентом фильтра, тв, и т.д, если возможно расскажите пожалуйста, как это лучше и правильней делать?
Не много дополню и уточню вопрос к примеру будет два разных домена на одном modx, site.ru и site.com у второго будут разные языковые версии сайта site.com/di/, site.com/by/ и так далее, фильтр mfilter2 фильтрует по своим полям, компонента extendresource, как в данном случае сделать переводы всех значений, дублировать компонент и таблицы в базе с переводами всех значений для разных версий сайта или как то по другому? Александр как правильно в данном случае это можно реализовать?
1) Для каждой языковой версии сайта, свой шаблон, со своими тв, то есть в каждый контекст, нужно продублировать все ресурсы и создать для них шаблоны в которых указаны тв в зависимости от языка?
2) По поводу extendresource, если я правильно понимаю, нужно продублировать все поля в таблице, добавив к ним свои приставки типа by, перевести все значения, добавив их там же, далее указать их в custom.class.php. В нужных шаблонах языковых версий, разместить вызов mFilter2 у которого в select прописаны название полей с переводами?
3) Если так и прикинуть что полей в таблице к примеру 10 и значений у этих полей 200 а языковых версий сайта 20, получается дополнительно в одной таблице 190 полей и 3800 значений и это наверно очень сильно повлияет на скорость фильтрации если да, то каким обрам этого можно избежать?
Самый простой вариант — это продублировать. Ресурсы и так у вас будут в каждом контексте свои.
В extendresource можно просто создать дополнительное поле, в котором сохранять контекст. Тут не нужно ничего дублировать. В результате будет столько же записей сколько ресурсов.
Александр, как Вы считайте, если опираться на скорость, что лучше использовать для мультиязычности, Babel где контексты или к примеру MultiLingual, Localizator?
Тут просто добавить дополнительное поле в таблицу (ну и соответсвенно обновить компонент):
Затем его использовать в запросах, и следовательно, выбирать только те записи, которые относятся к этому контексту.
Самый простой вариант — это создать разные шаблоны для разных языковых версий сайтов. К одним шаблонам привязать одни TV, например, оканчивающиеся на di, а к другим, другие TV, например, оканчивающиеся на by. После этого в шаблонах и чанках соответственно добавить эти окончания.
Этот вариант основан на дублировании шаблонов, чанков и т.д. Т.е. для каждой языковой версии сайта создавать свой набор MODX элементов.
В extendresource это можно попробовать реализовать просто добавив к нему дополнительное поле для хранения контекста. Далее в запросе можно дополнительно указывать контекст и следовательно выбирать только те данные, которые к нему принадлежат.
Александр, отображение дополнительных полей в админке у вас реализовано через плагин ExtendedResource, представленный в этой статье? Если так, то в этом случае нужно просто получить контекст ресурса. Это можно сделать так:
Далее полученный контекст вам нужно использовать в условиях для выборки соответствующих данных из базы данных и в других местах кода при необходимости.
возможно я вообще не правильно делаю?
Добавить варианты значений можно так:
Дополнительно, если нужно, можно добавить в таблицу «site_content_extend» поле «context_key» также как это сделано в таблице «site_content». После этого добавить его в схему «extendresource.mysql.schema.xml» и сгенерировать новую модель.
Затем добавить в плагин следующую строку:
И если я правильно понимаю, при таком условие в админке должны выводится значения так, если контекст «web» выводим одно, если другой любой контекст, выводим другое, а как можно добавить свои значения поля не только для контекста «web» а к примеру для контекста «deg» и некоторых других, как правильно нужно прописывать условие, подскажите пожалуйста?
Сделайте через ассоциативный массив:
Для этого можно проверить наличие ключа в массиве. Если его нет, то используем какой-то по дефолту (например, en):