Помогите сократить запись на феном.

Всем привет. Подскажите как можно сократить запись:
{if $_modx->resource.id==17 OR $_modx->resource.parent==17 OR $_modx->resource.id==358 OR $_modx->resource.parent==358 OR $_modx->resource.parent==39 OR $_modx->resource.parent==40 OR $_modx->resource.parent==41 OR $_modx->resource.parent==42 OR $_modx->resource.parent==43 OR $_modx->resource.parent==44 OR $_modx->resource.parent==406 OR $_modx->resource.parent==407 OR $_modx->resource.parent==408 OR $_modx->resource.parent==409 OR $_modx->resource.parent==410 OR $_modx->resource.parent==411}
<a href="tel:+999999999999"> <i class="fa fa-phone"></i> 999999999999</a>	  
{else}
<a href="tel:+1111111111111"> <i class="fa fa-phone"></i> 1111111111111</a>	 
{/if}
Суть такая:
разные отделы продают разные товары, у них разные телефоны. задача чтобы для отдельной категории и всех её дочерних категорий и товаров показывался телефон 999999999999, для остальных телефон 1111111111111.

Пробовал такой вариант:
{if $_modx->resource.id in list $_modx->getChildIds(17,2)}
но не получается привязать аналогичный ресурс из другого контекста, 358й, и работает он только для дочерних, текущий не учитывает
Структура такая:
Andrew
20 августа 2020, 10:50
modx.pro
781
0

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

