За последние 24 часа нас посетили 18003 программиста и 1654 робота. Сейчас ищут 1515 программистов ...

Улучшенный нативный шаблонизатор [готовое решение]

Тема в разделе "Решения, алгоритмы", создана пользователем Mr.M.I.T., 21 май 2009.

  1. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    шаблонизатор - язык вида
    первый вариант раза в два быстрее печатается
     
  2. Elkaz

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

    С нами с:
    26 июн 2006
    Сообщения:
    3.373
    Симпатии:
    0
    Адрес:
    Баку, Азербайджан
    Mr.M.I.T.
    И раза в два медленнее выполняется.
    З.ы
    Средняя скорость печати у меня 515 знаков в минуту. Как-то не напрягает лишнее набрать...
     
  3. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    шаблонизатор - есть язык.

    допустим, что мы верстаем в шаблонизаторе главную страницу bash.org.ru. для того, чтобы была полная картина - блоки я объединил в один документ.
    кодохранилище, которое нормально отображает совмещенный хтмл и пхп код я не нашел (что, в общем то, тоже можно отнести к небольшому недостатку такого подхода - нельзя нормально выложить код на форуме). Потому выкладываю исходники:
    native-шаблонизатор :: юзерфрендли-шаблонизатор
    и, для чистоты эксперимента, скриншоты в KWrite, с нормальной подсветкой:
    native-шаблонизатор :: юзерфрендли-шаблонизатор

    Уже тут видна кашеподобность native-шаблонизатора. А что будет, если будет более изощренная разметка?
     
  4. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    время выполнения приблизительно одинаково, так как любой нормальный шаблонизатор компилится в native-код.
     
  5. Elkaz

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

    С нами с:
    26 июн 2006
    Сообщения:
    3.373
    Симпатии:
    0
    Адрес:
    Баку, Азербайджан
    А время затраченное на компиляцию? Или оно на столько мало?

    Имхо, из мухи слона. Одно и то же. Что там условия и циклы, что тут. Просто написаны по другому.
     
  6. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    на самом деле достаточно мало, я по сабжу сужу
    а скомпилированный шаблончик кешируется, дальше алгоритм своидится к нативу
     
  7. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    а кстати, компилить можно не обязательно в пых ;)
    таким образом шаблонизатор это ещё и абстракция своего рода
     
  8. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    компиляция происходит один раз на тысячи вызовов.

    Действительно, написаны по-другому, и изза этого стали намного более читабельны. будь честен - ты и сам это видишь.
     
  9. Elkaz

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

    С нами с:
    26 июн 2006
    Сообщения:
    3.373
    Симпатии:
    0
    Адрес:
    Баку, Азербайджан
    TheShock
    Для меня нет принципиальной разницы, я же говорю. Но использовать Смарти только потому что он более читабелен... Ну, блин, бред.
     
  10. 440Hz

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

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    читаю я все это и толи смеюсь, то ли плачу...

    имхо СМЫСЛ шаблонизатора - РАБОТАТЬ КАК ШАБЛОН. Тупо, быстро и аккуратно

    <title>{TITLE}</title>

    все.

    ===

    навертеть говна с псевдологикой, заточкой под "верстаков", читаемостью кода и т.д. дело НЕ хитрое. разговоры о скорости - смешно. Один SQL запрос сведет в НОЛЬ все потуги оптимизации шаблонизатора.

    Чем выше уровень абстракции - тем удобнее людям, НО все разные.

    спор - ни о чем...

    мож по ПИФФКУ?

    СИСЬКИ!!!

    ===

    я на одном среднем проекте в 100к в сутки делал и классы и шаблоны и не еб никому мозг про скорость и расчеты в милисекунды... выкинул все, нах, в memcache, и снизил нагрузку со 150 потоков до 2-3.

    шаблоны нативные... да... руки не из жопы растить надо и все у нас получиться!

    =)
     
  11. 440Hz

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

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    надо помнить об одном. все это всего лишь "молотки" для забивания "гвоздей", а вот куда мы эти гвозди лупим - вот вопрос!

    а лупим мы все это себе в бошки...

    =)

    стук-стук... клац-клац... и вместо головы - нативный смарти с кеширующей файловой системой и обработкой SQL запросов прямо в шаблоне заточенный под какой-нить DW.

    капец...

    зато понтов сколько! как красиво можно втирать продукты...

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

    "человечество потребления" вместо "человечества созидания"
     
  12. Elkaz

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

    С нами с:
    26 июн 2006
    Сообщения:
    3.373
    Симпатии:
    0
    Адрес:
    Баку, Азербайджан
    440Hz, такая уверенность и умение убеждать только с годами приходят? блин, я тоже так хочу, хулеее...
     
  13. 440Hz

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

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    так пойми раз и навсегда. нет никаких рамок. пиши как хочешь и получай от этого удовольствие.

    кто-то пишет похоже на тебя - радуйся с ним.

    кто-то пишет не так - радуйся за него.

    вообще - радуйся...

    p.s. блин, трава хорошая попалась...
     
  14. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    440Hz
    вот только я не понял - ты сам то за нативный шаблонизатор или против? :))
     
  15. 440Hz

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

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    TheShock

    я пользую такой. мне хватает с избытком

    PHP:
    1.  
    2. <?php
    3.  
    4. class EnigmaTPLS extends EnigmaAtom {
    5.  
    6.     private $tplname    = '';
    7.     private $file       = '';
    8.  
    9.     private $blocks     = array();
    10.     private $vars       = array();
    11.  
    12.     public function EnigmaTPLS($tplname='') {
    13.  
    14.         if(file_exists($tplname)) {
    15.             $this->Load($tplname);
    16.         } else {
    17.             $this->Error('Не могу загрузить шаблон ['.$tplname.']');
    18.         }
    19.  
    20.         $this->SetVar('major',1);
    21.         $this->SetVar('minor',0);
    22.  
    23.  
    24.         $this->SetVar('secs',date('s'));
    25.         $this->SetVar('time',date('H:i'));
    26.         $this->SetVar('date',date('d.m.Y'));
    27.  
    28.         $this->SetVar('ME',EnigmaHTTPRequest::GetInstance()->GetPost('cz'));
    29.         $this->SetVar('METHOD',EnigmaHTTPRequest::GetInstance()->GetPost('method'));
    30.  
    31.         $this->SetVar('SID',EnigmaSessions::GetInstance()->Id());
    32.         $this->SetVar('PAGES',EnigmaSessions::GetInstance()->Pages());
    33.  
    34.         $this->SetVar('UID',EnigmaUsers::GetInstance()->Id());
    35.  
    36.     }
    37.  
    38.     function Load($tplname) {
    39.  
    40.         $this->tplname = $tplname;
    41.         $this->file = file_get_contents($this->tplname);
    42.  
    43.         if( preg_match_all('/<!--\s+BEGIN\s+([a-z0-9]+)\s+-->(.*)<!--\s+END\s+\\1\s+-->/Uumsi',$this->file,$matches,PREG_SET_ORDER) ) {
    44.             while( list(,$match) = each($matches)) {
    45.                 $this->blocks[$match[1]] = trim($match[2]);
    46.             }
    47.         } else {
    48.             $this->Error('в шаблоне ['.$tplname.'] нет блоков');
    49.         }
    50.    
    51.     }
    52.  
    53.     public function SetVar($name='default',$val='default') {
    54.  
    55.         $this->vars[$name] = $val;
    56.  
    57.     }
    58.  
    59.     public function Parse($block='') {
    60.  
    61.         if( isset($this->blocks[$block]) ) {
    62.  
    63.             $parse = $this->blocks[$block];
    64.  
    65.             while( list($name,$val) = each($this->vars)) {
    66.                 $parse = str_replace('{'.$name.'}',$val,$parse);
    67.             }
    68.        
    69.             return $parse;
    70.        
    71.         } else {
    72.             $this->Error('в шаблоне нет блока ['.$block.']');
    73.         }
    74.  
    75.  
    76.     }
    77.  
    78. }
    79.  
    80. ?>
    81.  
    HTML:
    1.  
    2.  
    3. <!-- BEGIN NOW -->
    4.  
    5. {date} {time}
    6.  
    7. <!-- END NOW -->
    8.  
    9. <!-- BEGIN DATE -->
    10.  
    11. {date}
    12.  
    13. <!-- END DATE -->
    14.  
    15. <!-- BEGIN TIME -->
    16.  
    17. {time}.{secs}
    18.  
    19. <!-- END TIME -->
    20.  
    21. <!-- BEGIN CLOCK -->
    22.  
    23. Enigma {major}.{minor} -  <span id="jclock"></span>
    24. <script>$("#jclock").jclock();</script>
    25.  
    26. <!-- END CLOCK -->
    27.  
    28.  
     
  16. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    440Hz
    везёт тебе, другого бы говном облили давно уже...
     
  17. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Выше приведённый native шаблон в нормальном виде (как пишу я)
    PHP:
    1.  
    2. <?php if (isset($var)):?>
    3.    <?php foreach ($var as $val):?>
    4.          <?php if ($val == 0):?>
    5.              <?php $mz=array("do1"=>"href1","do2"=>"href2","do3"=>"href3");?>
    6.              <?php foreach ($mz as $text => $href):?>
    7.                   <a href="<?php echo $href?>"><?php echo $text?></a><br>
    8.              <?php endforeach;?>
    9.          <?php elseif ($val==1):?>
    10.              <a href="main">Main</a>
    11.          <?php else:?>
    12.              Error.
    13.          <?php endif;?>
    14.    <?php endforeach;?>
    15. <?php else:?>
    16.   <?php header("location:/");?>
    17.   <?php exit();?>
    18. <?php endif;?>
    19.  
    Другое дело, что это никакой нафиг уже не шаблон - тут кода больше чем самого HTML. Я уже не говорю вообще о header() и объявлении масива - такого в шаблоне тупо не должно быть. Вообще. По большей части я себе позволяю if (): else: endif; и foreach. И имена для переменных я стараюсь ставить такие, которые подходят по смыслу, а не $var, $val неизвестно чего. Типичный мой шаблон:

    PHP:
    1. <?php if (is_set('photos')):?>
    2.     <div class="thumbnails">
    3.         <?php foreach (get('photos') as $photo):?>
    4.             <div class="photo"><?php echo $photo?></div>
    5.         <?php endforeach;?>
    6.     </div>
    7. <?php else:?>
    8.     <div class="hint"><?php echo _("No photos found in album!")?></div>
    9. <?php endif;?>
    В силу специфики системы, фотки у меня генерируются специальым классом со всеми текстами и разметкой. Вот более большой шаблон:
    PHP:
    1. <h1><a href="/guests.html"><?php echo _("Guests")?></a></h1>
    2. <?php if (is_set('guests')):?>
    3.     <?php echo $pager = get('pager')?>
    4.     <table cellpadding="0" cellspacing="0" class="friendsearch thumbnails">
    5.     <tr class="header">
    6.         <td class="left_con">&nbsp;</td>
    7.         <td><?php echo _("Name")?></td>
    8.         <td><?php echo _("Location")?></td>
    9.         <td><?php echo _("Date")?></td>
    10.         <td class="right_con">&nbsp;</td>
    11.     </tr>
    12.     <?php foreach (get('guests') as $val):?>
    13.         <tr>
    14.             <td class="col1"><?php echo $val['user']?></td>
    15.             <td><?php echo $val['urd_first_name']?> <?php echo $val['urd_last_name']?></td>
    16.             <td><?php echo $val['cnt_name']?></td>
    17.             <td class="col3 when<?php echo $val['when_added']?>"><?php echo $val['gst_added']?></td>
    18.             <td><a href="#" onclick="return openWindow('/guests/details/<?php echo $val['gst_id']?>.html', 350, 350, 'guests')">View detailed report</a></td>
    19.         </tr>
    20.     <?php endforeach;?>
    21.     </table>
    22.     <?php echo $pager?>
    23. <?php else:?>
    24.     <div><?php echo _("No guests found")?></div>
    25. <?php endif;?>
     
  18. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Только это уже шаблон слабо напоминает. Не конкретно в этом виде, а вообще. В том плане, что тут намешана логика с отображением.
     
  19. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Sergey89
    Я отредактировал своё сообщение добавив 2 примера :)
     
  20. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    Psih
    Тебе самому то нравится?
    на самом деле рамок нет.
     
  21. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Mr.M.I.T.
    Мне нормально, потому что на smarty получается ещё хуже + не подсвечивается. У меня был опят работы со сматри чуть больше года, тоже большой сложный сайт с всякими заковырками покруче чем щас делаю в шаблонах. Постоянно теги smarty вылазили за пределы экрана, потому что подругому просто нельзя было добратся до каких-то особенностей самого smarty - к примеру считать какой это по порядку ряд, что бы раскрасить таблицу в полоску и.т.д.

    А рамки в шаблонах нужно задавать прежде всего для себя, иначе получится не шаблон, а типичный говнокод. С Native шаблонами очень тонкая грань между шаблоном и include файлом, который делает что-то и является мешаниной PHP и HTML кода.
     
  22. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    Psih
    у меня не смарти
    цель у меня была упростить работу с нативом + сделать кеширование
     
  23. 440Hz

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

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    это пипец. у меня травы не хватит...
    =)


    ИМХО

    include('template');

    это уже не шаблон, а ОБЫЧНЫЙ php код, а шаблон, он прост и красив

    <title>{TITLE}</title>
     
  24. 440Hz

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

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    эт точно!