Контексты, 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
modx.pro
1
3 535
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>
            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
            12