Не выводится элемент в Smarty

258
02 мая 2017, 08:03

Здравствуйте!

Кто знаком со 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}
Answer 1

Так получается, поскольку условие 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}
Answer 2

$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}
READ ALSO
Как отправить данные из QLineEdit в БД по нажатию кнопки в Qt?

Как отправить данные из QLineEdit в БД по нажатию кнопки в Qt?

Есть программа, в которой три поля QLineEdit, в них пользователь записывает некую информацию

226
Не работает FindFirstFileA в WinApi в потоках

Не работает FindFirstFileA в WinApi в потоках

Поиск файлов по маске в каталогах, количество потоков меньше каталогов в 2 раза

269
Энтропия и её свойства [требует правки]

Энтропия и её свойства [требует правки]

Привет всем! Помогите решить задачуТекст: Дана последовательность

231
Ошибка в функции | C++

Ошибка в функции | C++

Если у меня есть эта функция в моей программе, я получаю сообщение "'error' was not declared in this scope"Какую библиотеку следует включить, чтобы мой код...

211