Контексты, Fenom, Babel Новый

Дополнение: pdoTools, 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, 17:10    Иванов Степан   
0    95 0

Комментарии (12)

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

    Как вариант — сделать это несколькими чанками, тогда сразу будет видно, как устроена логика.
    1. Иванов Степан 15 ноября 2017, 17:24 # 0
      Да, ссылки на разные ресурсы, аналогичные но в другом контексте.
      Много if к каждому {$_modx->makeUrl(4)} и т.п.
      1. Павел Романов 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>
      2. Александр 15 ноября 2017, 17:35 # 0
        Скажите, пожалуйста, не сталкивались ли с проблемой отображения лексиконов на одной из версий сайтов? У меня на русской версии всё нормально (контекст web), с английской проблемы (контекст en): не отображается текст лексикона в minishop2 (msProducts), вместо него отображается имя лексикона. Но! Если прописать в конце адресной строки ?cultureKey=en — всё нормально… В настройках контекста cultureKey прописан.
        Если у вас нет такой ошибки, напишите свои настройки второго контекста, а также плагин, которым это всё подключается, пожалуйста.
        1. Иванов Степан 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']);
          }
          
          1. Александр 15 ноября 2017, 17:44 # 0
            Спасибо за ответ.
            А в .htaccess что у вас или вы nginx пользуетесь?
            1. Иванов Степан 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]
              
        2. Виталий Серый 15 ноября 2017, 18:10 # +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}
          
          1. Иванов Степан 16 ноября 2017, 10:56 # 0
            Спасибо!
            А как реализовать данное решение с контекстами и разными id ссылок у контекстов?
            1. Виталий Серый 16 ноября 2017, 11:18 # 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}
              
              1. Павел Романов 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>
                1. Виталий Серый 16 ноября 2017, 11:55 # 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>
                  
            Вы должны авторизоваться, чтобы оставлять комментарии.