Контексты, Fenom, Babel

Друзья и снова здравствуйте!
И снова вопрос с целью упростить будущую жизнь себе и тем кто может работать дальше с проектом.
Реализовал проект с мультиязычностью, Babel, Fenom и все прелести жизни. В виду острой нехватки времени и опыта для каждого из шаблонов реализовал отдельные шаблоны в которых внёс изменения поменял ссылки и кажется был доволен, но уже на первых же правках хотелось себя убить за то решение. В связи с чем постепенно перевожу всё в единые шаблоны. Изучил лексиконы, пространства имён, if в феноме конечно же спасает, но столкнулся с такой ситуацией:
Есть кусок шаблона который выглядит вот так:
<div class="content__item content__item1">
	<a href="{$_modx->makeUrl(2)}" class="content__heading content__heading--1">{'gg_about' | lexicon}</a>
	<a href="{$_modx->makeUrl(2)}" class="content__heading-a">
		<p>{2 | resource : 'introtext'}</p>
	</a>
	<span class="content__more2"> {'gg_more' | lexicon}</span>
	<a href="{$_modx->makeUrl(2)}" class="content__more"> {'gg_more' | lexicon}</a>
</div>
<div class="content__item content__item2">
	<a href="{$_modx->makeUrl(4)}" class="content__heading content__heading--2">{'gg_invest' | lexicon}</a>
	<a href="{$_modx->makeUrl(4)}" class="content__heading-a">
		<p>{4 | resource : 'introtext'}</p>
	</a>
	<span class="content__more2"> {'gg_more' | lexicon}</span>
	<a href="{$_modx->makeUrl(4)}" class="content__more"> {'gg_more' | lexicon}</a>
</div>
<div class="content__item content__item3">
	<a href="{$_modx->makeUrl(3)}" class="content__heading content__heading--3">{'gg_trade' | lexicon}</a>
	<a href="{$_modx->makeUrl(3)}" class="content__heading-a">
		<p>{3 | resource : 'introtext'}</p>
	</a>
	<span class="content__more2"> {'gg_more' | lexicon}</span>
	<a href="{$_modx->makeUrl(3)}" class="content__more"> {'gg_more' | lexicon}</a>
</div>
т.е. идёт вызов большого кол-ва ссылок в разных блоках, кнопках, заголовках в разных местах.
используя:
{if $_modx->context.key == 'web'}
{else}
{/if}
Попробовал два варианта, грубо говоря один if и много:
Если много, т.е. для каждой ссылки мы получаем «кавардак» и всё это сложновато становится читать и воспринимать.
А Если для всего блока, то в дальнейшем мы имеем все шансы просто забыть или не знать что там ниже где то else и тоже надо бы поправить что то.

Есть ли варианты вывода которые были бы и читаемы и не требующие дублирования кусков html.
Возможно моё решение в целом не верно, буду рад советам и напутствиям!
Спасибо!
Иванов Степан
15 ноября 2017, 14:10
1
538
0

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

Олег
15 ноября 2017, 17:23
0
Не слишком понятно, куда именно применяются много if.
В разных контекстах ссылки тоже разные?

Как вариант — сделать это несколькими чанками, тогда сразу будет видно, как устроена логика.
Иванов Степан
15 ноября 2017, 17:24
0
Да, ссылки на разные ресурсы, аналогичные но в другом контексте.
Много if к каждому {$_modx->makeUrl(4)} и т.п.
    Павел Романов
    15 ноября 2017, 18:00
    +1
    Сделайте у контекстов настройки, куда прописывайте ID соответствующего раздела у данного контекста:
    pg_catalog = 2
    pg_news = 4
    и т. д.
    Тогда можно будет сделать так:
    {var news = $_modx->config.pg_news}
    <div class="content__item content__item2">
        <a href="{$_modx->makeUrl($news)}" class="content__heading content__heading--2">{'gg_invest' | lexicon}</a>
    	<a href="{$_modx->makeUrl($news)}" class="content__heading-a">
    		<p>{$news | resource : 'introtext'}</p>
    	</a>
    	<span class="content__more2"> {'gg_more' | lexicon}</span>
    	<a href="{$_modx->makeUrl($news)}" class="content__more"> {'gg_more' | lexicon}</a>
    </div>
