Интеграция из сниппетами

    Интеграция bLang из другими сниппетами

    DocLister, DLcrums и другие сниппеты которые юзают контроллер site_content

    Для DocLister достаточно просто, указать контроллер lang_content, и все поля и урл, будут подменятся в зависимости от языка.

    [[DocLister? &tpl=`@CODE:[+title+]` &controller=`lang_content`]]

    DLMenu

    [[DLMenu? &controller=`lang_menu`]]

    multiTV

    Создаем конфигурацию по примеру:

    <?php
    $settings['display'] = 'vertical';
    $settings['fields'] = array(
        'title' => array(
            'caption' => 'Title RU',
            'type' => 'text'
        ),
        'title_en' => array(
            'caption' => 'Title EN',
            'type' => 'text'
        ),
        'title_ua' => array(
            'caption' => 'Title UA',
            'type' => 'text'
        ),
    );
    $settings['templates'] = array(
        'outerTpl' => '<div class="images">[+wrapper+]</div>',
        'rowTpl' => '<p>[+title[(_suffix)]+]</p>'
    );

    Здесь под каждый язык, мы создаем поле, а при выводе используем суффикс.

    <?php
    $settings['display'] = 'vertical';
    $settings['fields'] = array(
        'title' => array(
            'caption' => 'Title RU',
            'type' => 'text'
        ),
    
    );
    $settings['templates'] = array(
        'outerTpl' => '<div class="images">[+wrapper+]</div>',
        'rowTpl' => '<p>[+title+]</p>'
    );
    
    $bLang = \bLang\bLang::GetInstance($this->modx);
    $settings = $bLang->bLangChangeMultitvFields($settings,['title'],'#caption# (#lang#)',['templates']);

    В этом варианте, мы автоматичиски дублируем поля под каждый язык, и автоматичиски подменяем плейсхолдеры в шаблонах. Первый параметр - это как раз масив настроек. Второй масив из полями, для который нужно делать дубли. Третий - формат назнаний. Четвертный масив груп шаблонов, в который нужно подменять плейсхолдеры.

    clientSettings

    <?php
    
    $settings =  [
        'caption' => 'All fields',
        'settings' => [
            'field' => [
                'caption' => 'Text field',
                'type'  => 'text',
            ],
        ],
    ];
    $bLang = \bLang\bLang::GetInstance($modx);
    return $bLang->changeClientSettingsFields($settings,['field']);
    

    Логика как и в multitv, метод сам сделает дубли в конфигурации. В шаблоне используем [(g_field)], значение само изменится в зависимости от языка.

    FormLister

    1. В словаре создаем запись FL_lexicon, и для каждого языка пишем названия лексикона (соответствует названию папоп /assets/snippets/FormLister/core/lang)
      Для ru russian-UTF8, для en english.

    2. В вызов добавляем два параметра: &lang=[(__FL_lexicon)] &lexiconHandler=\bLang\bLangLexiconHandler

    3. Внутри формы получить значение записи из словаря можем

      • [(__name)]
      • [%name%]
      • $FormLister->translate('name');
    4. В action нужно в начале написать [(_root)], чтоб форма отправлялась на нужную языковую версию

    eFilter

    Тут все достаточно просто, названия фильтров выносим в словарь. И либо в кониге пишет в инпету для названия [(name)] либо в конфиге [(filter_[+tv_id+])] и в словаре создаем запись filter_41, где 41 - это id tv параметра.

    Все параметры которые нужно менять, в зависимости от языка, необходимо вынести в дерево, каждому прописать значение для каждого языка. В возможных значений такой тв прописать

    @EVAL  return $modx->runSnippet("bLang", [ 'type'=>'getTreeParams',  "parent"=>"6", 'firstEmpty'=>'1']);

    bLang будет возвращать в зависимости от языка значение из нужного поля.

    PageBuilder

    Для каждого языка создаем свой контейнер, и PageBuilder вызываем из нужным контейнером.