Проверка TV из сниппета
Здравствуйте. Подскажите пожалуйста. Есть ресурсы modx за ними закреплены три TV с фотографиями,
у всех есть как минимуму по одному заполненному TV, остальные как дополнительные, у каких-то ресурсов они заполнены, у каких-то нет. Хотелось бы написать небольшой сниппет, который будет смотреть, какие тв заполнены — те и выводить, а пустые пропускать. Некое подобие галереи. К сожалению знаний не хватает, вот пока какие-то наброски, хочу хотя бы получить список этих тв:
у всех есть как минимуму по одному заполненному TV, остальные как дополнительные, у каких-то ресурсов они заполнены, у каких-то нет. Хотелось бы написать небольшой сниппет, который будет смотреть, какие тв заполнены — те и выводить, а пустые пропускать. Некое подобие галереи. К сожалению знаний не хватает, вот пока какие-то наброски, хочу хотя бы получить список этих тв:
<?php
//Получаю id ресурса
$id = $modx->resource->get('id');
//Условие для выборки
$where = array(
'contentid' => $id
, 'tmplvarid:IN' => ["2,37,38"] // Можно ли так передать несколько tv для выборки?
);
//Получаю TV
$tv = $modx->getObject('modTemplateVarResource', $where);
//return $tv->get('value');
//Хочу проверить, пробежаться в цикле, посмотреть что навыбирало
//Тут выводится первое tv из условия
while($tv){
return $tv->get('value');
}
//Тут ничего не выводится
foreach($tv as $key){
return $key;
}
Подскажите, как можно реализовать такую задачу со своим сниппетом? Комментарии: 8
Вспомнилось что while для массивов не подходит, только foreach
Ну, типа такого.
Но лучше просто установить нормальную галерею и пользоваться ею.
Но лучше просто установить нормальную галерею и пользоваться ею.
$id = 1439;
$tvs = $modx->getCollection('modTemplateVarResource',[
'contentid' => $id,
'tmplvarid:IN' => [3,2]
]);
foreach ($tvs as $tv){
echo $tv->get('value');
}
Огромное спасибо, все работает!
Галерею ставить не хочется, потому что уже у 2к ресурсов заданы фото через TV, а теперь у некоторых ресурсов появляются по несколько фотографий, их будет не так много, не хочется перезакреплять все фотографии заново, по этому и хотелось какое-то простое решение=)
Галерею ставить не хочется, потому что уже у 2к ресурсов заданы фото через TV, а теперь у некоторых ресурсов появляются по несколько фотографий, их будет не так много, не хочется перезакреплять все фотографии заново, по этому и хотелось какое-то простое решение=)
Что в итоге получилось:
Сниппет checkImg:
Сниппет checkImg:
<?php
//Получаю id ресурса
$id = $modx->resource->get('id');
$tvInput = explode(',',$tvs);
$tvList = $modx->getCollection('modTemplateVarResource',[
'contentid' => $id,
'tmplvarid:IN' => $tvInput
]);
if (!empty($tvList))
{
echo '<div class="wrap">';
echo '<div class="wrap__header">';
echo '<span class="wrap__title">Фото</span>';
echo '</div>';
foreach ($tvList as $tv){
$v = $tv->get('value');
echo '<a class="fancybox gallery__thumbItem" rel="gallery1" href="' . $v . '" title="" data-fancybox="images">';
echo '<img src="' . $v . '" title="" alt="" itemprop="image" class="thumbsImg">';
echo '</a>';
}
echo '</div>';
}
Принимает TV:[[!checkImg? &tvs=`37,38,39,41`]]
Спасибо за помощь
Ай ай ай, плохо так делать, плохо :) Совсем не тру. Зашивать HTML в код сниппета это плохой тон в программировании сниппетов в MODX. Лучше сделать у сниппета настройку tpl и выводить данные в чанк.
Хотя бы так:
Хотя бы так:
<?php
//Получаю id ресурса
$id = $modx->resource->get('id');
$tvInput = explode(',',$tvs);
$tvList = $modx->getCollection('modTemplateVarResource',[
'contentid' => $id,
'tmplvarid:IN' => $tvInput
]);
if (!empty($tvList)){
if (!isset($tpl)){
$tpl = 'someshunk';
}
$output = '';
foreach ($tvList as $tv){
$v = $tv->get('value');
$output .= $modx->getChunk($tpl, [
'value' => $v
]);
}
}
return $output;
Код чанка: <a class="fancybox gallery__thumbItem" rel="gallery1" href="[[+value]]" title="" data-fancybox="images">
<img src="[[+value]]" title="" alt="" itemprop="image" class="thumbsImg"></a>
А вызывать, соответственно: <div class="wrap">
<div class="wrap__header">
<span class="wrap__title">Фото</span>
</div>
[[checkImg?&tpl=`somechunk`]]
</div>
могут быть ошибки, т.к. писал без проверки, но мысль 100% сохраняется)
Да, да, я за это тоже подумал, просто это «быстро» решение, у меня знаний мало, нужно было разбираться, как шаблоны передать, мог бы не успеть. Но так, как знаний у меня мало, то я как раз таки это все планирую переписать, тем самым обучится=)) Тут еще мне нужно аутер тпл сделать, для того что бы, если нет дополнительных фотографий не выводился и блок в целом, то есть вот это тоже нужно забрать в сниппет и не выводить если пусто, как-то так должно выглядеть:
<div class="wrap">
<div class="wrap__header">
<span class="wrap__title">Фото</span>
</div>
[[+inner]]
</div>
Делаете вторую настройку $tplOuter и точно так же через getChunk вставляете, ничего сложного. Вот тут я показывал пример с вложенностью чанков
Сделал с шаблонами
<?php
//Получаю id ресурса
$id = $modx->resource->get('id');
// Тв из сниппета
$tvInput = explode(',',$tvs);
//Номер фотографии, елси нужно указать в атрибуте alt
$idx = 0;
// Шаблоны из сниппета
$innerTpl = $innerTpl;
$outerTpl = $outerTpl;
//Результат на выход
$output = "";
$tvList = $modx->getCollection('modTemplateVarResource',[
'contentid' => $id,
'tmplvarid:IN' => $tvInput
]);
if (!empty($tvList)){
foreach ($tvList as $tv){
$v = $tv->get('value');
//Записываем на выход значение в плейсхолдер и запихиваем его в шаблон inner
$output .= $modx->getChunk($innerTpl, [
'value' => $v,
'idx' => ++$idx
]);
}
$output = $modx->getChunk($outerTpl, [
'inner' => $output
]);
}
return $output;
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.