Вызов сниппета из сниппета и параметры

Привет! Помогите пожалуйста разобраться, сам не могу осилить.

Есть вот такой сниппет:
<?php
$values = array();
$ids = $modx->runSnippet('pdoResources', array(
	 'parents' => $parents,
	 'limit' => 0,
	 'returnIds' => 1,
	 'includeTVs' => 'certificateBuildingType',
	 'tvFilters' => 'certificateBuildingType=='. $type

));
$resources = explode(',', $ids);
foreach($resources as $id){
	 $resource = $modx->getObject('modResource', $id);
	 $tv = $resource->getTVValue($tvname);
	 if(is_numeric($tv)) $values[] = $tv;
}
$out = array_sum($values); 
return $out;

Вот эта строка не работает
'tvFilters' => 'certificateBuildingType=='. $type
Вызываю так:
[[!countArea?&parents=`5`&tvname=`certificateArea`&type=`1`]]
Если напрямую написать
'tvFilters' => 'certificateBuildingType=='.'1'
То работает. Если в самом начале написать:
$type = 1;
то тоже работает

Почему-то параметр &type=`1` из вызова не передается.
Algirdas
02 августа 2021, 20:59
modx.pro
2 649
0

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

Баха Волков
02 августа 2021, 22:58
+1
$modx->log(level, string)
в помощь
    Algirdas
    02 августа 2021, 23:35
    0
    Чот вот так
    $modx->log(1, print_r($array, 1),'HTML');
    пробовал в начале конструкции вставлять, ничего не выводится дополнительно к тому что должно.

    А так когда не срабатывает в целом, страница не загружается и ругается таким образом:

    Fatal error: Uncaught Error: Call to a member function getTVValue() on null in C:\bla-bla\core\cache\includes\elements\modsnippet\34.include.cache.php:15 Stack trace: #0 C:\bla-bla\core\model\modx\modscript.class.php(76): include() #1 C:\bla-bla\core\model\modx\modparser.class.php(537): modScript->process(NULL) #2 C:\bla-bla\core\components\pdotools\model\pdotools\pdoparser.class.php(273): modParser->processTag(Array, true) #3 C:\bla-bla\core\model\modx\modparser.class.php(251): pdoParser->processTag(Array, true) #4 C:\bla-bla\core\components\pdotools\model\pdotools\pdoparser.class.php(65): modParser->processElementTags('', '<!DOCTYPE html>...', true, false, '[[', ']]', Array, 9) #5 C:\bla-bla\core\model\modx\modresource.class.php(546): pdoParser->processElementTags('', '<!DOCTYPE html>...', true, false, '[[', ']]', Array, 10) #6 C:\bla-bla\core\model\modx\modresou in C:\bla-bla\core\cache\includes\elements\modsnippet\34.include.cache.php on line 15
    Сергей Шлоков
    03 августа 2021, 08:31
    +1
    А какое количество ресурсов возвращает первый сниппет? Максимально. Просто интересно оценить размер, так сказать, ущерба.
      Algirdas
      03 августа 2021, 10:38
      0
      У меня там всего около 5-6 тестовых ресурсов, у них у всех есть поле в котором находится цифра. Плагин эти цифры просто складывает и выводит сумму значений всех полей
        Algirdas
        03 августа 2021, 10:55
        0
        Если вы имели ввиду на сколько много будет ресурсов, поля в которых надо пересчитать, то на первое время не более 100 штук
        Роман
        03 августа 2021, 09:21
        +1
        Попробуйте так передать, может в базе ищется, как строка.
        'tvFilters' => 'certificateBuildingType=='. intval($type)
        Может быстрее будет, если сделать такой запрос, вместо перебора:
        SELECT SUM(value) as sum FROM `modx_site_tmplvar_contentvalues` WHERE tmplvarid='2'
          Algirdas
          03 августа 2021, 10:42
          0
          Неа, так тоже не сработало. Вот такая конструкция работает:

          <?php
          
          $values = array();
          $type = "1";
          $ids = $modx->runSnippet('pdoResources', array(
          	 'parents' => $parents,
          	 'limit' => 0,
          	 'returnIds' => 1,
          	 'includeTVs' => 'certificateBuildingType',
          	 'tvFilters' => 'certificateBuildingType=='.$type
          
          ));
          $resources = explode(',', $ids);
          foreach($resources as $id){
          	 $resource = $modx->getObject('modResource', $id);
          	 $tv = $resource->getTVValue($tvname);
          	 if(is_numeric($tv)) $values[] = $tv;
          }
          $out = array_sum($values); 
          
          return $out;
          То есть я так понимаю без разницы в каком виде передается цифра. Что интересно, значение $parents которое берется из вызова сниппета передается нормально, а вот с $type почему-то так же не работает. Это ломает мне мозг.
            Роман
            03 августа 2021, 11:05
            0
            Попробуй передавать не type, а какую-то другую переменную.
            $modx->log(1, $type);
          Наумов Алексей
          03 августа 2021, 10:45
          +1
          А что выводит?
          print_r($scriptProperties);
            Algirdas
            03 августа 2021, 10:51
            0
            <?php
            $values = array();
            $type = "1";
            $ids = $modx->runSnippet('pdoResources', array(
            	 'parents' => $parents,
            	 'limit' => 0,
            	 'returnIds' => 1,
            	 'includeTVs' => 'certificateBuildingType',
            	 'tvFilters' => 'certificateBuildingType=='.$type
            
            ));
            $resources = explode(',', $ids);
            foreach($resources as $id){
            	 $resource = $modx->getObject('modResource', $id);
            	 $tv = $resource->getTVValue($tvname);
            	 if(is_numeric($tv)) $values[] = $tv;
            }
            $out = array_sum($values); 
            print_r($scriptProperties);
            return $out;
            Мне кажется я не правильно им воспользовался. Если так вставлять, то просто перестает считать и вместо цифры выводит NaN. Я чайник (facepalm)
            Andrey
            03 августа 2021, 17:41
            0
            А так?
            <?php
            $values = array();
            $vtype = $modx->getOption('type', $scriptProperties, 123, true);
            $ids = $modx->runSnippet('pdoResources', array(
            	 'parents' => $parents,
            	 'limit' => 0,
            	 'returnIds' => 1,
            	 'includeTVs' => 'certificateBuildingType',
            	 'tvFilters' => 'certificateBuildingType==' . $vtype
            
            ));
            $resources = explode(',', $ids);
            foreach($resources as $id){
            	 $resource = $modx->getObject('modResource', $id);
            	 $tv = $resource->getTVValue($tvname);
            	 if(is_numeric($tv)) $values[] = $tv;
            }
            $out = array_sum($values); 
            return $out;
              Andrey
              03 августа 2021, 22:18
              1
              0
              123 — значение по умолчанию, если параметра нет. Можно и без этого, просто:
              $vtype = $modx->getOption('type', $scriptProperties);
              Или вообще может такое закостылить:
              $type = $type;
              :D
                Algirdas
                25 августа 2021, 15:55
                0
                Спасибо! Сработал первый вариант :)
              Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
              13