Mr.M.I.T. И раза в два медленнее выполняется. З.ы Средняя скорость печати у меня 515 знаков в минуту. Как-то не напрягает лишнее набрать...
шаблонизатор - есть язык. допустим, что мы верстаем в шаблонизаторе главную страницу bash.org.ru. для того, чтобы была полная картина - блоки я объединил в один документ. кодохранилище, которое нормально отображает совмещенный хтмл и пхп код я не нашел (что, в общем то, тоже можно отнести к небольшому недостатку такого подхода - нельзя нормально выложить код на форуме). Потому выкладываю исходники: native-шаблонизатор :: юзерфрендли-шаблонизатор и, для чистоты эксперимента, скриншоты в KWrite, с нормальной подсветкой: native-шаблонизатор :: юзерфрендли-шаблонизатор Уже тут видна кашеподобность native-шаблонизатора. А что будет, если будет более изощренная разметка?
время выполнения приблизительно одинаково, так как любой нормальный шаблонизатор компилится в native-код.
А время затраченное на компиляцию? Или оно на столько мало? Имхо, из мухи слона. Одно и то же. Что там условия и циклы, что тут. Просто написаны по другому.
на самом деле достаточно мало, я по сабжу сужу а скомпилированный шаблончик кешируется, дальше алгоритм своидится к нативу
а кстати, компилить можно не обязательно в пых таким образом шаблонизатор это ещё и абстракция своего рода
компиляция происходит один раз на тысячи вызовов. Действительно, написаны по-другому, и изза этого стали намного более читабельны. будь честен - ты и сам это видишь.
TheShock Для меня нет принципиальной разницы, я же говорю. Но использовать Смарти только потому что он более читабелен... Ну, блин, бред.
читаю я все это и толи смеюсь, то ли плачу... имхо СМЫСЛ шаблонизатора - РАБОТАТЬ КАК ШАБЛОН. Тупо, быстро и аккуратно <title>{TITLE}</title> все. === навертеть говна с псевдологикой, заточкой под "верстаков", читаемостью кода и т.д. дело НЕ хитрое. разговоры о скорости - смешно. Один SQL запрос сведет в НОЛЬ все потуги оптимизации шаблонизатора. Чем выше уровень абстракции - тем удобнее людям, НО все разные. спор - ни о чем... мож по ПИФФКУ? СИСЬКИ!!! === я на одном среднем проекте в 100к в сутки делал и классы и шаблоны и не еб никому мозг про скорость и расчеты в милисекунды... выкинул все, нах, в memcache, и снизил нагрузку со 150 потоков до 2-3. шаблоны нативные... да... руки не из жопы растить надо и все у нас получиться! =)
надо помнить об одном. все это всего лишь "молотки" для забивания "гвоздей", а вот куда мы эти гвозди лупим - вот вопрос! а лупим мы все это себе в бошки... =) стук-стук... клац-клац... и вместо головы - нативный смарти с кеширующей файловой системой и обработкой SQL запросов прямо в шаблоне заточенный под какой-нить DW. капец... зато понтов сколько! как красиво можно втирать продукты... я вот пишу в обычном текстовом редакторе и юзаю что и как мне захочется. хоть шаблоны, хоть классы, хоть процедуры. "человечество потребления" вместо "человечества созидания"
440Hz, такая уверенность и умение убеждать только с годами приходят? блин, я тоже так хочу, хулеее...
так пойми раз и навсегда. нет никаких рамок. пиши как хочешь и получай от этого удовольствие. кто-то пишет похоже на тебя - радуйся с ним. кто-то пишет не так - радуйся за него. вообще - радуйся... p.s. блин, трава хорошая попалась...
TheShock я пользую такой. мне хватает с избытком PHP: <?php class EnigmaTPLS extends EnigmaAtom { private $tplname = ''; private $file = ''; private $blocks = array(); private $vars = array(); public function EnigmaTPLS($tplname='') { if(file_exists($tplname)) { $this->Load($tplname); } else { $this->Error('Не могу загрузить шаблон ['.$tplname.']'); } $this->SetVar('major',1); $this->SetVar('minor',0); $this->SetVar('secs',date('s')); $this->SetVar('time',date('H:i')); $this->SetVar('date',date('d.m.Y')); $this->SetVar('ME',EnigmaHTTPRequest::GetInstance()->GetPost('cz')); $this->SetVar('METHOD',EnigmaHTTPRequest::GetInstance()->GetPost('method')); $this->SetVar('SID',EnigmaSessions::GetInstance()->Id()); $this->SetVar('PAGES',EnigmaSessions::GetInstance()->Pages()); $this->SetVar('UID',EnigmaUsers::GetInstance()->Id()); } function Load($tplname) { $this->tplname = $tplname; $this->file = file_get_contents($this->tplname); if( preg_match_all('/<!--\s+BEGIN\s+([a-z0-9]+)\s+-->(.*)<!--\s+END\s+\\1\s+-->/Uumsi',$this->file,$matches,PREG_SET_ORDER) ) { while( list(,$match) = each($matches)) { $this->blocks[$match[1]] = trim($match[2]); } } else { $this->Error('в шаблоне ['.$tplname.'] нет блоков'); } } public function SetVar($name='default',$val='default') { $this->vars[$name] = $val; } public function Parse($block='') { if( isset($this->blocks[$block]) ) { $parse = $this->blocks[$block]; while( list($name,$val) = each($this->vars)) { $parse = str_replace('{'.$name.'}',$val,$parse); } return $parse; } else { $this->Error('в шаблоне нет блока ['.$block.']'); } } } ?> HTML: <!-- BEGIN NOW --> {date} {time} <!-- END NOW --> <!-- BEGIN DATE --> {date} <!-- END DATE --> <!-- BEGIN TIME --> {time}.{secs} <!-- END TIME --> <!-- BEGIN CLOCK --> Enigma {major}.{minor} - <span id="jclock"></span> <script>$("#jclock").jclock();</script> <!-- END CLOCK -->
Выше приведённый native шаблон в нормальном виде (как пишу я) PHP: <?php if (isset($var)):?> <?php foreach ($var as $val):?> <?php if ($val == 0):?> <?php $mz=array("do1"=>"href1","do2"=>"href2","do3"=>"href3");?> <?php foreach ($mz as $text => $href):?> <a href="<?php echo $href?>"><?php echo $text?></a><br> <?php endforeach;?> <?php elseif ($val==1):?> <a href="main">Main</a> <?php else:?> Error. <?php endif;?> <?php endforeach;?> <?php else:?> <?php header("location:/");?> <?php exit();?> <?php endif;?> Другое дело, что это никакой нафиг уже не шаблон - тут кода больше чем самого HTML. Я уже не говорю вообще о header() и объявлении масива - такого в шаблоне тупо не должно быть. Вообще. По большей части я себе позволяю if (): else: endif; и foreach. И имена для переменных я стараюсь ставить такие, которые подходят по смыслу, а не $var, $val неизвестно чего. Типичный мой шаблон: PHP: <?php if (is_set('photos')):?> <div class="thumbnails"> <?php foreach (get('photos') as $photo):?> <div class="photo"><?php echo $photo?></div> <?php endforeach;?> </div> <?php else:?> <div class="hint"><?php echo _("No photos found in album!")?></div> <?php endif;?> В силу специфики системы, фотки у меня генерируются специальым классом со всеми текстами и разметкой. Вот более большой шаблон: PHP: <h1><a href="/guests.html"><?php echo _("Guests")?></a></h1> <?php if (is_set('guests')):?> <?php echo $pager = get('pager')?> <table cellpadding="0" cellspacing="0" class="friendsearch thumbnails"> <tr class="header"> <td class="left_con"> </td> <td><?php echo _("Name")?></td> <td><?php echo _("Location")?></td> <td><?php echo _("Date")?></td> <td class="right_con"> </td> </tr> <?php foreach (get('guests') as $val):?> <tr> <td class="col1"><?php echo $val['user']?></td> <td><?php echo $val['urd_first_name']?> <?php echo $val['urd_last_name']?></td> <td><?php echo $val['cnt_name']?></td> <td class="col3 when<?php echo $val['when_added']?>"><?php echo $val['gst_added']?></td> <td><a href="#" onclick="return openWindow('/guests/details/<?php echo $val['gst_id']?>.html', 350, 350, 'guests')">View detailed report</a></td> </tr> <?php endforeach;?> </table> <?php echo $pager?> <?php else:?> <div><?php echo _("No guests found")?></div> <?php endif;?>
Только это уже шаблон слабо напоминает. Не конкретно в этом виде, а вообще. В том плане, что тут намешана логика с отображением.
Mr.M.I.T. Мне нормально, потому что на smarty получается ещё хуже + не подсвечивается. У меня был опят работы со сматри чуть больше года, тоже большой сложный сайт с всякими заковырками покруче чем щас делаю в шаблонах. Постоянно теги smarty вылазили за пределы экрана, потому что подругому просто нельзя было добратся до каких-то особенностей самого smarty - к примеру считать какой это по порядку ряд, что бы раскрасить таблицу в полоску и.т.д. А рамки в шаблонах нужно задавать прежде всего для себя, иначе получится не шаблон, а типичный говнокод. С Native шаблонами очень тонкая грань между шаблоном и include файлом, который делает что-то и является мешаниной PHP и HTML кода.
это пипец. у меня травы не хватит... =) ИМХО include('template'); это уже не шаблон, а ОБЫЧНЫЙ php код, а шаблон, он прост и красив <title>{TITLE}</title>