Localizator, модификаторы для получения переводов
Локализатор очень хорошая штука и хотелось ее опробовать, но как то не задалось переносить уже готовые данные со всего сайта в поля локализатора. Пришлось искать решения для вывода данных и при том с учетом того что же есть в основном контенте страниц.
Итак… модификаторы для вывода данных, пошагово:
1. создаем плагин...
2.1 модификатор для полей:
{1 | localfield:'pagtitle'} или {'pagetitle' | localfield} если на текущей странице
2.2 модификатор для тв-шек:
{1 | localtv:'tv_name'} или {'tv_name' | localtv} если на текущей странице
для вывода данных MIGx делаем следующее (забывая про getImageList):
Правки и дополнения принимайся с удовольствием ;)
Итак… модификаторы для вывода данных, пошагово:
1. создаем плагин...
<?php
/** @var modX $modx */
switch ($modx->event->name) {
case 'pdoToolsOnFenomInit':
/** @var Fenom $fenom */
$pdo = $modx->getService('pdoTools');
// localfield
$fenom->addModifier('localfield', function ($id, $field = null) use ($pdo, $modx) {
if (!is_numeric($id)) {
// не менять местами
$field = $id;
$id = $modx->resource->get('id');
}
$key = $modx->getOption('cultureKey');
$output = '';
// получаем поле перевода
if ($key != 'ru') {
$value = $modx->getObject('localizatorContent', array(
'resource_id'=>$id,
'key'=>$key
));
if ($value !== null) {
$output = $value->get($field);
}
}
// если перевода еще нет то берем из основного языка
if (empty($output)) {
$res = $modx->getObject('modResource', $id);
$output = $res->get($field);
}
return $output;
});
// localtv
$fenom->addModifier('localtv', function ($id, $field = null) use ($pdo, $modx) {
if (!is_numeric($id)) {
// не менять местами
$field = $id;
$id = $modx->resource->get('id');
}
$key = $modx->getOption('cultureKey');
$output = '';
// получаем поле перевода
if ($key != 'ru') {
$tvObj = $modx->getObject('modTemplateVar',array('name' => $field));
$tvId = $tvObj->get('id');
$tv = $modx->getObject('locTemplateVarResource', array(
'contentid'=>$id,
'key'=>$key,
'tmplvarid'=>$tvId
));
if ($tv !== null) {
$output = $tv->get('value');
}
}
// если перевода еще нет то берем из основного языка
if (empty($output)) {
$res = $modx->getObject('modResource', $id);
$output = $res->getTVValue($field);
}
return $output;
});
break;
}и не забываем поставить галочку pdoToolsOnFenomInit в системных событиях2.1 модификатор для полей:
{1 | localfield:'pagtitle'} или {'pagetitle' | localfield} если на текущей странице
2.2 модификатор для тв-шек:
{1 | localtv:'tv_name'} или {'tv_name' | localtv} если на текущей странице
для вывода данных MIGx делаем следующее (забывая про getImageList):
{var $rows = json_decode('mix_tv' | localtv, true)}
{foreach $rows as $row}
<p>{$row['name']} - и так построчно далее со своим html</p>
{/foreach}За идеи спасибо: Александру, Дмитрию и многим другим кто много вложил в общее дело =)Правки и дополнения принимайся с удовольствием ;)
Комментарии: 11
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
в моем случае он отрабатывал не корректно + сайт уже наполнен контентом и переносить все из оригинала в локализатор как то не хотелось
Сейчас отрабатывает в случае если добавлена локализация
Потому как модификатор переводов предложений мной не для сортировки в сниппетах. Вывод перевода осуществляется в чанке [в вашем случае — chunks/tpl/coach.tpl].
Для сортировки в блоке where используйте обычную сортировку по тв.