К содержанию

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
2 627
Реклама

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

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