Нет никакого желания мешать php с хтмл и пересмотрев массу кое-каких шаблонизаторов пришёл к выводу что они либо мешают его хоть и немного , либо меня не устраивает сложная реализация , запись и т.д У меня же index.php PHP: <? include_once('engine/functions.php'); $design=file_get_contents('tpl/main.tpl'); $random=rand(1,100); $design=tpl_set("{random_number}",$random,$design); echo $design; ?> functions.php PHP: <? function tpl_set($search,$replace,$design) { $result=str_replace($search,$replace,$design); return $result; } ?> собстно норм ? ну и думаю понятно что в подключаемых разделах в любых файлах напишу $design=tpl_set("{privet}",$privet,$design); и тег заменится. но вот я подумал что я постоянно буду прогонять каждый раз весь шаблон через эту ф-цию , это адекватно ? ))
ну... взять хотя бы таблицы с чередующимися по цвету полями (цикл)... или активная/неактивная ссылка в меню (условие)
siiXth Скажу общеизвестную банальность, но видимо уместную в данном случае - задача шаблонизатора не в отделении php от html, а в отделении логики приложения от логики представления Логика представления может и на чистом php быть написана. например дефолтный шаблон из Yii (просто на русский переведен) PHP: <?php $this->pageTitle=Yii::app()->name . ' - Контакты'; ?> <h2>Заявка</h2> <?php if(Yii::app()->user->hasFlash('contact')): ?> <div class="flash-success"> <?php echo Yii::app()->user->getFlash('contact'); ?> </div> <?php else: ?> <p> Если у Вас есть вопрос к нашей компании - воспользуйтесь формой обратной связи. Спасибо. </p> <div class="form"> <?php $form=$this->beginWidget('CActiveForm'); ?> <p class="note">Поля, отмеченные звездочкой <span class="required">*</span>, обязательны к заполнению.</p> <?php echo $form->errorSummary($model); ?> <div class="row"> <?php echo $form->labelEx($model,'name'); ?> <?php echo $form->textField($model,'name'); ?> </div> <div class="row"> <?php echo $form->labelEx($model,'email'); ?> <?php echo $form->textField($model,'email'); ?> </div> <div class="row"> <?php echo $form->labelEx($model,'subject'); ?> <?php echo $form->textField($model,'subject',array('size'=>60,'maxlength'=>128)); ?> </div> <div class="row"> <?php echo $form->labelEx($model,'body'); ?> <?php echo $form->textArea($model,'body',array('rows'=>6, 'cols'=>50)); ?> </div> <?php if(CCaptcha::checkRequirements()): ?> <div class="row"> <?php echo $form->labelEx($model,'verifyCode'); ?> <div> <?php $this->widget('CCaptcha'); ?> <?php echo $form->textField($model,'verifyCode'); ?> </div> <div class="hint">Пожалуйста, введите символы, изображенные на картинке. <br/>Буквы не чувствительны к регистру.</div> </div> <?php endif; ?> <div class="row buttons"> <?php echo CHtml::submitButton('Отправить'); ?> </div> <?php $this->endWidget(); ?> </div><!-- form --> <?php endif; ?> Легко заметить, что тут перемешан php с html, но ни в коем случае не примешана логика приложения. А вот эти строки - PHP: <?php if(Yii::app()->user->hasFlash('contact')): ?> <div class="flash-success"> <?php echo Yii::app()->user->getFlash('contact'); ?> </div> <?php else: ?> чистая логика отображения, которой не место в контроллере
та ёпт как делаются cms-подобные сооружения - я в курсе только в некоторых местах - в теории =( вот собственно накатал апдейт это обрезанный код , показывающий только суть замены тегов в подключаемом шаблоне PHP: <? ###Подключаем ф-ции. Среди них замена тегов include_once('engine/functions.php'); ###Берём в переменную(!) наш шаблон $design=file_get_contents('tpl/main.tpl'); ###Перечисляем "что на что" $buffer=tpl_set("{login0}",11,$buffer); $buffer=tpl_set("{login1}",12,$buffer); $buffer=tpl_set("{login2}",13,$buffer); ###Заменяем все "что" на все "что" $content=compile($buffer,$design); ###Выводим echo $content; ?> functions.php PHP: <?php ###Ф-ция "запоминания" "что на что" по одному массиву с принципом - запомнить что "меняем" ключ(что) на значение(на что) function tpl_set($search,$replace,$buffer) { if(isset($buffer)){ $result=$buffer+array($search=>$replace); } else $result=array($search=>$replace); ###Каждый раз присылается массив со старыми key/value и складываются с новыми return $result; } function compile($buffer,$design) { ###Тот самый полученный массив из "что на что" разбиваем на два новых foreach($buffer as $key=>$value) { $search[]=$key; $replace[]=$value; } ###и заменяем их в нашем шаблоне $result=str_replace($search,$replace,$design); return $result; } ?> комментарии как для нубов написал , беее и так - это нормально ? просто я конечно дубина безООПшная , но то что мне нужно получить я вроде получаю =)
ну я люблю именно тупо разделять , уже видно сильно привык к этому =) просто у меня проблем даже подобных не возникало =)
HTML: <table border="1" width="100px" height="100px"> <tr><td>{login0}</td></tr> <tr><td>{login1}</td></tr> <tr><td>{login2}</td></tr> </table>
ААААААААААААААААА та что вы прицепились к этому ? я ж для тестов весь текст пишу , зачем мне заморачиваться и на тестах чтото придумывать ? ) ну а реально если нужно 10 логинов в шаблоне HTML: <table border="1" width="100px" height="100px"> {login} </table> в пхп PHP: <? $i=0; while($i!=10){ $i++; $login.="<tr><td>{login".$i."}</td></tr>"; } $buffer=tpl_set("{login}",$login,$buffer); ?> или это так сложно вносить изменения и там и там ? ))) я кажись менее опытный большинства тут , но мне реально это не проблема ) или как надо ? - в шаблоне логику менять ? тоесть надо теперь уже 15 логинов и ты пойдёшь в шаблон ? помоему это более нелогично =) да и темболее даже я уже много проработал напару с двумя "верстальщиками"-долбоё... они блин с тегами чудили херь , а если б в шаблонах было б пхп , то я бы поехал по домам их распиливать штопором =D у меня от них alert(1) не работал даже xD и мне так никто ответ и не дал - валидно , нет ..)) мне лично так проще без пхп в хтмл , да и темболее увлекусь и пихну мускул запрос в инпут хайден
siiXth Ок, а если мне надо те же данные в XML отдать - получается помимо шаблона придется править вывод из контроллера. А при традиционном подходе - я изменю шаблон и всё. Цикл - может быть логикой представления. Обычный foreach - и я могу передать хоть 5 хоть 10000 логинов.
А почему бы тогда не PHP: <? $i=0; $login = '<table border="1" width="100px" height="100px">'; while($i!=10){ $i++; $login.="<tr><td>{login".$i."}</td></tr>"; } $login .= '</table>'; $buffer=tpl_set("{login}",$login,$buffer); ?> HTML: {login} А то чего уж мелочиться то.
фу... ты опять всё смешал. так сказать, перемешал логику представления и логику приложения. вернись назад. а еще погугли. видел сверхлегкие шаблонизаторы до 50кб. функционал весьма неплохой. код прозрачный, разобраться сможешь upd: вот аналог того, что ты написал: http://forum.dklab.ru/viewtopic.php?t=16364
хе-хе http://www.php.ru/forum/viewtopic.php?p=274158#274158 http://www.php.ru/forum/viewtopic.php?p=273624#273624 http://code.google.com/p/voltcore/sourc ... bleTpl.php
не мешай! php отдельно и шаблон отдельно. когда шаблон у тебя будет готов, используй свой "транслятор" для преобразования и сохранения шаблона из HTML: <body> {content} </body> в php вид HTML: <body> <?php echo $content; ?> </body>
siiXth чувак, не сдавайся. Пусть твоя кровь уже вся черна от чумы шаблонизаторов, но ты хоть можешь умереть достойно... отделять надо логику от отрисовки. И то не всегда. А шаблонизаторы - для ДЕБИЛОВ которые не могут разобраться с пхп.
Alex_pac ну если это единственный способ который он знает - да, дело плохо. гораздо лучший способ - проявить себя как оуэнного мачо от пхп - написать свой язык для работы с текстом для языка для работы с текстом. ТруЪ!
igordata , вы не поняли, я действительно рассматриваю концепцию шаблонов на <?php echo ?> скобках как вполне достойную для проектирования приложений на php
siiXth http://www.php.ru/forum/viewtopic.php?t=28531 пхп сам по себе и есть шаблонизатор. просто, как и сказал tommyangelo, первичная задача шаблонизатора - отделить логику представления от логику приложения. и только! Задача приложения сводится к тому, чтобы отдать данные шаблонизатору, и уже сам шаблонизатор, в зависимости от шаблона, сформирует тебе HTML, XML, CSV или всё что захочешь.
ну хз. мне такой синтаксис не нравится. хотя он нравится всем остальным. Я предпочитаю ставить двойные кавычки, и в них фигачить сразу как можно больший кусок.
скажу вам один недостаток подхода через кавычки: блокнот не раскрашивает код который там, как html разметку.
скажу вам один недостаток блокнота. он не предназнаен для программирования, а для записывания рецептов прогрессивных молодых мам