pdoTools и Localizator, дружба

Есть локализация на сайте вида:
http://celestaclub.ru/en/

pdoTools генерирует ссылки на ресурсы не учитывая этого, что логично.
<a href="produkcziya/">Products</a>
>>Приводит к тому, что идет переадресация на главную страницу.
>>Попытка прописать base приводит к тому, что все стили и картинки отваливаются.

Вопрос: Как можно их подружить?!
>>Я себе это представляю, как некий плагин, который бы реагировал бы на изменения локализации.

И в зависимости от config.cultureKey, подставляло бы в ссылки сгенерированные pdoTools-ом ключ локали (ru, en, uz).
{$_modx->config.cultureKey}

Вывожу топ меню так:
https://codepen.io/pinocorp/pen/odPmJw?editors=1010

При этом есть сниппет который выводит кнопки переключения локализации, может через него что-нибудь сделать?
https://codepen.io/pinocorp/pen/BxOMOO
Oleg
16 мая 2018, 06:19
modx.pro
1
2 045
0

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

Oleg
16 мая 2018, 09:25
0
Сниппет вывода, панельки переключения языков.
<?php
$output = "";

// определяем есть ли языки через "папки"
$uri = $_SERVER['REQUEST_URI'];
if(substr($uri, 0, 1)) {
    $uri = mb_substr($uri, 1);
    $tmp = explode('/', $uri);
    if($path = $tmp[0]) {
        $tmp = $modx->getObject('localizatorLanguage', array('http_host:LIKE' => "%/{$path}/"));
        if($tmp) {
            $uri = str_replace("{$path}/", "", $uri);
        }
    }
}

$languages = $modx->getIterator('localizatorLanguage');
foreach($languages as $language) {
    if(mb_substr($language->http_host, -1) == '/') {
        $link = $language->http_host . $uri;
    } else {
        $link = $language->http_host . '/' . $uri;
    }
    $langIMG = array(
        'rus' =>'assets/templates/UZVALVE/img/ru_flag.png',
        'eng' =>'assets/templates/UZVALVE/img/en_flag.jpeg',
        'uzb' =>'assets/templates/UZVALVE/img/uz_leng.png'
    );
    $lang = explode("/", $link);
    if($lang[1] == 'uz'){
        $image = $langIMG['uzb'];
    }
    elseif($lang[1] =='en'){
        $image = $langIMG['eng'];
    }
    else{
        $image = $langIMG['rus'];
    }
    $output .= "<li><a href=\"http://{$link}\"><img src=\"{$image}\" alt=\"russian_language\" title=\"{$language->name}\"></a></li>";
}

