Объясните pls, странное поведение простого массива

Сочиняю сниппет для вывода списка TV в виде таблицы, где выводятся не только значения TV но и их caption.

Пришел к такому решению:

<?php
print '<tr><td colspan="2"><h1>'.$title.'</h1></td></tr>'; // Просто заголовок таблицы

// ВАРИАНТ 1. Создаю массив со списком id TV-переменных, которые нужно вывести
$arr = array (25,26,27); 

// ВАРИАНТ 2. Создаю тот-же массив из параметра $ids, который заполняю в вызове сниппета.
//$arr = explode(',', $ids); 

foreach ($arr as $tvID) {  // Перебираю TV, указанные в массиве

$captionTv = $modx->getObject('modTemplateVar', $tvID); // Получаю данные TV из таблицы modx_site_tmplvars
$captionVal = $captionTv->get("caption");  // Вытаскиваю значения параметра caption из полученных данных 

$val = $modx->resource->getTVValue($tvID); // Получаю значения TV

print '<tr><td>'.$captionVal.'</td><td>'.$val.'</td></tr>'; //Вывожу то и другое
}
ПРОБЛЕМА:

Вариант 1. работает отлично. Выводит таблицу с CAPTION и VALUE каждого TV.

При использовании варианта 2 выводятся только CAPTION нужных тв-параметров (строки 12, 13 в коде),
а VALUE (строка 15) не выводится.

Если вывести оба варианта массива через print_r, можно увидеть, что они идентичны до знака.
В чем тогда между ними разница?
Озадачен и обескуражен. Теперь не знаю как в сниппет передать список TV для вывода.
anatol
10 апреля 2015, 09:49
modx.pro
1 487
0

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

Василий Наумкин
10 апреля 2015, 13:37
+2
$arr = explode(',', $ids);
Здесь передаётся строка и в ней запросто может быть лишний пробел.

Я делаю так:
$arr = array_map('trim', explode(',', $ids));

Ну и дальше нужно добавить проверку, иначе при неверном id будет fatal error:
if ($captionTv = $modx->getObject('modTemplateVar', $tvID)) {
	$captionVal = $captionTv->get("caption");
	$val = $modx->resource->getTVValue($tvID);
	print '<tr><td>'.$captionVal.'</td><td>'.$val.'</td></tr>';
}
else {
	print 'Не могу получить ТВ c id = ' .  $tvID;
}
    anatol
    10 апреля 2015, 13:57
    0
    1. Вызов
    $arr = array_map('trim', explode(',', $ids));
    в поведении сниппета ничего не поменял. Пробелов в строке не было.
    2. За проверку существования id спасибо — я уже столкнулся с этой проблемой, но отложил её на потом.
    Сергей Шлоков
    10 апреля 2015, 13:42
    +1
    Странно.
    Попробуй заменить
    $val = $modx->resource->getTVValue($tvID);
    на
    $val = $captionTv->renderOutput($modx->resource->id);
      anatol
      10 апреля 2015, 13:58
      0
      Этот вариант сработал. А теперь не могли бы вы объяснить, что делает эта строка? :))))))
        Сергей Шлоков
        10 апреля 2015, 14:03
        +1
        Да тоже самое, только не со стороны ресурса, а со стороны TV.
        Можно, например, и так.
        $val = $captionTv->getValue($modx->resource->id);
        Но тогда значение получится необработанное. Т.е. вместо картинки — путь, вместо даты — timestamp и т.п.
          anatol
          10 апреля 2015, 14:35
          0
          как все сложно :)
          насколько я понимаю, на момент срабатывания вашей строки $captionTv содержит в себе данные конкретного TV из таблицы modx_site_tmplvars
          а ваша строка
          $val = $captionTv->renderOutput($modx->resource->id);

          выводит значение этого TV, в текущем ресурсе, которое хранится совсем в другой таблице — modx_site_tmplvar_contentvalues
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      6