Объясните pls, странное поведение простого массива
Сочиняю сниппет для вывода списка TV в виде таблицы, где выводятся не только значения TV но и их caption.
Пришел к такому решению:
Вариант 1. работает отлично. Выводит таблицу с CAPTION и VALUE каждого TV.
При использовании варианта 2 выводятся только CAPTION нужных тв-параметров (строки 12, 13 в коде),
а VALUE (строка 15) не выводится.
Если вывести оба варианта массива через print_r, можно увидеть, что они идентичны до знака.
В чем тогда между ними разница?
Озадачен и обескуражен. Теперь не знаю как в сниппет передать список TV для вывода.
Пришел к такому решению:
<?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 для вывода.
Комментарии: 6
$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;
}
1. Вызов
2. За проверку существования id спасибо — я уже столкнулся с этой проблемой, но отложил её на потом.
$arr = array_map('trim', explode(',', $ids));
в поведении сниппета ничего не поменял. Пробелов в строке не было. 2. За проверку существования id спасибо — я уже столкнулся с этой проблемой, но отложил её на потом.
Странно.
Попробуй заменить
Попробуй заменить
$val = $modx->resource->getTVValue($tvID);
на $val = $captionTv->renderOutput($modx->resource->id);
Этот вариант сработал. А теперь не могли бы вы объяснить, что делает эта строка? :))))))
Да тоже самое, только не со стороны ресурса, а со стороны TV.
Можно, например, и так.
Можно, например, и так.
$val = $captionTv->getValue($modx->resource->id);
Но тогда значение получится необработанное. Т.е. вместо картинки — путь, вместо даты — timestamp и т.п.
как все сложно :)
насколько я понимаю, на момент срабатывания вашей строки $captionTv содержит в себе данные конкретного TV из таблицы modx_site_tmplvars
а ваша строка
выводит значение этого TV, в текущем ресурсе, которое хранится совсем в другой таблице — modx_site_tmplvar_contentvalues
насколько я понимаю, на момент срабатывания вашей строки $captionTv содержит в себе данные конкретного TV из таблицы modx_site_tmplvars
а ваша строка
$val = $captionTv->renderOutput($modx->resource->id);
выводит значение этого TV, в текущем ресурсе, которое хранится совсем в другой таблице — modx_site_tmplvar_contentvalues
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.