Тодор
20 августа 2020, 11:32
0
Не знаю на сколько такая структура короче ))) но я бы так написал
{if in_array($_modx->resource.id, [17, 358]) ||
    in_array($_modx->resource.parent, $_modx->getChildIds(17,2)) ||
    in_array($_modx->resource.parent, $_modx->getChildIds(358,2))}
    <a href="tel:+999999999999"> <i class="fa fa-phone"></i> 999999999999</a>	  
{else}
    <a href="tel:+1111111111111"> <i class="fa fa-phone"></i> 1111111111111</a>	 
{/if}
    Andrew
    20 августа 2020, 11:41
    0
    Попробовал, к сожалению не работает такой вариант. Телефон 999999999999 показывает на других ресурсах (на всех кроме главной), которые к 17 и 358 не имеют отношения.
    Тодор
    20 августа 2020, 12:20
    0
    Посмотри что у тебя выводит:
    {$_modx->getChildIds(17,2) | print_r}
    {$_modx->getChildIds(358,2) | print_r}
    на сколько я момню для getChildIds необходимо указывать контекст, а контексты у тебя там разные
      Andrew
      20 августа 2020, 12:26
      0
      Вот что вывело:
      Array ( [0] => 39 [1] => 40 [2] => 41 [3] => 42 [4] => 43 [5] => 44 [6] => 334 [7] => 339 [8] => 338 [9] => 332 [10] => 333 [11] => 340 [12] => 341 [13] => 342 [14] => 348 [15] => 335 [16] => 336 [17] => 337 [18] => 343 [19] => 344 [20] => 345 [21] => 347 [22] => 346 [23] => 352 [24] => 349 [25] => 353 [26] => 350 [27] => 698 [28] => 755 [29] => 700 [30] => 702 [31] => 237 [32] => 757 [33] => 694 [34] => 696 [35] => 207 [36] => 127 [37] => 202 [38] => 203 [39] => 204 [40] => 201 [41] => 205 [42] => 206 [43] => 708 [44] => 710 [45] => 704 [46] => 706 [47] => 714 [48] => 759 [49] => 712 [50] => 760 ) 1 Array ( ) 1
        Роман
        20 августа 2020, 13:22
        0
        {set $cid = [17,358]}
        {if ($_modx->resource.id in $cid) || ($_modx->resource.parent in $_modx->getChildIds(17,2)) || ($_modx->resource.parent in $_modx->getChildIds(358,2))}{set $tel = "999999999999"}{else}{set $tel = "1111111111111"}{/if}
        <a href="tel:+{$tel}"> <i class="fa fa-phone"></i> {$tel}</a>
          Andrew
          20 августа 2020, 15:12
          0
          спасибо, но так тоже не хочет работать.
          работает если писать «in list», но видит дочерние документы только второго уровня вложенности, первый уровень не работает (на товарах меняет телефон, а на подкатегориях нет))
      Роман
      20 августа 2020, 12:25
      0
      Может, как-то так:
      {set $cid = [17,358]}
      {set $cparent = [17,39,40,41,42,43,44,358,406,407,408,409,410,411]}
      {if ($_modx->resource.id in $cid) || ($_modx->resource.parent in $cparent)}{set $tel = "999999999999"}{else}{set $tel = "1111111111111"}{/if}
      <a href="tel:+{$tel}"> <i class="fa fa-phone"></i> {$tel}</a>
        Andrew
        20 августа 2020, 12:53
        0
        О, спасибо, такой вариант рабочий:
        {set $cid = [17,358]}
        {set $cparent = [17,39,40,41,42,43,44,358,406,407,408,409,410,411]}
        {if ($_modx->resource.id in list $cid) || ($_modx->resource.parent in list $cparent)}{set $tel = "999999999999"}
        {else}
        {set $tel = "1111111111111"}
        {/if}
        <a href="tel:+{$tel}"> <i class="fa fa-phone"></i> {$tel}</a>
        но хотелось бы так, что бы не указывать дочерние ресурсы 39,40,41,42 и.т.д. прямо, так как категории могут добавляться… а указать самые родительские 17 и 358 и от них уже плясать..)
          Роман
          20 августа 2020, 13:18
          0
          Нужно сниппет написать, чтобы получать всех родителей, и уже потом проверять если он или нет.
          Сниппет примерно такой allParents:
          $patentId ='';
          $parentIds = array_reverse($modx->getParentIds($id, 10, array('context' => 'web')));
          if (isset($parentIds) && !empty($parentIds[1])) $patentId=$parentIds[1];
          return $patentId;
          Вызов примерно так:
          {set $cid = [17,358]}
          {set $cparent = $_modx->runSnippet('!allParents', [
              'id' => $_modx->resource.id,
          ])}
          {if ($_modx->resource.id in list $cid) || ($cparent in list $cid)}{set $tel = "999999999999"}
          {else}
          {set $tel = "1111111111111"}
          {/if}
          <a href="tel:+{$tel}"> <i class="fa fa-phone"></i> {$tel}</a>
          Прошу прощения не проверял. Возможно ошибки.
            Andrew
            20 августа 2020, 15:14
            0
            спасибо. позже попробую)
            изначально хотелось упростить)
        Andrew
        20 августа 2020, 15:24
        0
        В общем пока остановился на таком варианте, работает:
        {set $cid = [17,358]}
        {if ($_modx->resource.id in list $cid) || ($_modx->resource.id in list $_modx->getChildIds(17,2)) || ($_modx->resource.id in list $_modx->getChildIds(358,2))}
        <a href="tel:+999999999999"> <i class="fa fa-phone"></i> 999999999999</a>	  
        {else}
        <a href="tel:+1111111111111"> <i class="fa fa-phone"></i> 1111111111111</a>	 
        {/if}
        Всем огромнейшее спасибо!)
          Максим
          24 августа 2020, 18:39
          0
          Вопрос: а в каких случаях будет выводиться 1111111111111?
          Если правильно понял этот код, тогда везде выводится 1111111111111, кроме каталога и товаров внутри.
          Так? Тогда в в шаблоне каталога и товара написать нужный номер и всё.
          В Феном есть наследование шаблонов.
            Andrew
            25 августа 2020, 09:52
            0
            всё верно, тел 1111111111 будет выводится везде, кроме одного каталога (в двух разных контекстах), его подкаталогов и товаров внутри его подкаталогов.
            а в смысле в шаблоне каталога и товара?
            у меня это шаблон тоже состоит из частей, телефоны находятся в шапке и футере, это чанки header и footer, которые одинаковые для всех шаблонов.
            вот код шаблона для категории например:
            <!DOCTYPE html>
            <html lang="{$_modx->config.cultureKey}">
            <head>
                {include "file:chunks/base_meta.tpl"}
            </head>
            <body>
            <div class="wrapper">
                {include 'file:chunks/base_header.tpl'}
                <section id="category-grid">
                    <div class="container">
                        {block 'content'}
                        {/block}
                        {include 'file:chunks/base_category_sidebar.tpl'}
                    </div>
                </section>    
                {include 'file:chunks/base_footer.tpl'}   
            </div>
            {include 'file:chunks/base_scripts.tpl'}
            </body>
            </html>
            а для товара используется вообще базовый шаблон:
            <!DOCTYPE html>
            <html lang="{$_modx->config.cultureKey}">
            <head>
                {include 'file:chunks/base_meta.tpl'}
            </head>
            <body>
                <div class="wrapper">
            		{include 'file:chunks/base_header.tpl'}
            		{block 'content'}
            		{/block}
                    {include 'file:chunks/base_footer.tpl'}		
                </div>
                {include 'file:chunks/base_scripts.tpl'}
            </body>
            </html>
              Максим
              25 августа 2020, 12:33
              0
              Опять же если я правильно понимаю всю суть задачи, то можно вот так.

              Базовый шаблон:
              {block 'config'}
              	{set $config = [
              		'phone' = '99999999'
              	]}
              {/block}
              
              <!DOCTYPE html>
              <html lang="{$_modx->config.cultureKey}">
              	<head>
              	    {insert 'file:chunks/base_meta.tpl'}
              	</head>
              	<body>
              	    <div class="wrapper">
              	    	{block 'header'}
              			{insert 'file:chunks/base_header.tpl'}
              		{/block}
              		{block 'body'}
              			{block 'content'}{/block}
              		{/block}
              		{block 'footer'}
              	         	{insert 'file:chunks/base_footer.tpl'}
                      	{/block}
              	    </div>
              	    {insert 'file:chunks/base_scripts.tpl'}
              	</body>
              </html>

              Шаблон каталога/товара:
              {extends 'template:Базовый шаблон'}
              
              {block 'config'}
                  {set $config['phone'] = '111111111'}
              {/block}
              
              {block 'body'}
                  <section id="category-grid">
                      <div class="container">
                          {parent}
                          {insert 'file:chunks/base_category_sidebar.tpl'}
                      </div>
                  </section>  
              {/block}

              А в шапке (base_header.tpl) вставить в нужное место {$config.phone}
                Andrew
                25 августа 2020, 14:53
                0
                Интересный вариант, возьму на вооружение, спасибо.
          Максим
          24 августа 2020, 18:36
          0
          Не совсем понятна структура ресурсов.
          Контексты — это что? Это просто разные языки (т.е. в контекстах товары дублируются, но на разных языках)?
          Или контексты — это разные отделы, о которых идет речь (разные телефоны)?
          Или каждая категория — это разный отдел?
          Или как?

          Если структура такая:
          Общий каталог
          - каталог для 1-го отдела
          -- товар
          -- товар
          - каталог для 2-го отдела
          -- товар
          -- товар
          Тогда можно сделать ТВ у каталога и в шаблоне написать просто:
          {$_modx->resource.parent|resource:'tv_phone'}
            Andrew
            25 августа 2020, 09:55
            0
            предвидя подобные вопросы, даже картинку сделал… ташожтакое...)
              Максим
              25 августа 2020, 12:09
              0
              Так всегда. С твоей стороны кажется все понятно. А с моей не совсем, я нюансов многих не знаю.
              На картинке не понятно какой из ресурсов является отдельным отделом, для которых нужен отдельный телефон.
              Судя по коду вообще все ресурсы, которые на картинке должны иметь один и тот же телефон, а остальные другой.
            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
            18