1. PHP / Говнокод #4342

    +157

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    // (c) Template Optimizer
    // (c) Template Compiler
    // skin/news.tpl
    
    /*<?php
    die ('<br /><br />Template Parser: <b>Access locked</b>');
    ?>*/
    
    $value0 = '
    
    ';
    if ( $this->get_tpl_tag ('USER.ACCESS') == '1' )
    {
    	$value0 .= '
    	';
    	$this->set_tpl_tag ('ACTION', 'new_add');
    	$value0 .= '
    	';
    	$this->set_tpl_tag ('SUBMIT', 'Добавить');
    	$value0 .= '
    	';
    	$this->set_tpl_tag ('CAPTION', 'Добавить новость');
    	$value0 .= '
    	' . $this->file_include ('content.tpl') . '
    ';
    }
    $value0 .= '
    
    ';
    $this->open_local (array ('NEW'));
    if ( is_array ($this->get_tpl_tag ('NEWS')) )
    foreach ( $this->get_tpl_tag ('NEWS') as $this->tags['NEW'] )
    {
    	$value0 .= '
    	<table class="news" width="100%">
    		<tr>
    			<th>
    				<h2>' . $this->get_tpl_tag ('NEW.TITLE') . '</h2>
    			</th>
    			<th align="right">
    				<span class="gensmall">' . $this->get_tpl_tag ('NEW.TIME') . ' </span>
    				';
    	if ( $this->get_tpl_tag ('USER.ACCESS') == '1' )
    	{
    		$value0 .= '
    					<a href="admin.php?action=new_edit&new=' . $this->get_tpl_tag ('NEW.ID') . '"><img src="' . $this->root_dir . '/images/rename.gif" alt="Редактировать" title="Редактировать" style="vertical-align: middle; border: none;" /></a>
    					<a href="admin.php?action=new_delete&new=' . $this->get_tpl_tag ('NEW.ID') . '" onclick="return confirm (\'Удалить новость за ' . $this->get_tpl_tag ('NEW.TIME') . '?\');"><img src="' . $this->root_dir . '/images/delete.gif" alt="Удалить" title="Удалить" style="vertical-align: middle; border: none;" />
    				';
    	}
    	$value0 .= '
    			</th>
    		</tr>
    		<tr>
    			<td colspan="2">
    				' . $this->get_tpl_tag ('NEW.BODY') . '
    			</td>
    		</tr>
    	</table>
    ';
    }
    $this->close_local();
    $value0 .= '
    
    ';
    $this->set_tpl_tag ('_ALIGN_', 'LEFT');
    $value0 .= '
    ' . $this->file_include ('pagebar.tpl');

    Вот такой "говнокод" выдает мой шаблонизатор после компилирования шаблона.
    В данном примере это блок новостей.

    Запостил: Arigato, 11 Октября 2010

    Комментарии (34) RSS

    • генерированный код не обязан быть красивым
      Ответить
    • Я б на код шаблонизатора посмотрел (:
      Ответить
      • поддерживаю = )
        Ответить
      • Ну там класс template реализован размером около 1000 строк.

        Вот код самого шаблона news.tpl, откомпилированный код которого я привел:

        {* Новости *}
        
        {#IF USER.ACCESS=1}
        	{ACTION=new_add}
        	{SUBMIT=Добавить}
        	{CAPTION=Добавить новость}
        	{#INCLUDE content.tpl}
        {IF#}
        
        {#FOR NEWS AS NEW}
        	<table class="news" width="100%">
        		<tr>
        			<th>
        				<h2>{NEW.TITLE}</h2>
        			</th>
        			<th align="right">
        				<span class="gensmall">{NEW.TIME}&nbsp;</span>
        				{#IF USER.ACCESS=1}
        					<a href="admin.php?action=new_edit&amp;new={NEW.ID}"><img src="{/}/images/rename.gif" alt="Редактировать" title="Редактировать" style="vertical-align: middle; border: none;" /></a>
        					<a href="admin.php?action=new_delete&amp;new={NEW.ID}" onclick="return confirm ('Удалить новость за {NEW.TIME}?');"><img src="{/}/images/delete.gif" alt="Удалить" title="Удалить" style="vertical-align: middle; border: none;" />
        				{IF#}
        			</th>
        		</tr>
        		<tr>
        			<td colspan="2">
        				{NEW.BODY}
        			</td>
        		</tr>
        	</table>
        {FOR#}
        
        {_ALIGN_=LEFT}
        {#INCLUDE pagebar.tpl}
        Ответить
        • А как шаблонизатор реализован?
          Поиском регекспами с заменой, или же пошаговый разбор лексем, или ещё как-то? Если не секрет, конечно.

          Я, думаю, примерно смогу представить :)
          Ответить
          • Что-то типа конечного автомата. Вот поддерживаемые конструкции:

            {TAG} - простая подстановка
            {$VAL} - арифметическая подстановка
            {#IF TAG} ... {#ELSE} ... {IF#} - условная подстановка
            {#IF !TAG} ... {#ELSE} ... {IF#} - отрицание условной подстановки
            {#IF TAG=VAL} ... {#ELSE} ... {IF#} - подстановка сравнения
            {#IF TAG<VAL} ... {#ELSE} ... {IF#} - подстановка сравнение "меньше"
            {#IF TAG>VAL} ... {#ELSE} ... {IF#} - подстановка сравнения "больше"
            {#IF !TAG=VAL} ... {#ELSE} ... {IF#} - отрицание подстановки сравнения
            {#IF !TAG<VAL} ... {#ELSE} ... {IF#} - отрицание подстановки сравнение "меньше"
            {#IF !TAG>VAL} ... {#ELSE} ... {IF#} - отрицание подстановки сравнения "больше"
            {#IFEXIST FILENAME} ... {#ELSE} ... {IF#} - проверка файла на существование
            {#INCLUDE FILENAME} - включение шаблона
            {#INCLUDE FILENAME?TAG1=VAL1&TAG2=VAL2} - включение шаблона с передачей параметров
            {#FOR TAG AS VAL} ... {FOR#} - краткий перебор
            {#FOR TAG AS KEY => VAL} ... {FOR#} - полный перебор
            
            {#FOR TAG IN (VAL1, VAL2, ..., VALN)} ... {FOR#} - перебор значений
            {#FOR TAG FROM VAL1 TO VAL2} ... {FOR#} - цикл от VAL1 до VAL2 с шагом 1
            {#FOR TAG FROM VAL1 TO VAL2 STEP VAL3} ... {FOR#} - цикл от VAL1 до VAL2 с шагом VAL3
            
            Теги, начинающиеся с символа "_" - локальные (по сути это только рекомендация).
            
            {#WITH TAG} ... {WITH#} - оператор привязки
            {#LOCAL TAG1, TAG2, ..., TAGN} ... {LOCAL#} - локализация шаблонных тегов
            {TAG=VAL} - определение шаблонного тега
            {#FUNCNAME VAL} - выполнение шаблонной функции
            {* ... *} - комментарий
            
            Предопределенные теги:
            {(} - скобка {
            {)} - скобка }
            {_} - пробел
            {/} - путь к папке с шаблонами
            
            Операции арифметической подстановки:
            + - сложение
            - - вычетание
            * - умножение
            / - деление
            % - остаток от деления
            (...) - приоритетные скобки
            Ответить
        • опять в стиле смарти? извините, но тоже фтопку -именно поэтому ))
          Ответить
          • На самом деле из смарти почерпнул идею только о комментах в виде {* ... *}, раньше у меня они писались так: {#REM ... }, все остальное создавалось независимо, причем весьма давно.
            Ответить
          • сколько знаю в смарти нет {#

            сама идея делать шаблонизатор на пыхе смешит.
            Ответить
            • Чем же так смешна идея шаблонов?
              Меня, к примеру, бесит код php в перемешку с html тегами. Подобный шаблон гораздо более читабельный, особенно, если под него подсветку синтаксиса настроить.
              Ответить
              • ну ну только шаблонизаторы в окноцовке генерят код пхп вперемешку с хтмл. А если выкинуть хтмл в отдльные файлы и в кропить в него куски <?php echo $name; ?> ,то код читабелнность не потеряет, а работать будет быстрее. К тому же не забывайте что пыха - это и есть шаблонизатор, а то можно докатится и до шаблонизатора на смарти.
                Ответить
                • ага, пхп написанный на пхп.
                  Ответить
                  • Это после оси на Хтмл вот кнопку пуск Попов уже сделал, осталось совсем ни чего.
                    Ответить
                • После компиляции по быстродействию нет существенной разницы, а по удобству (да и безопасности) все же лучше шаблон, чем встроенный php. Ведь при использовании php как шаблонизатора появляется совсем не нужный соблазн что-нибудь в шаблоне нагородить, и многие так делают.
                  Да и код менее читабельный со вставками php, чем при использовании шаблонных тегов.
                  Ответить
                  • // появляется совсем не нужный соблазн что-нибудь в шаблоне нагородить
                    ну так в смарти тоже можно вставлять пхп код если не ошибаюсь. зато помимо пхп синтаксиса нужно учить еще и синтаксис обрубка, а потом по пол часа курить маны в каждой нетипичной ситуации чтобы придумать очередной хак и сделать таки то, что на пхп пишется за секунду с закрытыми глазами.
                    Ответить
                    • Ни кто про смарти и не говорит, там перебор. Шаблон должен быть проще, чем php, что бы создавать шаблоны могли не только php'шники, но и те, что только html знает + немного разобраться, как шаблонные теги вставляются. А это не сложно.
                      Ответить
                  • ключевое после, а время компиляции уже не считается ??
                    Ответить
            • почему. хтмл-подобный шаблонизатор, то есть чей исходник есть хмл, неплох. Как хслт, только не надо такой навороченный и слишком такой абстрактный. Как пример, пхпТал, посмотрите, поймете. Неплохой компромисс между голым (и активным) пхп и максимально близок к хтмл. Такие шаблонизаторы еще имеют право на жизнь.
              Смарти-подобные, чей код есть почти тот же пых, а исходник превращается в кашу - имхо, фтопку
              Ответить
    • Ура! Больше шаблонизаторов хороших и разных!
      Ответить
    • во что превратится ГК, если начнётся накладывание высеров шаблонизаторов (и лаб в том числе) ?..
      Ответить
    • А зачем писать свой шаблонизатор, так из развлечения только
      Ответить
      • Варианты:
        1. Писать свой.
        2. Использовать готовый.
        3. Не использовать шаблонизатор, а вставлять в html php код.
        2-й вариант не подошел, по причине того, что ничего удовлетворительного (имхо) не обнаружил.
        3-й вариант меня не устраивает по многим причинам.
        Остается 1-й :)

        P.S. Забыл еще вариант с xslt указать. Тоже не устраивает...
        Ответить
        • Чем неустраивает третий вариант? PHP это изначально шаблонизатор
          Ответить
          • 1. Читабельность значительно ниже.
            2. Не стоит в шаблоны (что есть чисто дизайнерская функция) передавать логику.

            Вот примерно набросал, как бы тот же шаблон news.tpl выглядел бы с php вставками:
            <?php
            
            // Новости
            
            if ( $user.access == 1 )
            {
            	$action = "new_add";
            	$submit = "Добавить";
            	$caption = "Добавить новость";
            	include "$skin_path/content.php";
            
            	foreach ( $news as $new )
            	{
            ?>
            	<table class="news" width="100%">
            		<tr>
            			<th>
            				<h2><?=$new["title"]?></h2>
            			</th>
            			<th align="right">
            				<span class="gensmall"><?=$new_time?>&nbsp;</span>
            				<?php if ( $user.access == 1 )
            				{?>
            					<a href="admin.php?action=new_edit&amp;new=<?=$new["id"]?>"><img src="<?=$skin_path?>/images/rename.gif" alt="Редактировать" title="Редактировать" style="vertical-align: middle; border: none;" /></a>
            					<a href="admin.php?action=new_delete&amp;new=<?=$new["id"]?>" onclick="return confirm ('Удалить новость за <?=$new["time"]?>?');"><img src="<?=$skin_path?>/images/delete.gif" alt="Удалить" title="Удалить" style="vertical-align: middle; border: none;" />
            				<?php }?>
            			</th>
            		</tr>
            		<tr>
            			<td colspan="2">
            				<?=$new["body"]?>
            			</td>
            		</tr>
            	</table>
            <?php
            }
            $align = "left";
            include "$skin_path/pagebar.php";
            ?>

            Вот какая бяка выходит. К тому же появляется доступ туда, куда, по идеи, шаблоны доступа иметь не должны. Да и с переменными непонятки.
            Ответить
            • 1. у php ниже читабельность чем у смарти? :))) Тоесть {# более понятно чем <? ?
              2. не стоит. Пишите в шаблонах только вью. Или на php без логики никак?

              Вы сами говорите что нужна только вью, и сами же вбиваете локализацию и логику (if) и вшиваете URLы (admin.php) да еще и верстаете несемантично, и еще зачем-то по таблице делаете на каждую новость:)
              Причем делаете это и в шаблоне и в php.

              <?php
              function showNews($strTitle, $arrNews, $urlManager, $localizer, $bEditingAllowed) {
               foreach($arrNews as $newsEntry){?>
              ?>
                <table class="news">
                 <!-- тут идет вся фигня -->
                Вот тайтл:<?=$newsEntry->getTitle();?> ,  Вот  строка:<?=$localizer->addNews();?>
                Вот урл: <?=$urlManager->generateNewsEditUrl($newsEntry->getId());?> 
                <?if ($bEditingAllowed){?>
                 как-то так
                <?}?>
                 <!-- тут идет вся фигня -->
                </table>
              <?
               }
              }
              ?>


              Всю проверку на права пользователя нужно делать не в шаблоне

              зы: у news нет единственного числа.
              Ответить
              • Думаю, спор бесполезен.

                1. В данном случае ни какого смарти нет, как писал, мой шаблонизатор ни как не смарти, тем более, что он уже старее даже смарти.
                Читабельность тегов {TAG} для меня выше, чем <?=$tag?>

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

                > Вы сами говорите что нужна только вью, и сами же вбиваете локализацию и логику (if) и вшиваете URLы (admin.php)
                Эта логика ни как не связана с обработкой данных на php, т.е. php выдает набор шаблонных тегов (в том числе и массивов), в шаблоне это все выводится нужным образом. Речь шла про то, что не должно быть доступа из шаблона ни к каким переменным php, ни к БД. А есть ведь такие, кто в php шаблоны вставляет запросы к БД (видел такое).

                > да еще и верстаете несемантично, и еще зачем-то по таблице делаете на каждую новость:)
                Здесь речь не о верстке, это был пример, который первый под руку попался. В данном случае я готовый HTML закинул в шаблон, что и нужно было заказчику. Мне наплевать, сколько у него там таблиц на 1 новость... :)

                > <?}?>
                Ну вот такие конструкции мне и не нравятся. Тем более, что желательно было бы записать <?php }?>, т.к. не везде сокращенная запись включена.

                > Всю проверку на права пользователя нужно делать не в шаблоне
                Да, но выводить кнопочки админа надо в шаблоне же :) Проверка делается именно в php, шаблон лишь выводит или нет элементы управления админа, в зависимости от тех прав, что определил скрипт php.
                В противном случае придется или отдельный шаблон делать под эти элементы управления или, что еще хуже, генерировать их прямо в скрипте, тем самым лишая возможность подстроить их под дизайн скина.
                Ответить
            • много мусорного кода
              Заменить все <? на <?php все <?= на <?php echo это прибавит читабельности убрать
              <?php }?> потому что не нужно используйте endforeach это тоже добавляет к читабельности.
              а вот за это style="vertical-align: middle; border: none;" руки отрывать нах. чтоб не повадно было.
              Ответить
    • ну почему бы не использовать синтаксис пхп который удобен в шаблонах
      <?php foreach ():?>
      HTML
      <?php endforeach;?>
      И там тд тд для if есть альтернативный синтаксис

      какая разница писать {} как в smarty или <?php ?>
      Единственное накидать класс который грузит файл шаблона куда накидываются переменные впоследствии, шаблон будет таким же php файлом, и не будет лишнего слоя в виде вашего парсера
      Ответить
      • Как писал выше, каждому свое. Не перевариваю я код php в перемешку с html, что поделать...
        При использовании компилируемого шаблонизатора проблема снижения производительности практически исчезает, зато можно использовать тот синтаксис для шаблонов, который больше нравится.
        Ответить
    • (c) Template Compiler -- вас правда так зовут?
      Ответить

    Добавить комментарий