Здравствуйте!
Кто знаком со 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}
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости