Localizator, модификаторы для получения переводов

Локализатор очень хорошая штука и хотелось ее опробовать, но как то не задалось переносить уже готовые данные со всего сайта в поля локализатора. Пришлось искать решения для вывода данных и при том с учетом того что же есть в основном контенте страниц.
Итак… модификаторы для вывода данных, пошагово:

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}
За идеи спасибо: Александру, Дмитрию и многим другим кто много вложил в общее дело =)
Правки и дополнения принимайся с удовольствием ;)
Юрий Фомин
01 декабря 2020, 18:41
modx.pro
11
602
+15

Комментарии: 11

Sergey (Sentinel)
01 декабря 2020, 18:54
0
Так там ведь из коробки есть
{55 | locfield : 'longtitle'}
    Юрий Фомин
    01 декабря 2020, 18:56
    0
    к сожалению он работает только с полями заполненными в локализаторе.
    в моем случае он отрабатывал не корректно + сайт уже наполнен контентом и переносить все из оригинала в локализатор как то не хотелось
      Sergey (Sentinel)
      01 декабря 2020, 19:27
      0
      а, т.е. это решение, если контент уже есть и мы ставим localizator?
Павел Гвоздь
04 декабря 2020, 09:46
0
4 закладки и 2 лайка. Всегда удивлялся, что с людьми не так, почему такие жадные на лайки? Типа «сохраню, буду юзать, но лайк не поставлю».
Яна Митрофанова
22 декабря 2020, 12:36
0
Здравствуйте. Подскажите пожалуйста, как прописать 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',
]}
    Юрий Фомин
    22 декабря 2020, 12:47
    +1
    никак :)
    Потому как модификатор переводов предложений мной не для сортировки в сниппетах. Вывод перевода осуществляется в чанке [в вашем случае — chunks/tpl/coach.tpl].
    Для сортировки в блоке where используйте обычную сортировку по тв.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
11