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
Так там ведь из коробки есть
{55 | locfield : 'longtitle'}
к сожалению он работает только с полями заполненными в локализаторе.
в моем случае он отрабатывал не корректно + сайт уже наполнен контентом и переносить все из оригинала в локализатор как то не хотелось
в моем случае он отрабатывал не корректно + сайт уже наполнен контентом и переносить все из оригинала в локализатор как то не хотелось
а, т.е. это решение, если контент уже есть и мы ставим localizator?
можно и так
4 закладки и 2 лайка. Всегда удивлялся, что с людьми не так, почему такие жадные на лайки? Типа «сохраню, буду юзать, но лайк не поставлю».
о чем вы Павел?
не теряйте радости, огорчения того не стоят ;)
Здравствуйте. Подскажите пожалуйста, как прописать TV такого вида в where?
Сейчас отрабатывает в случае если добавлена локализация
Сейчас отрабатывает в случае если добавлена локализация
{'!ms2GalleryResources' | snippet : [
'parents' => 12,
'limit' => 0,
'where' => [
'sport' => $_modx->resource.id
],
'sortby' => 'menuindex',
'tpl' => '@FILE chunks/tpl/coach.tpl',
'includeThumbs' => 'person',
'tvPrefix' => '',
'includeTVs' => 'sport,coach_category',
]}
никак :)
Потому как модификатор переводов предложений мной не для сортировки в сниппетах. Вывод перевода осуществляется в чанке [в вашем случае — chunks/tpl/coach.tpl].
Для сортировки в блоке where используйте обычную сортировку по тв.
Потому как модификатор переводов предложений мной не для сортировки в сниппетах. Вывод перевода осуществляется в чанке [в вашем случае — chunks/tpl/coach.tpl].
Для сортировки в блоке where используйте обычную сортировку по тв.
Спасибо
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.