return $output;
    Oleg
    16 мая 2018, 09:26
    0
    Как вывожу topmenu:
    {'pdoMenu' | snippet : [
    	'parents' => 0,
    	'level' => 3,
    	'templates'=>-6,
    	'tplOuter'=>'@INLINE <ul>{$wrapper}</ul>',
    	'tpl'=>'@INLINE <li><a href="{$link}">{$menutitle}</a>{$wrapper}</li> ',
    	'tplParentRow'=>'@INLINE <li class="main_menu__parent"><a href="{$link}">{$menutitle}</a>{$wrapper}</li>',
    	'where' => '{ "localizator.key" : "' ~ ('localizator_key' | option) ~ '"}',
    	'select' => '{ "localizator" : "modResource.*, localizator.*, modResource.id" }',
    	'leftJoin' => '{
    		"localizator" : {
    			"class" : "localizatorContent",
    			"alias" : "localizator",
    			"on" : "localizator.resource_id = modResource.id"
    			}
    	}']}
      Дмитрий
      16 мая 2018, 10:36
      +1
      Вообще, изначально советую внимательно документацию по Localizator почитать, там полно всяких хитрых штук.
      А касаемо вопроса ниже.
      Функционал вывода меню с языками можно сделать гораздо проще, и даже без сниппета.
      //Делаем массив на Fenom типа такого: 
      {var $langs = [
      	'en' => [
      		'img' => 'assets/templates/UZVALVE/img/en_flag.jpeg',
      		'alt' => 'alt text',
      		'some properties' => 'some properties 1'
      	],
      	'ru' => [
      		'img' => 'assets/templates/UZVALVE/img/ru_flag.jpeg'
      	]
      ]}
      //Далее просто подставляем значение из текущей опции
      {var $lang = ('localizator_key' | option)}
      <li>
      <a href=""><img src="{$langs[$lang['img']]}" alt="{$langs[$lang['alt']]}"></a></li>
      Ну или типа того. Гораздо понятнее, проще, и универсальнее.
      А касательно темы, как сделать собственный генератор ссылок. Вообще с помощью PDOTools Localizator очень неплохо генерит URL, вы, видимо, не разобрались с компонентом до конца.

      Ну а если нужно прям делать URL на определенные страницы, то могу посоветовать сделать плагин на событие pdoToolsOnFenomInit с таким кодом:
      switch ($modx->event->name) {
          case 'pdoToolsOnFenomInit':
              /** @var Fenom $fenom
                Мы получаем переменную $fenom при его первой инициализации и можем вызывать его методы.
                Например, добавим модификатор вывода имени домена сайта из произвольной ссылки.
               */
              $fenom->addModifier('locUrl', function ($input) use ($modx) {
                  if ($modx->localizator_key != 'ru') {
                      $output = $modx->localizator_key.'/'.$modx->makeUrl($input);
                  } else {
                      $output = $modx->makeUrl($input);
                  }
                  return strtolower($output);
              });
              break;
      }
      Где RU — это ваш основной язык. Можно еще удобнее сделать и лучше, но я это так, для примера.
      А вызывать это так:
      <a href="/{'5'|locUrl}">Magazin</a>
      И будет вам счастье.
        Oleg
        16 мая 2018, 10:43
        0
        Спасибо)
        Вы меня явно спасли)

        Проблема локализатора в том, что у него нет документации, кроме:
        1. Ссылки на гит.
        2. Кучи тикетов в разных форумах, и комментов под основным его постом.
        Если есть что-то еще, более структурированное, то я буду только рад почитать.

        Вообще с помощью PDOTools Localizator очень неплохо генерит URL, вы, видимо, не разобрались с компонентом до конца.
        Можете объяснить? Если не сложно.
          Дмитрий
          16 мая 2018, 10:51
          0
          С этим не могу сейчас помочь, надо разбираться, вспоминать, извините
            Oleg
            16 мая 2018, 10:52
            0
            И на этом спасибо)
          Oleg
          16 мая 2018, 10:46
          0
          Я вроде как понял как можно перевести все, кроме значений дополнительных полей и тп.

          Кстати, у меня вопрос насчет доп полей.
          Их как лучше переводить?
          По аналогии с вашим меню с языками?
          Migx(ключи) в migx(значения) и из него декодировать массив?
            Дмитрий
            16 мая 2018, 10:53
            0
            А поля… Ну есть вариант делать автоперевод через функционал Яндекс.Переводчика, заложенного в локализатор.
            Или можно делать все поля MIGX, да. Я так делал:
            {if ('localizator_key'|option)!='ru'}
                {var $key = ('localizator_key'|option)~'_'}
            {/if}
            <div class="container">
                <div class="row">
                    {var $principles = $_modx->resource.principles|fromJSON}
                    {foreach $principles as $p}
                        <div class="col-xs-12 col-md-4">
                            <h3>--{$key~'title'}--</h3>
                            <h2>{$p[$key~'title']}</h2>
                            <p>{$p[$key~'text']}</p>
                        </div>
                    {/foreach}
                </div>
            </div>
            Только у меня каждое поле MIGX было en_field и ru_field например
              Oleg
              16 мая 2018, 10:55
              0
              Ну я сейчас именно так же пилю, с точно таким же подходом к полям.
            Oleg
            16 мая 2018, 10:51
            0
            У меня просто локаль на русском без подставки /ru/
            может быть из-за этого я не дружу с ними?
              Дмитрий
              16 мая 2018, 11:08
              0
              Нет, не обязательно так должно быть. Надо ковыряться, пробовать… У меня несколько сайтов на Localizator'е работают, нормально вполне себе, и ссылки и всё остальное.
                Oleg
                16 мая 2018, 11:10
                0
                Может быть с опытом будет и у меня так же)
                Это мой первый сайт на модиксе собранный мною с нуля и сразу на fenom и мультиязычный)
                  Дмитрий
                  16 мая 2018, 12:18
                  +1
                  Продолжайте в том же духе и через полгода цены вам не будет))
            Oleg
            16 мая 2018, 12:31
            0
            Мой вариант вывода перевода в мигсах

            Админка:


            Вкладка формы(поля контейнера для значений):
            [
              {
                "caption": "Заголовок",
                "fields": [
                  {
                    "field": "lang",
                    "caption": "Локализация",
                    "inputTVtype": "listbox",
                    "inputOptionValues": "Русский==ru||English==en||O'zbek==uz"
                  },
                  {
                    "field": "text",
                    "caption": "Заголовок",
                    "inputTV": "block_menu"
                  }
                ]
              }
            ]

            Разметка колонок(поле тоже):
            [{
              "header": "Локализация",
              "width":"50",
              "dataIndex": "lang"
            }]

            «inputTV»: «block_menu»
            Подключил доп поле, которое не к какому шаблону не присовил.
              Oleg
              16 мая 2018, 12:34
              1
              0
              Вывод в моем случае такой:
              {var $key = $modx->localizator_key}
              {set $rows = json_decode(20|resource:'loc_sidebar', true)}
              {foreach $rows as $row}
                          {if $key == $row.lang}
                              {set $vals = json_decode($row.text, true)}
                              {foreach $vals as $val}
                                  <a href="{$_modx->makeUrl($val.id)}"><img src="{$val.image}" alt=""><span>{$val.text}</span></a>
                              {/foreach}
                          {/if}
              {/foreach}
                Володя
                16 мая 2018, 13:03
                +2
                Плагин на OnMODXInit
                в нем подгружаете свой класс на основе pdoFetch в котором переопределяете makeUrl
                в makeUrl вносите изменения в url согласно вашим правилам.
                Все.
                  Oleg
                  16 мая 2018, 13:04
                  0
                  Благодарствую.
                  Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                  17