За последние 24 часа нас посетили 21940 программистов и 1721 робот. Сейчас ищут 862 программиста ...

Привет простейший чистый шаблонизатор

Тема в разделе "PHP для новичков", создана пользователем siiXth, 26 апр 2011.

  1. siiXth

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

    С нами с:
    14 мар 2010
    Сообщения:
    1.447
    Симпатии:
    1
    Нет никакого желания мешать php с хтмл и пересмотрев массу кое-каких шаблонизаторов пришёл к выводу что они либо мешают его хоть и немного , либо меня не устраивает сложная реализация , запись и т.д

    У меня же index.php
    PHP:
    1. <?
    2. include_once('engine/functions.php');
    3. $design=file_get_contents('tpl/main.tpl');
    4. $random=rand(1,100);
    5. $design=tpl_set("{random_number}",$random,$design);
    6. echo $design;
    7. ?>
    functions.php

    PHP:
    1. <?
    2. function tpl_set($search,$replace,$design)
    3. {
    4.     $result=str_replace($search,$replace,$design);
    5.     return $result;
    6.     }
    7. ?>
    собстно норм ?
    ну и думаю понятно что в подключаемых разделах в любых файлах напишу
    $design=tpl_set("{privet}",$privet,$design);
    и тег заменится. но вот я подумал что я постоянно буду прогонять каждый раз весь шаблон через эту ф-цию , это адекватно ? ))
     
  2. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    а циклы и условные операторы?
     
  3. siiXth

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

    С нами с:
    14 мар 2010
    Сообщения:
    1.447
    Симпатии:
    1
    ам
    зачем ?
     
  4. titch

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

    С нами с:
    18 дек 2010
    Сообщения:
    847
    Симпатии:
    0
    ну... взять хотя бы таблицы с чередующимися по цвету полями (цикл)... или активная/неактивная ссылка в меню (условие)
     
  5. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    siiXth

    Скажу общеизвестную банальность, но видимо уместную в данном случае - задача шаблонизатора не в отделении php от html, а в отделении логики приложения от логики представления

    Логика представления может и на чистом php быть написана.

    например дефолтный шаблон из Yii (просто на русский переведен)

    PHP:
    1.  
    2. <?php
    3. $this->pageTitle=Yii::app()->name . ' - Контакты';
    4. ?>
    5.  
    6. <h2>Заявка</h2>
    7.  
    8. <?php if(Yii::app()->user->hasFlash('contact')): ?>
    9.  
    10. <div class="flash-success">
    11.     <?php echo Yii::app()->user->getFlash('contact'); ?>
    12. </div>
    13.  
    14. <?php else: ?>
    15.  
    16. <p>
    17. Если у Вас есть вопрос к нашей компании - воспользуйтесь формой обратной связи. Спасибо.
    18. </p>
    19.  
    20. <div class="form">
    21.  
    22. <?php $form=$this->beginWidget('CActiveForm'); ?>
    23.  
    24.     <p class="note">Поля, отмеченные звездочкой <span class="required">*</span>, обязательны к заполнению.</p>
    25.  
    26.     <?php echo $form->errorSummary($model); ?>
    27.  
    28.     <div class="row">
    29.         <?php echo $form->labelEx($model,'name'); ?>
    30.         <?php echo $form->textField($model,'name'); ?>
    31.     </div>
    32.  
    33.     <div class="row">
    34.         <?php echo $form->labelEx($model,'email'); ?>
    35.         <?php echo $form->textField($model,'email'); ?>
    36.     </div>
    37.  
    38.     <div class="row">
    39.         <?php echo $form->labelEx($model,'subject'); ?>
    40.         <?php echo $form->textField($model,'subject',array('size'=>60,'maxlength'=>128)); ?>
    41.     </div>
    42.  
    43.     <div class="row">
    44.         <?php echo $form->labelEx($model,'body'); ?>
    45.         <?php echo $form->textArea($model,'body',array('rows'=>6, 'cols'=>50)); ?>
    46.     </div>
    47.  
    48.     <?php if(CCaptcha::checkRequirements()): ?>
    49.     <div class="row">
    50.         <?php echo $form->labelEx($model,'verifyCode'); ?>
    51.         <div>
    52.         <?php $this->widget('CCaptcha'); ?>
    53.         <?php echo $form->textField($model,'verifyCode'); ?>
    54.         </div>
    55.         <div class="hint">Пожалуйста, введите символы, изображенные на картинке.
    56.         <br/>Буквы не чувствительны к регистру.</div>
    57.     </div>
    58.     <?php endif; ?>
    59.  
    60.     <div class="row buttons">
    61.         <?php echo CHtml::submitButton('Отправить'); ?>
    62.     </div>
    63.  
    64. <?php $this->endWidget(); ?>
    65.  
    66. </div><!-- form -->
    67.  
    68. <?php endif; ?>
    69.  
    Легко заметить, что тут перемешан php с html, но ни в коем случае не примешана логика приложения.
    А вот эти строки -
    PHP:
    1. <?php if(Yii::app()->user->hasFlash('contact')): ?>
    2.  
    3. <div class="flash-success">
    4.     <?php echo Yii::app()->user->getFlash('contact'); ?>
    5. </div>
    6.  
    7. <?php else: ?>
    чистая логика отображения, которой не место в контроллере
     
  6. siiXth

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

    С нами с:
    14 мар 2010
    Сообщения:
    1.447
    Симпатии:
    1
    та ёпт :D
    как делаются cms-подобные сооружения - я в курсе :D только в некоторых местах - в теории =(
    вот собственно накатал апдейт

    это обрезанный код , показывающий только суть замены тегов в подключаемом шаблоне
    PHP:
    1. <?
    2. ###Подключаем ф-ции. Среди них замена тегов
    3. include_once('engine/functions.php');
    4.  
    5. ###Берём в переменную(!) наш шаблон
    6. $design=file_get_contents('tpl/main.tpl');
    7.  
    8. ###Перечисляем "что на что"
    9. $buffer=tpl_set("{login0}",11,$buffer);
    10. $buffer=tpl_set("{login1}",12,$buffer);
    11. $buffer=tpl_set("{login2}",13,$buffer);
    12.  
    13. ###Заменяем все "что" на все "что"
    14. $content=compile($buffer,$design);
    15.  
    16. ###Выводим
    17. echo $content;
    18. ?>
    functions.php

    PHP:
    1. <?php
    2. ###Ф-ция "запоминания" "что на что" по одному массиву с принципом - запомнить что "меняем" ключ(что) на значение(на что)
    3. function tpl_set($search,$replace,$buffer)
    4. {
    5.     if(isset($buffer)){
    6.     $result=$buffer+array($search=>$replace);
    7.     }
    8.     else
    9.     $result=array($search=>$replace);
    10. ###Каждый раз присылается массив со старыми key/value и складываются с новыми
    11.     return $result;
    12.     }
    13.  
    14. function compile($buffer,$design)
    15. {
    16. ###Тот самый полученный массив из "что на что" разбиваем на два новых
    17.     foreach($buffer as $key=>$value)
    18.         {
    19.             $search[]=$key;
    20.            
    21.             $replace[]=$value;
    22.        
    23.         }
    24. ###и заменяем их в нашем шаблоне
    25.     $result=str_replace($search,$replace,$design);
    26.     return $result;
    27.     }
    28. ?>
    комментарии как для нубов написал , беее :D

    и так - это нормально ? просто я конечно дубина безООПшная , но то что мне нужно получить я вроде получаю =)
     
  7. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    приведи пример шаблона
     
  8. siiXth

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

    С нами с:
    14 мар 2010
    Сообщения:
    1.447
    Симпатии:
    1
    ну я люблю именно тупо разделять , уже видно сильно привык к этому =) просто у меня проблем даже подобных не возникало =)
     
  9. siiXth

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

    С нами с:
    14 мар 2010
    Сообщения:
    1.447
    Симпатии:
    1
    HTML:
    1. <table border="1" width="100px" height="100px">
    2. <tr><td>{login0}</td></tr>
    3. <tr><td>{login1}</td></tr>
    4. <tr><td>{login2}</td></tr>
     
  10. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    siiXth

    т.е. если у меня логинов не 3, а 10 - переписывать шаблон?
     
  11. siiXth

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

    С нами с:
    14 мар 2010
    Сообщения:
    1.447
    Симпатии:
    1
    ААААААААААААААААА
    та что вы прицепились к этому ? :D
    я ж для тестов весь текст пишу , зачем мне заморачиваться и на тестах чтото придумывать ? )

    ну а реально если нужно 10 логинов
    в шаблоне
    HTML:
    1. <table border="1" width="100px" height="100px">
    2. {login}
    3.  </table>
    в пхп
    PHP:
    1.  
    2. <?
    3. $i=0;
    4. while($i!=10){
    5. $i++;
    6. $login.="<tr><td>{login".$i."}</td></tr>";
    7. }
    8.  $buffer=tpl_set("{login}",$login,$buffer);
    9. ?>
    10.  
    или это так сложно вносить изменения и там и там ? ))) я кажись менее опытный большинства тут , но мне реально это не проблема ) или как надо ? - в шаблоне логику менять ? тоесть надо теперь уже 15 логинов и ты пойдёшь в шаблон ? помоему это более нелогично =)
    да и темболее даже я уже много проработал напару с двумя "верстальщиками"-долбоё... они блин с тегами чудили херь , а если б в шаблонах было б пхп , то я бы поехал по домам их распиливать штопором =D у меня от них alert(1) не работал даже xD

    и мне так никто ответ и не дал - валидно , нет ..)) мне лично так проще без пхп в хтмл , да и темболее увлекусь и пихну мускул запрос в инпут хайден ;)
     
  12. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    siiXth

    Ок, а если мне надо те же данные в XML отдать - получается помимо шаблона придется править вывод из контроллера.

    А при традиционном подходе - я изменю шаблон и всё.

    Цикл - может быть логикой представления. Обычный foreach - и я могу передать хоть 5 хоть 10000 логинов.
     
  13. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    А почему бы тогда не
    PHP:
    1.  <?
    2.  $i=0;
    3.  $login = '<table border="1" width="100px" height="100px">';
    4.  while($i!=10){
    5.  $i++;
    6.  $login.="<tr><td>{login".$i."}</td></tr>";
    7.  }
    8.  $login .= '</table>';
    9.   $buffer=tpl_set("{login}",$login,$buffer);
    10.  ?>
    HTML:
    1. {login}
    А то чего уж мелочиться то.
     
  14. titch

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

    С нами с:
    18 дек 2010
    Сообщения:
    847
    Симпатии:
    0
    фу... ты опять всё смешал. так сказать, перемешал логику представления и логику приложения. вернись назад. а еще погугли. видел сверхлегкие шаблонизаторы до 50кб. функционал весьма неплохой. код прозрачный, разобраться сможешь

    upd: вот аналог того, что ты написал: http://forum.dklab.ru/viewtopic.php?t=16364
     
  15. Alex_pac

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

    С нами с:
    11 апр 2011
    Сообщения:
    285
    Симпатии:
    1
    Адрес:
    Россия, Тольятти
    не мешай!
    php отдельно и шаблон отдельно.

    когда шаблон у тебя будет готов, используй свой "транслятор" для преобразования и сохранения шаблона из

    HTML:
    1.  
    2. {content}
    3.  
    4. </body>

    в php вид

    HTML:
    1.  
    2. <?php echo $content; ?>
    3.  
    4. </body>
     
  16. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    Alex_pac И получи свой велосипедный Smarty ))))
     
  17. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    siiXth
    чувак, не сдавайся. Пусть твоя кровь уже вся черна от чумы шаблонизаторов, но ты хоть можешь умереть достойно...

    отделять надо логику от отрисовки. И то не всегда. А шаблонизаторы - для ДЕБИЛОВ которые не могут разобраться с пхп.
     
  18. Alex_pac

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

    С нами с:
    11 апр 2011
    Сообщения:
    285
    Симпатии:
    1
    Адрес:
    Россия, Тольятти
    то есть создавать шаблоны с <?php echo ?> скобками обычное дело любого php кодера
     
  19. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Alex_pac
    ну если это единственный способ который он знает - да, дело плохо.

    гораздо лучший способ - проявить себя как оуэнного мачо от пхп - написать свой язык для работы с текстом для языка для работы с текстом. ТруЪ!
     
  20. Alex_pac

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

    С нами с:
    11 апр 2011
    Сообщения:
    285
    Симпатии:
    1
    Адрес:
    Россия, Тольятти
    igordata , вы не поняли, я действительно рассматриваю концепцию шаблонов на <?php echo ?> скобках как вполне достойную для проектирования приложений на php
     
  21. Gromo

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

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    siiXth
    http://www.php.ru/forum/viewtopic.php?t=28531

    пхп сам по себе и есть шаблонизатор. просто, как и сказал tommyangelo, первичная задача шаблонизатора - отделить логику представления от логику приложения. и только!

    Задача приложения сводится к тому, чтобы отдать данные шаблонизатору, и уже сам шаблонизатор, в зависимости от шаблона, сформирует тебе HTML, XML, CSV или всё что захочешь.
     
  22. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ну хз. мне такой синтаксис не нравится. хотя он нравится всем остальным. Я предпочитаю ставить двойные кавычки, и в них фигачить сразу как можно больший кусок.
     
  23. Alex_pac

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

    С нами с:
    11 апр 2011
    Сообщения:
    285
    Симпатии:
    1
    Адрес:
    Россия, Тольятти
    скажу вам один недостаток подхода через кавычки: блокнот не раскрашивает код который там, как html разметку.
     
  24. titch

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

    С нами с:
    18 дек 2010
    Сообщения:
    847
    Симпатии:
    0
    скажу вам один недостаток блокнота. он не предназнаен для программирования, а для записывания рецептов прогрессивных молодых мам