Вывод суммы значений TV полей

Ребят, помогите чайнику пожалуйста. Мне нужно просто вывести в определенном месте шаблона сумму значений определенного TV поля по всем ресурсам. Создал вот такой сниппет:

<?php
$values = array();
$ids = $modx->runSnippet('pdoResources', array(
	 'parents' => $parents,
	 'limit' => 0,
	 'returnIds' => 1
));
$resources = explode(',', $ids);
foreach($resources as $id){
	 $resource = $modx->getObject($id);
	 $tv = $modx->resource->getTVValue($tvname);
	 if(is_numeric($tv)) $values[] = $tv;
}
$out = array_sum($values); 
return $out;
Вызываю его вот так:
[[!countArea?&parents=`5`&tvname=`certificateArea`]]

parents — 5 это номер ресурса родителя, в котором есть ресурсы с TV полем certificateArea.
Однако выводится 0. Хотя поля заполнены цифрами и тип ввода у этого поля — число.
Algirdas
24 июля 2021, 16:51
modx.pro
97
0

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

Артур
24 июля 2021, 22:33
+1
Ну ты же получил объект ресурса в переменную, чтобы получить значение ТВ надо делать так $resource->getTVValue(tvname); А $modx->resource->getTVValue получает значение ТВ ресурса в котором ты вызываешь сниппет. И лучше конечно делать запрос в БД через newQuery и сразу получать сумму, а не вот это вот всё. Твой код прям сильно неоптимальный.
    Algirdas
    25 июля 2021, 15:15
    0
    Проблема в том, что это не мой код, я его взял на просторах интернета. Сам я писать вообще не умею. И в оригинале там так и было:

    $tv = $resource->getTVValue($tvname);
    Но в таком случае у меня выдает ошибку:

    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:11 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 11
      Баха Волков
      25 июля 2021, 15:48
      +1
      $resource = $modx->getObject('modResource', $id);
        Algirdas
        01 августа 2021, 15:47
        0
        Спасибо! Всё сработало. Чуть дописал сниппет для возможности фильтрации и снова затык

        <?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';
        то тоже работает

        Я так понимаю дело в синтаксисе, но я его победить так и не смог, что только не перепробовал. Знаний не хватает, примеры похожие не нашел ((
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    4