Умный цикл foreach

у меня проблема с smarty, на самом деле я не могу зациклить данные, которые я собрал из БД.

Это функция getreputation.

function getreputation($username)
{
global $rDB;

$rows = $rDB->select('
    SELECT *
    FROM account_reputation
    WHERE username=?
    ORDER BY id DESC
    ',
    $username
);

foreach($rows as $row)
{
    $reputation = array();
    $reputation['user'] = $row['username'];
    $reputation['reputation'] = $row['reputation'];
    $reputation['action'] = $row['reason'];
    $reputation['date'] = $row['date'];
}

return $reputation;
}

Вот как я назначаю эту функцию tpl

$smarty->assign('reputation', getreputation($page['username']));

И, наконец, это цикл foreach

{foreach from=$reputation item=reputation}
<tr><td width="33%"><center>
{if $reputation.action == 1}Registering an account
{elseif $reputation.action == 2}Daily visit
{elseif $reputation.action == 3}Posting a comment
{elseif $reputation.action == 4}Your comment was voted up (each upvote)
{elseif $reputation.action == 5}Submitting a screenshot
{elseif $reputation.action == 6}Submitting a guide (approved)
{elseif $reputation.action == 7}Earning a <font color="brown">Copper</font> <a href="/?website-achievements">website achievement</a>
{elseif $reputation.action == 8}Earning a Silver <a href="/?website-achievements">website achievement</a>
{elseif $reputation.action == 9}Earning a <font color="gold">Gold</font> <a href="/?website-achievements">website achievement</a>
{else}Achievement not found
{/if}
</center></td><td width="33%">
<center><font color='green'>+{$reputation.reputation}
</font></center></td><td width="33%"><center>
{$reputation.date}
</center></td></tr>
{/foreach}

Все, что я вижу, это Основной вывод сайта foreach

Итак, вывод foreach совершенно неверен. Может ли кто-нибудь помочь мне решить эту проблему?


person Ivan Zhivolupov    schedule 16.02.2013    source источник
comment
Используйте другую переменную для item. {foreach from=$reputation item=rep} и доступ как $rep.action в цикле.   -  person Michael Berkowski    schedule 16.02.2013
comment
Вы проверили значение репутации через {debug} где-то в своем шаблоне Smarty?   -  person Niko    schedule 16.02.2013
comment
@Niko да, я проверил, все загружается в tpl как надо, проблема в foreach   -  person Ivan Zhivolupov    schedule 16.02.2013
comment
@MichaelBerkowski уже пробовал это, но безрезультатно, результаты все еще отображаются, как на картинке.   -  person Ivan Zhivolupov    schedule 16.02.2013


Ответы (1)


Прежде всего, ваша PHP-функция, которую вы разместили здесь, никогда не вернет более одной строки, поскольку вы все время перезаписываете значение $reputation.

function getreputation($username) {
    global $rDB;
    $rows = $rDB->select('SELECT * FROM account_reputation WHERE username=? ORDER BY id DESC', $username);

    // Initialize the array that will be filled with the single rows
    $reputation = array();
    foreach($rows as $row) {
        // Create a temporal variable with a different name
        $rep = array();
        $rep['user'] = $row['username'];
        $rep['reputation'] = $row['reputation'];
        $rep['action'] = $row['reason'];
        $rep['date'] = $row['date'];

        // Add this array to the other one
        $reputation[] = $rep;
    }

    return $reputation;
}

Затем в вашем коде Smarty вы должны использовать другое имя переменной для текущего элемента (как предложил Майкл Берковски):

{foreach from=$reputation item=rep}
    <tr><td width="33%"><center>
    {if $rep.action == 1}Registering an account
    {elseif $rep.action == 2}Daily visit
    etc...
    {else}Achievement not found
    {/if}
    </center></td>

    <td width="33%"><center><font color='green'>+{$rep.reputation}
    </font></center></td>
    <td width="33%"><center>{$rep.date}</center></td>
    </tr>
{/foreach}
person Niko    schedule 16.02.2013