Одна галерея (ms2gallery) для двух языков

Всех с праздником!!!

На блоге появилась задача сделать одну галерею для двух контекстов (языков) то есть что бы можно было добавлять фото только в одном месте а выводить на двух контекстах site.com/ru и site.com/en
структура:

-контекст 1
-- галерея
--- альбом 1
--- альбом 2
-контекст 2
-- gallery
--- album 1
--- album 2

Шаблон списка галерей

[[!pdoPage?
	&element=`ms2GalleryResources`
	&parents=`3`
	&tpl=`GalleryArticle`
	&includeThumbs=`360x240`
	&ajaxMode=`scroll`
	&limit=`6`
	&sortby={"menuindex":"ASC"}
]]
[[!+page.nav]]

чанк GalleryArticle

<div class="adaptive-item">
    <a href="[[+alias]]" class="">
        <div class="overlay-album"></div>
        <img class="responsive-image" src="[[+360x240:default=`/assets/images/nophoto.jpg`]]" alt="[[+pagetitle]]">
        <div class="info-block">
            <div class="backshadow"></div>
            <div class="info">
                <h4>[[++cultureKey:is=`ru`:then=`[[+pagetitle]]`:else=`[[+longtitle]]`]]</h4>
                <span>[[dateAgo? &input=`[[*publishedon]]`]]</span>
            </div>
        </div>
    </a>
</div>

Шаблон галереи

[[!pdoPage?
	&element=`ms2Gallery`
	&resource=`[[!idBabel]]`
	&typeOfJoin=`inner`
	&includeThumbs=`360x240`
	&includeOriginal=`1`
	&ajaxMode=`scroll`
	&limit=`6`
	&tplOuter=`@INLINE [[+rows]]`
	&tplRow=`@INLINE
		<div class="adaptive-item">
		<a href="[[+url]]" class="swipebox">
		<div class="overlay-album"></div>
		<img class="responsive-image" src="[[+360x240]]" alt="[[+name]]">
		</a>
		</div>
	`
]]
[[!+page.nav]]

Сниппет idBabel

<?php
$babel = $modx->getService('babel','Babel',$modx->getOption('babel.core_path',null,$modx->getOption('core_path').'components/babel/').'model/babel/');
if (empty($resourceId)) {
    if (!empty($modx->resource) && is_object($modx->resource)) {
        $resourceId = $modx->resource->get('id');
    } else {
        return;
    }
}
$linkedResources = $babel->getLinkedResources($resourceId);
return $linkedResources[web]; //web это контекст из которого достаем id ресурса

Принцип работы: (нужен babel и ms2gallery)
Создаем шаблоны
Создаем категорию для галерей в контексте web и подкатегории в которые добавляем фотографии
Делаем перевод этих ресурсов через babel
Создаем сниппет idBabel который подпихивает id документа из контекста «web» в &resource

В итоге получаем нормальные ссылки типа site.com/ru/gallery/album1 и site.com/en/gallery/album1
и фотографии в них только из одно контекста.

Думаю что есть и другой способ, но этот мне показался наиболее логичным.
Основные плюсы для меня
— использование ms2gallery с его удобством добавлением фотографий, их сортировки итд
— добавление фотографий только в одном месте, так как по сути у меня альбомы что для ru что для en версии одинаковые (за исключением названия альбомов)

Дополнительно в шаблоне использую словари [[%name? &topic=`mylang`]] и вывод нужных полей с условием текущего контекста [[++cultureKey:is=`ru`:then=`это`:else=`или это`]]

Критика в комментах приветствуется!
P.S. Напишите кто как решает подобные задачи
Alex Zhuravlev
09 мая 2015, 10:56
modx.pro
7
3 121
+3

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

Ivan Shvindin
09 мая 2015, 15:47
1
+1
юзер заполняет картинки только в ru контексте
[[ms2Gallery? &resource=`[[*LanguageLinks:getID]]`]]
в ресурсе ТВха бабела, через свой фильтр получающая id

<?php
$input = explode(';', $input);
foreach ($input as $row) {
    $tmp = explode(':', $row);
    $array[$tmp[0]] = $tmp[1];
}
return $array[ru];
Описания картинок соответственно тоже нужно заполнять в одном месте в определённом формате (ru==Картинка1||en==Picture1)
<div class="span2 col-sm-2">
	<a href="[[+360x270:default=`[[+url]]`]]" class="thumbnail" data-image="[[+url]]">
		<img src="[[+120x90]]" alt="[[+description:getTXT]]" title="[[+name:getTXT]]" width="120" height="90">
	</a>
</div>
<?php
$lang = $modx->getOption('cultureKey', null, 'default');

$input = explode('||', $input);
foreach ($input as $row) {
    $tmp = explode('==', $row);
    if ($tmp[0] == 'web') {$tmp[0] = 'sk';} // язык для стандартного контекста
    $array[$tmp[0]] = $tmp[1];
}
return $array[$lang];
    Alex Zhuravlev
    11 мая 2015, 00:43
    0
    Спасибо.
    А я что то и не заметил Tv от babel ))) класс!
    Alex Zhuravlev
    11 мая 2015, 00:42
    0
    Если нужно что бы в eng версии выводились TV или вообще какие либо поля именно из eng ресурсов, например pagetitle который у меня идет и в хлебные крошки и для eng названия альбомов то по решению Ivan Shvindin и парсера Василия я реализовал это так
    [[++cultureKey:is=`ru`:then=`[[+pagetitle]]`:else=`[[#[[+tv.babelLanguageLinks:getID]].pagetitle]]`]]
    а в самом сниппете getID указал return $array[eng];
    То есть получаем из Tv babelLanguageLinks массив вида web:3;eng:13 и вытаскиваем из него 13 после чего подпихиваем в парсер что бы получить нужное поле из этого id
      Romancho
      23 апреля 2019, 00:05
      0
      В 2019 данный пример не работает. Пытаюсь вывести изображения галерей ресурсов с ms2Gallery. В контексте «web» (русская версия), где есть галереи всё отображается. В контекст «en» сделан перевод средствами Babel и галереи не находятся.
      [[!pdoPage?
              	&element=`ms2GalleryResources`
                      &resource=`[[!idBabel]]`
              	&tpl=`GalleryMain`
              	&includeThumbs=`big`
              	&includeTVs=`colorpicker, exh_date`
              	&sortby={"menuindex":"ASC"}
              	&ajaxMode=`ajax`
              	&showLog=`1`
              	&limit=`0`
              	&ajaxTplMore=`@INLINE <button class="btn btn-brown btn-more">[[++cultureKey:is=`ru`:then=`Показать еще`:else=`Show more`]]</button>`
              ]]
      GalleryMain.tpl
      <div class="slot">
          <a href="[[+alias]]" class="">
              <div class="overlay-album"></div>
              <div class="slot_image">
                  <img class="responsive-image" src="[[+big]]" alt="[[+pagetitle]]">
              </div>
              <div class="info-block">
                  <div class="backshadow" style="background-color:#[[+tv.colorpicker]];"></div>
                  <div class="info">
                      <div class="panel-top">
                          <h4>[[+pagetitle]]</h4>
                          <span class="date">[[+tv.exh_date]]</span>
                      </div>
                      <div class="panel-bottom">
                          <span class="description">[[+description]]</span>
                      </div>    
                  </div>
              </div>
          </a>
      </div>
      Сниппет тот же. В контексте «en» [[+big]] unknown
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        4