Создала сниппет showcategories:
<?php
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 1);
$str = str_replace('##', '|', $input);
$str = str_replace('#', '', $str);
$arr = explode('|', $str);
foreach($arr as $id){
$res = $modx->getObject('modResource', $id);
$pagetitle = $res->get('pagetitle');
$uri = $res->get('uri');
$out .= '<a href="'.$uri.'">'.$pagetitle.'</a> ';
}
return $out;
В чанке вывожу таким образом:
[[+tv.sposobi:showcategories]]
На сайте выдает такую ошибку:
Notice: Undefined variable: out in .../core/cache/includes/elements/modsnippet/12.include.cache.php on line 11
Fatal error: Call to a member function get() on null in .../core/cache/includes/elements/modsnippet/12.include.cache.php on line 9
Вы можете подсказать как исправить эти ошибки? Спасибо!
Игорь Сухинин 21.01.2018 23:11 #
Вообще говоря, это не ошибка. Это предупреждение о том, что переменная не была определена. Хорошим правилом считается предопределять все переменные. Ну или поменяйте правила вывода ошибок в error_reporting, исключив E_NOTICE, хотя все же лучше инициализировать переменную перед циклом foreach. Например, как-то так
Тут посложнее, это на самом деле критическая ошибка. Дело в том, что у Вас происходит попытка вызова метода get() к переменной, которая не является объектом: $res->get('pagetitle');
А получается это так потому, что вот эта строчка $modx->getObject('modResource', $id); возвращает null в строгом соответствии документации api.modx.com/revolution/2.2/#getObject. По каким-то причинам данный ресурс не находится… И уже вопрос, почему он не находится. Там выше у Вас в коде какие-то смутные процедуры производятся. Я думаю, там и надо искать проблему.
Зуля 22.01.2018 07:46 #
Спасибо, что ответили.
В TV sposobi (список множественный выбор) у меня так:
Если этот TV в чанке вывожу так: , то на сайте отображаются #5#||#8#||#9#||#6#||#7#, а должно, чтобы отображались ресурсы с их url-ами вместо этих # и ||.
А при использовании: , та ошибка фатал.
Игорь Сухинин 22.01.2018 09:36 #
Мы получаем массив такого вида
Как видно из примера выше, каждый второй элемент массива — пустой.
Во-первых, очевидно, что есть ошибка в Ваших заменах символов строки.
Во-вторых, всегда имеет смысл проверять возвращаемые значения. Например, переменную $res стоит проверять на null, раз уж согласно документации данный метод может его возвращать. Таким образом, надо дополнить в цикле проверкой как-то так
Я даже почти уверен, что если Вы дополните такой проверкой свой код, то ничего больше исправлять не придется, т.к. нулевые результаты будут уже игнорироваться… Но это не лучший подход. Все-таки надо исправить код так, чтобы в массив не попадали пустые элементы.
Павел Романов 22.01.2018 10:32 #
То есть если в шаблоне так: [[*sposobi]], то выводится: и все работает.
Если надо выводить в чанке pdoResources или аналога, то там TV обрабатываются иначе и выводится дополнительно разделитель ||.
Соответственно, в сниппете надо их сперва убрать:
Зуля 22.01.2018 14:12 #
Спасибо вам за помощь! Вопрос решен!