То для шаблонизатора(!) просто нужно, чтоб в шаблоне было просто: Код (Text): <h1>Новости</h1><br> {repeat:news} Новость: {news[title]}<br> Текст: {news[text]}<br> {/repeat} Как такое реализовать?
Chaser PHP: <h1>Новости</h1> <? while ($news = mysql_fetch_assoc ($Query)) { ?> Новость: <?=$news['title'];?><br /> Текст: <?=$news['text'];?> <? } ?>
Chaser Это понятно Просто бессмысленно. РНР сам по себе хороший шаблонизатор. А идеальных шаблонов нет. Потом вам надо будет вставить еще что-то, еще какую-то функцию. Да и время на парсинг уходит.
Мне кажется это миф. Как раз сейчас пытаюсь вопрос шаблонизации по полочкам разложить. Вот предпринял попытку: http://pyha.ru/forum/topic/659.0 Были бы интересны мнения на этот счет.
Стоит различать PHP как шаблонизатор, и PHP как язык программирования. Одно дело, когда в вперемешку идут PHP и HTML, а другое, когда в HTML идут вставки простых конструкций PHP. PHP: <h1>Новости</h1> <?php foreach ($this->news as $news):?> Новость: <?php print $news['title']?><br /> Текст: <?php print $news['text']?> <?php endforeach?>
Chaser Мне в шаблоне не нужно много функций, хватит только аналога foreach и пары методов вывода переменных.
Ну я же собственно сослался на свою статью, где есть такой пример. Ну могу сюда откопировать: <table cellpadding="3"> <tr> <td><b>Спартак</b></td> <td><b>Зенит</b></td> <td><b>Шинник</b></td> </tr> <tr> <td>Москва<br><br></td> <td>Санкт-Петербург<br><br></td> <td>Ярославль<br><br></td> </tr> <tr> <td><b>Сатурн</b></td> <td><b>Луч</b></td> </tr> <tr> <td>Раменское<br><br></td> <td>Владивосток<br><br></td> </tr> </table>
PHP: <?php $newEventIds = array(); foreach($vacancy as $v){ ?> <div class="event-item read"> <div style="float: left; width: 15%; font-size: 89%;"> <img width="25" align="absmiddle" src="http://site_name/pix/user_avatar/sm2.jpg"/> <?=$v->getPosition()->getName()?> </div> <div style="float: left; width: 65%;"> <div><?=$v->getDescription()?></div> </div> <div style="float: left; width: 15%; text-align: right; font-size: 89%;"> <?=TimestampHelper::create($v->getCreated())->toPrintDateTime(true, true)?><br/> <? if (SecurityManager::isAdminOrOwner($this->user)) :?> <a href="<?=$this->makeUrl('editVacancy', array('action'=>'edit', 'nick'=>$this->user->getNick(), 'vid'=>$v->getId()))?>">редактировать</a><br/> <a href="<?=$this->makeUrl('editVacancy', array('action'=>'delete', 'nick'=>$this->user->getNick(), 'vid'=>$v->getId()))?>">удалить</a> <? endif; ?> </div> <div style="float: left; width: 5%; text-align: center;"> <input type="checkbox" value="308" name="event308" class="event_check"/> </div> <div class="cl"></div> </div> <? } ?> Достаточно сложный?
Мне кажется нет. Но, уже заметная каша из PHP и HTML. Но главное, тут все же обходится одним циклом с прямым перебором сущностей, а я привел пример, что бывают случаи когда это невозможно.
PHP: <?php $team_rows = array( array('name' => 'Спартак', 'city' => 'Москва'), array('name' => 'Зенит', 'city' => 'Санкт-Петербург'), array('name' => 'Шинник', 'city' => 'Ярославль'), array('name' => 'Сатурн', 'city' => 'Раменское'), array('name' => 'Луч', 'city' => 'Владивосток') ); $teams = array(); foreach ($team_rows as $k => $v) { $teams[floor($k / 3)]['name'][] = $v['name']; $teams[floor($k / 3)]['city'][] = $v['city']; } ?> <table> <?php foreach ($teams as $team):?> <tr> <?php foreach ($team['name'] as $name):?> <td><b><?php print $name?></b></td> <?php endforeach?> </tr> <tr> <?php foreach ($team['city'] as $city):?> <td><?php print $city?></td> <?php endforeach?> </tr> <?php endforeach?> </table>
AlexB, пример-то некорректный. В двух строках по 3 ячейки, в двух - по 2... А вообще это делается for ($i = 0; $i < count($teams); $i++) { echo '<tr><td>'.$teams[$i]['name'].'</td><td>'.$teams[$i+1]['name']... и т.д. Если не подготовить данные в контроллере, то вначале можно пройтись по массиву и недостающие элементы в массиве заполнить 'ми.
Или так: PHP: <?php $teams = array( array('name' => 'Спартак', 'city' => 'Москва'), array('name' => 'Зенит', 'city' => 'Санкт-Петербург'), array('name' => 'Шинник', 'city' => 'Ярославль'), array('name' => 'Сатурн', 'city' => 'Раменское'), array('name' => 'Луч', 'city' => 'Владивосток') ); function table($rows, $count) { $res = array(); foreach ($rows as $k => $v) { foreach ($v as $field => $value) { $res[floor($k / $count)][$field][] = $value; } } return $res; } ?> <table> <?php foreach (table($teams, 3) as $team):?> <tr> <?php foreach ($team['name'] as $name):?> <td><b><?php print $name?></b></td> <?php endforeach?> </tr> <tr> <?php foreach ($team['city'] as $city):?> <td><?php print $city?></td> <?php endforeach?> </tr> <?php endforeach?> </table>
Sergey89 Да неплохое решение, спасибо, надо принять к сведению. Но все же не смущает, что одна банальная табличка уже ведет к написанию целых кусков скрипта в шаблоне, введению промежуточных циклов, промежуточных массивов, вложенных циклов? Ведь реальная верстка может содержать еще кучу наворотов. Т.е. о простых конструкциях уже не приходится говорить.
Ну пример то приведен упрощенный. Конечно можно предварительно дополнить данные, до кратного числу стобцов количества. Чтоб не перегружать код это опущено. Но разговор-то не об этом.
Т.е. часть HTML кода уйдет из шаблона, если я правильно понял? Хорошо ли это? И возможно ли их написать на все возможные варианты верстки, коих бесконечность?
А можно ли обойтись без php кода в шаблоне, и просто написать? Код (Text): <h1>Новости</h1><br> {repeat:news} Новость: {news[title]}<br> Текст: {news[text]}<br> {/repeat}