Здравствуйте!
Кто знаком со Smarty? Помогите пожалуйста! Есть список постов и комменты к ним. Если в возвращаемом массиве комментов есть комментарий к посту, то он выводится, а если нет, то выводится форма добавления комментария. Комментарии выводятся, а вот там где нет комментария по идее должна отображаться форма, но почему-то не срабатывает.
{foreach $products as $item}
<h2><a href="/product/page/{$item['id']}/">{$item['title']}</a></h2>
{foreach $comments as $comment}
{if $comment['post_id'] == $item['id']}
<p>{$comment['content']}</p>
{/if}
{foreachelse}
<div id="blockNewComment">
<form
...
</form>
</div>
{/foreach}
{/foreach}
Так получается, поскольку условие foreachelse
здесь не корректно. Оно ведь сработает, только в том случае, когда у вас вообще пустой массив comments
, а вы хотите узнать, есть ли комменты для данного продукта (с нужным comment['post_id']
).
Вообще основная проблема тут в том, что вы на уровне представления пытаетесь решать задачи логики, это не совсем корректно. По хорошему в пхп-коде должны извлечь продукты и комменты к ним, так чтобы каждый продукт имел свои комментарии $item.comments
. Поэтому тут два пути, лучшим будет на уровне логики сначала распихать комментарии куда надо, а потом выводить. Второй вариант, использовать другие проверки вместоforeachelse
.
Первый примерно так:
Сначала подготавливаете данные
$products = getAllProducts();
$comments = getComment($userID);
$model = [];
foreach($products as $p){
$pid = $p['id'];
$model[$pid] = $p;
foreach($comments as $idx => $c){
if($c['post_id'] != $pid) continue;
$model[$pid']['comments'][] = $c;
}
}
$smarty->assign('model', $model);
и выводите (проверок на соответствие id уже нет):
{foreach $model as $p}
<h2>{$p.title}</h2>
{foreach $p.comments as $c}
<p>{$c.content}</p>
{foreachelse}
.....
{/foreach}
{/foreach}
Второй вариант - модифицировать ваше представление следующим образом, добавив переменную $hasComments
{foreach $products as $item}
<h2><a href="/product/page/{$item['id']}/">{$item['title']}</a></h2>
{$hasComments = 0}
{foreach $comments as $comment}
{if $comment['post_id'] == $item['id']}
<p>{$comment['content']}</p>
{$hasComments++}
{/if}
{/foreach}
{if !$hasComments}
<div id="blockNewComment">
<form
...
</form>
</div>
{/if}
{/foreach}
$comments
это что? элемент $item
? Тогда надо так:
{foreach $products as $item}
{foreach $item.comments as $comment}
{if $comment['post_id'] == $item['id']}
<p>{$comment['content']}</p>
{/if}
{foreachelse}
...
{/foreach}
{/foreach}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Есть программа, в которой три поля QLineEdit, в них пользователь записывает некую информацию
Поиск файлов по маске в каталогах, количество потоков меньше каталогов в 2 раза
Привет всем! Помогите решить задачуТекст: Дана последовательность
Если у меня есть эта функция в моей программе, я получаю сообщение "'error' was not declared in this scope"Какую библиотеку следует включить, чтобы мой код...