Получение tv из дочерних ресурсов

Стуктура страниц сайта на MOD REVO:

Москва
-рыба
-пиво
-кальмары
Киров
-рыба
-пиво
-кальмары
Ростов
-рыба
-пиво
-кальмары
в Москва, Киров, Ростов есть tv *tovar_forel_chekbox, *tovar_shuka_chekbox, *tovar_kit_chekbox

Чанк один, в нем условие:
[[*tovar_forel_chekbox:is=`1`:then=`есть форель`]]
[[*tovar_shuka_chekbox:is=`1`:then=`есть щука`]]
[[*tovar_kit_chekbox:is=`1`:then=`есть кит`]]

Проблема, не могу получить на вложенных страницах -рыба, -пиво, -кальмары значение tv: *tovar_forel_chekbox, *tovar_shuka_chekbox, *tovar_kit_chekbox.

Пробовал сниппет
<?php
$resource = $modx->resource;
$tvName = $modx->getOption('tvName', $scriptProperties, '');
if (empty($tvName)) {
    return '';
}
$tvValue = $resource->getTVValue($tvName);
if ($tvValue == 1) {
    return 1;
}
$parent = $modx->getObject('modResource', $resource->get('parent'));
if ($parent) {
    $parentTVValue = $parent->getTVValue($tvName);
    if ($parentTVValue == 1) {
        return 1;
    }
}
return '';

Вызываю в чанке:
    [[If?
    &subject=`[[checkTV? &tvName=`tovar_forel_chekbox`]]`
    &operator=`EQ`
    &operand=`1`
    &then=`есть форель`
]]

[[If?
    &subject=`[[checkTV? &tvName=`tovar_shuka_chekbox`]]`
    &operator=`EQ`
    &operand=`1`
    &then=`есть щука`
]]

[[If?
    &subject=`[[checkTV? &tvName=`tovar_kit_chekbox`]]`
    &operator=`EQ`
    &operand=`1`
    &then=`есть кит`
]]
Не получается получить &then=`` ни на главной ни на вложенной с таким сниппетом.
Игорь
01 августа 2023, 19:55
modx.pro
1
477
0

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

Игорь
02 августа 2023, 09:58
0
Помогите решить проблему…
Нужно такое условие…
[[#[[*parent]].tovar_kit_chekbox:is=`1` или *tovar_kit_chekbox:is=`1`:then=``]]
    Павел Романов
    02 августа 2023, 11:50
    0
    Если сами TV-шки называются «есть щука», «есть форель» и «есть кит», то так:
    <?php
    $docid = $modx->getOption('docid', $scriptProperties, $resource->get('id'));
    $tvs = explode(',', $tvs);
    $out = array();
    foreach($tvs as $tv){
    	if(!$tvo = $modx->getObject('modTemplateVar', array('name' => trim($tv)))) continue;
    	if(!$tvres = $modx->getObject('modTemplateVarResource', array('tmplvarid' => $tvo->get('id'),'contentid' => $docid, 'value' => 1))) continue;
    	$out[] = $tvo->get('caption');
    }
    return implode(', ', $out);

    Вызов один:
    [[checkTV?
        &docid=`[[*parent]]` //если на дочерних
        &tvs = `tovar_forel_chekbox,tovar_shuka_chekbox,tovar_kit_chekbox`
    ]]
      Игорь
      02 августа 2023, 14:07
      0
      Я немного ушел в сторону.

      Сниппет getTV:
      <?php
      // Получить родительский ресурс
      $parentResource = $modx->getObject('modResource', $modx->resource->get('parent'));
      
      if ($parentResource) {
          // Получить все TV у родительского ресурса
          $parentTvs = $parentResource->getTemplateVars();
          
          foreach($parentTvs as $tv) {
              // Проверить, существует ли такая переменная у текущего ресурса
              $currentTv = $modx->getObject('modTemplateVar', ['name' => $tv->get('name')]);
              if ($currentTv) {
                  // Получить значение родительского TV
                  $parentValue = $tv->getValue($parentResource->get('id'));
                  // Установить значение родительского TV для текущего ресурса
                  $currentTv->setValue($modx->resource->get('id'), $parentValue);
                  $currentTv->save();
              }
          }
            
      }
      в шаблоне вызова так:
      [[$vitrina]]
      [[getTV]]

      Проблема осталась что иногда по не понятным причинам один TV не всегда получает значение…
      а именно:

      [[*city_phone_whatsapp:isnot=``:then=`вывод текста`]]
        Игорь
        02 августа 2023, 14:23
        0
        если использую
        [[If? &is=`[[*city_phone_whatsapp]]`:then=`вывод текста`]],
        ничего не выводит
          Павел Романов
          02 августа 2023, 16:07
          0
          Вам нужно проверять стоит ли в определенных TV у родительского ресурса «1» и если стоит, то выводить их название?
          • Для чего получать все TV родителя?
          • Зачем прописывать текущему ресурсу родительские TV?

          Сделайте как я написал выше — это универсальное решение.

          Если требуется выводить не название TV а какой-то произвольный текст, то можете так:
          <?php
          $docid = $modx->getOption('docid', $scriptProperties, $resource->get('id'));
          $tvs = json_decode($tvs,1);
          $out = array();
          foreach($tvs as $tv => $name){
          	if(!$tvo = $modx->getObject('modTemplateVar', array('name' => trim($tv)))) continue;
          	if(!$tvres = $modx->getObject('modTemplateVarResource', array('tmplvarid' => $tvo->get('id'),'contentid' => $docid, 'value' => 1))) continue;
          	$out[] = $name;
          }
          return implode(', ', $out);

          А в вызове указывайте для какой TV какой текст выводить:
          [[checkTV?
              &tvs = `{ "tovar_forel_chekbox":"форель","tovar_shuka_chekbox":"щука","tovar_kit_chekbox":"кит" }`
              &docid=`[[*parent]]`
          ]]
        Ivan
        02 августа 2023, 19:30
        0
        [[!#[[*parent]].tovar_forel_chekbox:ne=‘’:then=‘hello’]]

        Писал с телефона. Кавычки исправите.
          Игорь
          02 августа 2023, 21:41
          0
          Спасибо кто откликнулся и за помощь)) Сработал свой костыль Сниппет getTV + js (подстановка номера через поиск на странице и замену пустого значения).

          в шаблоне вызова так:
          [[!getTV]]
          [[!$vitrina]]
            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
            7