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

    Інтеграція bLang з іншими сніпетами

    DocLister, DLcrumbs і інші сніпети які юзают контролер 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.

    1. У виклик додаємо два параметри: &lang=[(__FL_lexicon)] &lexiconHandler=\bLang\bLangLexiconHandler

    2. Всередині форми отримати значення запису зі словника можемо

      • [(__name)]
      • [%name%]
      • $FormLister->translate('name');
    3. У 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 викликаємо з потрібним контейнером.