За последние 24 часа нас посетили 18057 программистов и 1700 роботов. Сейчас ищут 1498 программистов ...

Шаблонизатор. Опять. Нужен совет.

Тема в разделе "PHP для новичков", создана пользователем Koc, 21 мар 2008.

Статус темы:
Закрыта.
  1. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Вот и юзай foreach. Нафига эти извращения?
     
  2. sword dancer

    sword dancer Активный пользователь

    С нами с:
    17 фев 2008
    Сообщения:
    295
    Симпатии:
    0
  3. Chaser

    Chaser Активный пользователь

    С нами с:
    18 ноя 2007
    Сообщения:
    39
    Симпатии:
    0
    То для шаблонизатора(!) просто нужно, чтоб в шаблоне было просто:
    Код (Text):
    1.  
    2. <h1>Новости</h1><br>
    3. {repeat:news}
    4. Новость: {news[title]}<br>
    5. Текст: {news[text]}<br>
    6. {/repeat}
    7.  
    Как такое реализовать?
     
  4. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Chaser
    Посмотрите проект XmlTemplatesLanguage, возможно это то что Вам нужно
     
  5. Chaser

    Chaser Активный пользователь

    С нами с:
    18 ноя 2007
    Сообщения:
    39
    Симпатии:
    0
    topas
    Негде его не нашел... Если можно, в крацах, обясните его суть.
     
  6. Elkaz

    Elkaz Старожил
    Команда форума Модератор

    С нами с:
    26 июн 2006
    Сообщения:
    3.373
    Симпатии:
    0
    Адрес:
    Баку, Азербайджан
    Chaser
    PHP:
    1.  
    2. <h1>Новости</h1>
    3. <? while ($news = mysql_fetch_assoc ($Query)) { ?>
    4. Новость: <?=$news['title'];?><br />
    5. Текст: <?=$news['text'];?>
    6. <? } ?>
    7.  
     
  7. Chaser

    Chaser Активный пользователь

    С нами с:
    18 ноя 2007
    Сообщения:
    39
    Симпатии:
    0
    Elkaz
    Я хочу обойтись без использования php кода в шаблоне.
     
  8. Elkaz

    Elkaz Старожил
    Команда форума Модератор

    С нами с:
    26 июн 2006
    Сообщения:
    3.373
    Симпатии:
    0
    Адрес:
    Баку, Азербайджан
    Chaser
    Это понятно :) Просто бессмысленно.
    РНР сам по себе хороший шаблонизатор. А идеальных шаблонов нет. Потом вам надо будет вставить еще что-то, еще какую-то функцию. Да и время на парсинг уходит.
     
  9. AlexB

    AlexB Активный пользователь

    С нами с:
    2 дек 2006
    Сообщения:
    12
    Симпатии:
    0
    Мне кажется это миф. Как раз сейчас пытаюсь вопрос шаблонизации по полочкам разложить. Вот предпринял попытку:
    http://pyha.ru/forum/topic/659.0
    Были бы интересны мнения на этот счет.
     
  10. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Стоит различать PHP как шаблонизатор, и PHP как язык программирования. Одно дело, когда в вперемешку идут PHP и HTML, а другое, когда в HTML идут вставки простых конструкций PHP.
    PHP:
    1.  
    2. <h1>Новости</h1>
    3. <?php foreach ($this->news as $news):?>
    4. Новость: <?php print $news['title']?><br />
    5. Текст: <?php print $news['text']?>
    6. <?php endforeach?>
    7.  
     
  11. Chaser

    Chaser Активный пользователь

    С нами с:
    18 ноя 2007
    Сообщения:
    39
    Симпатии:
    0
    Chaser
    Мне в шаблоне не нужно много функций, хватит только аналога foreach и пары методов вывода переменных.
     
  12. AlexB

    AlexB Активный пользователь

    С нами с:
    2 дек 2006
    Сообщения:
    12
    Симпатии:
    0
    А если требуемый HTML достаточно сложен, чтоб обойтись простыми конструкциями?
     
  13. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Что значит достаточно сложен? Пример бы...
     
  14. AlexB

    AlexB Активный пользователь

    С нами с:
    2 дек 2006
    Сообщения:
    12
    Симпатии:
    0
    Ну я же собственно сослался на свою статью, где есть такой пример. Ну могу сюда откопировать:

    <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>
     
  15. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    PHP:
    1. <?php
    2. $newEventIds = array();
    3. foreach($vacancy as $v){
    4.     ?>
    5.     <div class="event-item read">
    6.         <div style="float: left; width: 15%; font-size: 89%;">
    7.             <img width="25" align="absmiddle" src="http://site_name/pix/user_avatar/sm2.jpg"/>
    8.             <?=$v->getPosition()->getName()?>
    9.         </div>
    10.         <div style="float: left; width: 65%;">
    11.             <div><?=$v->getDescription()?></div>
    12.         </div>
    13.         <div style="float: left; width: 15%; text-align: right; font-size: 89%;">
    14.             <?=TimestampHelper::create($v->getCreated())->toPrintDateTime(true, true)?><br/>
    15.             <? if (SecurityManager::isAdminOrOwner($this->user)) :?>
    16.                 <a href="<?=$this->makeUrl('editVacancy', array('action'=>'edit', 'nick'=>$this->user->getNick(), 'vid'=>$v->getId()))?>">редактировать</a><br/>
    17.                 <a href="<?=$this->makeUrl('editVacancy', array('action'=>'delete', 'nick'=>$this->user->getNick(), 'vid'=>$v->getId()))?>">удалить</a>
    18.             <? endif; ?>
    19.         </div>
    20.         <div style="float: left; width: 5%; text-align: center;">
    21.             <input type="checkbox" value="308" name="event308" class="event_check"/>
    22.         </div>
    23.         <div class="cl"></div>
    24.     </div>
    25.     <?
    26. }
    27. ?>
    28.  
    Достаточно сложный?
     
  16. AlexB

    AlexB Активный пользователь

    С нами с:
    2 дек 2006
    Сообщения:
    12
    Симпатии:
    0
    Мне кажется нет. Но, уже заметная каша из PHP и HTML.
    Но главное, тут все же обходится одним циклом с прямым перебором сущностей, а я привел пример, что бывают случаи когда это невозможно.
     
  17. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    PHP:
    1. <?php
    2. $team_rows = array(
    3.     array('name' => 'Спартак', 'city' => 'Москва'),
    4.     array('name' => 'Зенит', 'city' => 'Санкт-Петербург'),
    5.     array('name' => 'Шинник', 'city' => 'Ярославль'),
    6.     array('name' => 'Сатурн', 'city' => 'Раменское'),
    7.     array('name' => 'Луч', 'city' => 'Владивосток')
    8. );
    9.  
    10. $teams = array();
    11.  
    12. foreach ($team_rows as $k => $v) {
    13.     $teams[floor($k / 3)]['name'][] = $v['name'];
    14.     $teams[floor($k / 3)]['city'][] = $v['city'];
    15. }
    16. ?>
    17. <table>
    18. <?php foreach ($teams as $team):?>
    19.     <tr>
    20.     <?php foreach ($team['name'] as $name):?>
    21.         <td><b><?php print $name?></b></td>
    22.     <?php endforeach?>
    23.     </tr>
    24.     <tr>
    25.     <?php foreach ($team['city'] as $city):?>
    26.         <td><?php print $city?></td>
    27.     <?php endforeach?>
    28.     </tr>
    29. <?php endforeach?>
    30. </table>
     
  18. Clone

    Clone Guest

    AlexB, пример-то некорректный. В двух строках по 3 ячейки, в двух - по 2... А вообще это делается for ($i = 0; $i < count($teams); $i++) { echo '<tr><td>'.$teams[$i]['name'].'</td><td>'.$teams[$i+1]['name']... и т.д. Если не подготовить данные в контроллере, то вначале можно пройтись по массиву и недостающие элементы в массиве заполнить &nbsp;'ми.
     
  19. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Или так:
    PHP:
    1. <?php
    2. $teams = array(
    3.     array('name' => 'Спартак', 'city' => 'Москва'),
    4.     array('name' => 'Зенит', 'city' => 'Санкт-Петербург'),
    5.     array('name' => 'Шинник', 'city' => 'Ярославль'),
    6.     array('name' => 'Сатурн', 'city' => 'Раменское'),
    7.     array('name' => 'Луч', 'city' => 'Владивосток')
    8. );
    9.  
    10. function table($rows, $count) {
    11.     $res = array();
    12.  
    13.     foreach ($rows as $k => $v) {
    14.         foreach ($v as $field => $value) {
    15.             $res[floor($k / $count)][$field][] = $value;
    16.         }
    17.     }
    18.  
    19.     return $res;
    20. }
    21. ?>
    22. <table>
    23. <?php foreach (table($teams, 3) as $team):?>
    24.     <tr>
    25.     <?php foreach ($team['name'] as $name):?>
    26.         <td><b><?php print $name?></b></td>
    27.     <?php endforeach?>
    28.     </tr>
    29.     <tr>
    30.     <?php foreach ($team['city'] as $city):?>
    31.         <td><?php print $city?></td>
    32.     <?php endforeach?>
    33.     </tr>
    34. <?php endforeach?>
    35. </table>
     
  20. AlexB

    AlexB Активный пользователь

    С нами с:
    2 дек 2006
    Сообщения:
    12
    Симпатии:
    0
    Sergey89
    Да неплохое решение, спасибо, надо принять к сведению.

    Но все же не смущает, что одна банальная табличка уже ведет к написанию целых кусков скрипта в шаблоне, введению промежуточных циклов, промежуточных массивов, вложенных циклов?

    Ведь реальная верстка может содержать еще кучу наворотов. Т.е. о простых конструкциях уже не приходится говорить.
     
  21. AlexB

    AlexB Активный пользователь

    С нами с:
    2 дек 2006
    Сообщения:
    12
    Симпатии:
    0
    Ну пример то приведен упрощенный. Конечно можно предварительно дополнить данные, до кратного числу стобцов количества. Чтоб не перегружать код это опущено. Но разговор-то не об этом.
     
  22. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Это всё решается за счёт хелперов. Один раз пишешь, потом используешь.
     
  23. AlexB

    AlexB Активный пользователь

    С нами с:
    2 дек 2006
    Сообщения:
    12
    Симпатии:
    0
    Т.е. часть HTML кода уйдет из шаблона, если я правильно понял? Хорошо ли это? И возможно ли их написать на все возможные варианты верстки, коих бесконечность?
     
  24. Chaser

    Chaser Активный пользователь

    С нами с:
    18 ноя 2007
    Сообщения:
    39
    Симпатии:
    0
    А можно ли обойтись без php кода в шаблоне, и просто написать?
    Код (Text):
    1.  
    2. <h1>Новости</h1><br>
    3. {repeat:news}
    4. Новость: {news[title]}<br>
    5. Текст: {news[text]}<br>
    6. {/repeat}
     
  25. Clone

    Clone Guest

    Chaser, у тебя фобия php в шаблонах? Ты хочешь поговорить об этом?:)))
     
Статус темы:
Закрыта.