Александр
15 ноября 2017, 17:35
0
Скажите, пожалуйста, не сталкивались ли с проблемой отображения лексиконов на одной из версий сайтов? У меня на русской версии всё нормально (контекст web), с английской проблемы (контекст en): не отображается текст лексикона в minishop2 (msProducts), вместо него отображается имя лексикона. Но! Если прописать в конце адресной строки ?cultureKey=en — всё нормально… В настройках контекста cultureKey прописан.
Если у вас нет такой ошибки, напишите свои настройки второго контекста, а также плагин, которым это всё подключается, пожалуйста.
    Иванов Степан
    15 ноября 2017, 17:41
    0
    Второй контекст у меня de, первый на английском, но так же web
    Настройки: joxi.ru/12MEVedf4QqN52
    Плагин:
    <?php
    if($modx->context->get('key') != "mgr") {
    switch ($_REQUEST['cultureKey']) {
    case 'de':
    $modx->switchContext('de');
    break;
    default:
    $modx->switchContext('web');
    break;
    }
    unset($_GET['cultureKey']);
    }
      Александр
      15 ноября 2017, 17:44
      0
      Спасибо за ответ.
      А в .htaccess что у вас или вы nginx пользуетесь?
        Иванов Степан
        15 ноября 2017, 17:47
        0
        На проде nginx
        А вот на тесте:
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteRule ^(en|de)/favicon.ico$ favicon.ico [L,QSA]
        
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteRule ^(en|de)/assets(.*)$ assets$2 [L,QSA]
        
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule ^(en|de)?/?(.*)$ index.php?cultureKey=$1&q=$2 [L,QSA]
Виталий Серый
15 ноября 2017, 18:10
1
+2
Мне нравится делать примерно вот так:
{set $items = [
	'2' => 'gg_about',
	'4' => 'gg_invest',
	'3' => 'gg_trade',
]}

{set $idx = 1}
{foreach $items as $id => $lex}
	<div class="content__item content__item{$idx}">
	    <a href="{$id | url}" class="content__heading content__heading--{$idx}">{$lex | lexicon}</a>
	    <a href="{$id | url}" class="content__heading-a">
	        <p>{$id | resource : 'introtext'}</p>
	    </a>
	    <span class="content__more{$idx}"> {'gg_more' | lexicon}</span>
	    <a href="{$id | url}" class="content__more"> {'gg_more' | lexicon}</a>
	</div>
	{set $idx = $idx + 1}
{/foreach}
    Иванов Степан
    16 ноября 2017, 10:56
    0
    Спасибо!
    А как реализовать данное решение с контекстами и разными id ссылок у контекстов?
      Виталий Серый
      16 ноября 2017, 11:18
      1
      0
      Через if или switch
      {set $items = [
      	'2' => 'gg_about',
      	'4' => 'gg_invest',
      	'3' => 'gg_trade',
      ]}
      
      {if $_modx->context.key == 'eng'} {* {if $_modx->config.cultureKey == 'en'} *}
          {set $items = [
      	'12' => 'gg_ne_about',
      	'14' => 'gg_invest_li',
      	'13' => 'gg_trader',
          ]}
      {elseif $_modx->context.key == 'deu'} {* {if $_modx->config.cultureKey == 'de'} *}
          {set $items = [
      	'22' => 'gg_about',
      	'24' => 'gg_invest_on',
      	'23' => 'gg_trade_in',
          ]}
      {/if}
      Павел Романов
      16 ноября 2017, 11:31
      +1
      Выше решение ))
      Там без подобных условий:
      {if $_modx->context.key == 'eng'}
      ...
      {/if}

      Значения подтягиваются автоматом из настроек конкретного контекста.
      Я там только в начале опечатался, сорри. Должно быть так:
      {var $news = $_modx->config.pg_news}
      <div class="content__item content__item2">
          <a href="{$_modx->makeUrl($news)}" class="content__heading content__heading--2">{'gg_invest' | lexicon}</a>
      	<a href="{$_modx->makeUrl($news)}" class="content__heading-a">
      		<p>{$news | resource : 'introtext'}</p>
      	</a>
      	<span class="content__more2"> {'gg_more' | lexicon}</span>
      	<a href="{$_modx->makeUrl($news)}" class="content__more"> {'gg_more' | lexicon}</a>
      </div>
        Виталий Серый
        16 ноября 2017, 11:55
        1
        0
        В данном случае это, на мой взгляд, оптимальная реализация, но предложу немного мутировать.
        В настройках контекста создать переменную, пусть будет ctx_res, в которой через запятую перечислить все требуемые id.
        Алиасы ресурсов привести в соответствие.
        И вывести, например, через pdoMenu
        {'pdoMenu' | snippet:[
        	'parents' => 0,
        	'resources' => 'ctx_res' | option,
        	'tpl' => 'tpl',
        ]}
        
        tpl:
        <div class="content__item content__item{$idx}">
        	<a href="{$id | url}" class="content__heading content__heading--{$idx}">{('gg_' ~ $alias) | lexicon}</a>
        	<a href="{$id | url}" class="content__heading-a">
        		<p>{$id | resource : 'introtext'}</p>
        	</a>
        	<span class="content__more{$idx}"> {'gg_more' | lexicon}</span>
        	<a href="{$id | url}" class="content__more"> {'gg_more' | lexicon}</a>
        </div>