Как по другому вывести цикл, чтобы данные вносились в таблицу, а не дублировали её?

Есть вот такой цикл

while ($row = mysql_fetch_assoc($query)) {
    $tpl->set("{number}", $number++);
    $tpl->set("{id}", $row['id']);
    $tpl->set("{site_name}", $row['site_url']);
    
    if ($row['status'] == '1') {
        $tpl->set("{status}", 'Сайт работает');
        $tpl->set("{icon}", 'Сайт работает');
    }
    if ($row['status'] == '2') {
        $tpl->set("{status}", 'Сайт на модерации');
        $tpl->set("{icon}", 'fa fa-eye');
    }
    if ($row['status'] == '3') {
        $tpl->set("{status}", 'Сайт отключен');
        $tpl->set("{icon}", 'Сайт работает');
    }
    $tpl->load_template('main_user.tpl');
    $tpl->compile('content');
    $tpl->clear();
}


Затем я в шаблон main_user.tpl вывожу данные в таблицу:

<div class="panel panel-default">
    <!-- Default panel contents -->
    <div class="panel-heading">Мои сайты</div>

    <!-- Table -->
    <table class="table">
        <thead>
            <tr>
                <th>#</th>
                <th>Адрес сайта</th>
                <th>Статус</th>
                <th>Настройки</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>{number}</td>
                <td>{site_name}</td>
                <td><i class="{icon}"  title="{status}" data-placement="top" data-toggle="tooltip"></i></td>
                <td><a href="/cabinet/edit/{id}">Редактировать</a></td>
            </tr>

        </tbody>
    </table>
</div>


В данном случае у меня получается следующее:

1119dc8e12df431496fbc9fcf95d5c67.JPG

Хотя должно быть так:

f5eec38725264949ae11b631533cf391.JPG
  • Вопрос задан
  • 2489 просмотров
Пригласить эксперта
Ответы на вопрос 3
@link_irk
Вам нужно данные по строкам таблицы накапливать в массиве. И потом передавать уже этот массив в шаблон, где в цикле массив будет разбираться на строки таблицы. Или же выносить тело таблицы в отдельный подшаблон. И на каждую итерацию mysql_fetch_assoc создавать объект с этим шаблоном, парсить их, потом соединить в одну строковую переменную и передать основному шаблону уже готовый HTML в переменную вроде:
...
<tbody>
{sites_data}
</tbody>
...

Я вообще с шаблонизаторами не работаю. Но, полагаю, что у него должен быть механизм работы с подшаблонами. Изучите этот момент по документации к Вашему шаблонизатору
Ответ написан
FanatPHP
@FanatPHP
Чебуратор тега РНР
Не зачеркивать домен красными чернилами?

Ну или например можно выкинуть этот помоечный шаблонизатор в соответствующее место и использовать хотя бы native PHP

$statuses = [1 => "Сайт работает", "Сайт на модерации", "Сайт отключен"];
$data = [];
$number = 1;
while ($row = mysql_fetch_assoc($query)) {
    $row['stattext'] = $statuses[$row['status']];
    $row['number'] = $neumber++;
    $data[] = $row;
}
$tpl->set("data", $data);
$tpl->load_template('main_user.tpl');

Ну и шаблон
<div class="panel panel-default">
    <!-- Default panel contents -->
    <div class="panel-heading">Мои сайты</div>
    <!-- Table -->
    <table class="table">
        <thead>
            <tr>
                <th>#</th>
                <th>Адрес сайта</th>
                <th>Статус</th>
                <th>Настройки</th>
            </tr>
        </thead>
        <tbody>
<? foreach ($data as $row): ?>
            <tr>
                <td><?=$row['number']?></td>
                <td><?=$row['site_name']?></td>
                <td>
                    <i class="icon-<?=$row['status']?>"  
                     title="<?=$row['stattext']?>" 
                     data-placement="top" data-toggle="tooltip"></i>
                </td>
                <td><a href="/cabinet/edit/<?=$row['id']?>">Редактировать</a></td>
            </tr>
<?php endforeach ?>
        </tbody>
    </table>
</div>


К вопросу о старой байке про "дизайнера". Уже не первый десяток лет дремучие пользователи похапе рассказывают друг другу страшилки про Неизвестного Дизайнера, которого никто никогда не видел, но который до судорог боится РНР. И ради него изобретают самые уродливые шаблонизаторы, которыми в итоге неудобно пользоваться ни тому "дизайнеру", ни самому программисту.

При этом все замены сводяфтся к ОБФУСКАЦИИ.

Есть у нас, к примеру, блок кода, который надо повторять, пока есть данные.
В нормальном шаблонизаторе мы пишем что-нибудь вроде FOREACH, LOOP или подобное.
В кастрированном шаблонизаторе мы СКРЫВАЕМ назначение данного блока - а то не дай бог оператор цикла увидит "дизайнер" и у него тут же слвчится заворот мозгов! Поэтому мы пишем какую-нибудь ерунду типа <!-- section -->
При этому суть блока НЕ ИЗМЕНИЛАСЬ! Это остался тот же цикл. И для корректной верстки нужно понимать, что это цикл. Но узнать об этом неоткуда... кроме РНР кода контроллера! За что боролись - на то и напоролись.

По части суеверий похапе программисты будут почище средневековых крестьян.
Ответ написан
OlegLazarenko
@OlegLazarenko
Как-то вот так, хот не совсем понятно что за 'content' передается в $tpl->compile()

Цикл меняем вот так:
$tpl->load_template('main_user_thead.tpl');
$tpl->compile('content');
$tpl->clear();

while ($row = mysql_fetch_assoc($query)) {
    $tpl->set("{number}", $number++);
    $tpl->set("{id}", $row['id']);
    $tpl->set("{site_name}", $row['site_url']);
    
    if ($row['status'] == '1') {
        $tpl->set("{status}", 'Сайт работает');
        $tpl->set("{icon}", 'Сайт работает');
    }
    if ($row['status'] == '2') {
        $tpl->set("{status}", 'Сайт на модерации');
        $tpl->set("{icon}", 'fa fa-eye');
    }
    if ($row['status'] == '3') {
        $tpl->set("{status}", 'Сайт отключен');
        $tpl->set("{icon}", 'Сайт работает');
    }
    $tpl->load_template('main_user.tpl');
    $tpl->compile('content');
    $tpl->clear();
}

$tpl->load_template('main_user_tfoot.tpl');
$tpl->compile('content');
$tpl->clear();


Создаем файл шаблона main_user_thead.tpl с таким содержимым:
<div class="panel panel-default">
    <!-- Default panel contents -->
    <div class="panel-heading">Мои сайты</div>

    <!-- Table -->
    <table class="table">
        <thead>
            <tr>
                <th>#</th>
                <th>Адрес сайта</th>
                <th>Статус</th>
                <th>Настройки</th>
            </tr>
        </thead>
        <tbody>


Содержимое main_user.tpl меняем на такое:
<tr>
    <td>{number}</td>
    <td>{site_name}</td>
    <td><i class="{icon}"  title="{status}" data-placement="top" data-toggle="tooltip"></i></td>
    <td><a href="/cabinet/edit/{id}">Редактировать</a></td>
</tr>


И сооздаем файл шаблона main_user_tfoot.tpl с таким содержимым:
</tbody>
    </table>
</div>


Если бы была информация по классу, экземпларом которого является $tpl, можно было бы сказать больше. Возможно как-то можно передать объекту повторяющиеся данные, и не пришлось бы разбивать шаблон на 3 части.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы