Вывод суммы значений TV полей
Ребят, помогите чайнику пожалуйста. Мне нужно просто вывести в определенном месте шаблона сумму значений определенного TV поля по всем ресурсам. Создал вот такой сниппет:
[[!countArea?&parents=`5`&tvname=`certificateArea`]]
parents — 5 это номер ресурса родителя, в котором есть ресурсы с TV полем certificateArea.
Однако выводится 0. Хотя поля заполнены цифрами и тип ввода у этого поля — число.
<?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. Хотя поля заполнены цифрами и тип ввода у этого поля — число.
Комментарии: 4
Ну ты же получил объект ресурса в переменную, чтобы получить значение ТВ надо делать так $resource->getTVValue(tvname); А $modx->resource->getTVValue получает значение ТВ ресурса в котором ты вызываешь сниппет. И лучше конечно делать запрос в БД через newQuery и сразу получать сумму, а не вот это вот всё. Твой код прям сильно неоптимальный.
Проблема в том, что это не мой код, я его взял на просторах интернета. Сам я писать вообще не умею. И в оригинале там так и было:
$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
$resource = $modx->getObject('modResource', $id);
Спасибо! Всё сработало. Чуть дописал сниппет для возможности фильтрации и снова затык
$type = '1';
то тоже работает
Я так понимаю дело в синтаксисе, но я его победить так и не смог, что только не перепробовал. Знаний не хватает, примеры похожие не нашел ((
<?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';
то тоже работает
Я так понимаю дело в синтаксисе, но я его победить так и не смог, что только не перепробовал. Знаний не хватает, примеры похожие не нашел ((
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.