Форум программистов, компьютерный форум, киберфорум
Наши страницы
CoderHuligan
Войти
Регистрация
Восстановить пароль
Рейтинг: 2.67. Голосов: 3.

Шаблонизация в PHP. Продолжение записок свихнувшегося кодомана.

Запись от CoderHuligan размещена 22.09.2018 в 16:31
Обновил(-а) CoderHuligan 25.09.2018 в 14:49

Давайте немного поразмышляем..
Пока конкретно о такой вещи, как шаблонизация. Для кого тема скучная, а по мне так наоборот..
Много чего я читал на просторах и-нета про шаблоны и шаблонизацию. говорят, что нужно, просто обязательно отделять форму от содержания для того, чтобы верстальщикам было легче верстать, а пэхэпэтчикам кодить))
Однако посмотрите каким образом всё это реализовано в существующих шаблонизаторах. В самих шаблонах присутствуют элементы PHP. В этом случае о каком разделении представления может идти речь? Некоторые шаблонизаторы вводят свои собственные обозначения для того, чтобы парсер знал что куда вставлять, тем самым изобретая ещё один третий язык.
Казалось бы - а куда деваться? Везде так.. Так-то так, да можно и по другому.. А возможно и нужно по другому..
Откройте практически любой шаблон в любом редакторе исходного кода и вы не увидите никакой подсветки html. Можно сказать: ну создай свои темы подсветки для файлов типа .tpl Дык ведь даже это дело не каждому по плечу.
Итак две проблемы налицо:
1) Отсутствует подсветка тэгов в стандартных общедоступных редакторах.
2) Код html по прежнему перемешан с кодом php или даже с третьим языком.
Предлагаю совершенно другой подход. Во-всяком случае я такого на просторах и-нета ещё не встречал. Меня интересует мнение знакомых с данной проблематикой людей, да и просто заинтересованных лиц. Прошу высказать свои мнения и соображения по данному вопросу.
Суть предложения.
В файле с шаблоном не должно быть вообще никаких переменных, условий и вообще НИКАКОГО кода php, никаких скобочек что куда вставлять! Там должен находится только ЧИСТЫЙ html!
Скажете - утопия, как вообще возможно в него что-либо вставлять? Отвечу всё довольно просто реализуется, и мечта о разделении формы и содержания может быть осуществлена. Лично я пишу форумный движок в котором будет реализована подобная концепция.
Итак, например имеем файл tpl.php с нашим шаблоном. Заметьте расширение - не tpl, а php, или html! Это важный момент! Реализуется он так(пример кода из моего файлового движка с некоторыми упрощениями):

HTML5
1
2
3
4
5
<table width="100%" id="logostrip" cellspacing="0" cellpadding="0"><tr><td><a href="index.php" title="
"><img src="./templates/
/im/logo.gif" alt="
" width="207" height="52" border="0" /></a></td><td valign="bottom" align="right"><a href="index.php" style="margin-right:20px;color:#ffffff">
</a></td></tr></table>
Это файл темплэйта. Каждая часть html кода реализована на своей строке. особая функция загружает этот файл и превращает его в массив отдельных элементов шаблона.
Теперь как происходит вставка. Имеем например функцию:
PHP
1
2
3
4
5
6
7
8
9
function extbb_showLogoStrip() 
{
global $Config, $ContentBuf, $TemplatesPath;
require_once($TemplatesPath.'tpl.php');
$tpl=extbb_getArr($TemplatesPath.'tpl.php');
 
$ContentBuf.=$tpl[0].$Config[1].$tpl[1].$Config[4].$tpl[2].$Config[1].$tpl[3].$Config[1].$tpl[4];
}
?>
Как видим и здесь только PHP и никакого html. Итак код и данные полностью разделены! Свершилась мечта! Но кто оценит такой подход, ведь сейчас все юзают готовые тормозные шаблонизаторы?.. Хай с ними пусть юзают.. А мы будем юзать то что надо!.. Правда те, кто понимает о чём идёт речь и какие преимущества это даёт.
Что это еще даёт?
А это даёт то, что теперь сторонний код может с лёгкостью ИЗМЕНЯТЬ шаблоны! Иногда прямо "на лету". Ещё этот способ в разы быстрее, чем в существующих шаблонизаторах..
Когда эта идея впервые пришла мне в голову, то я сразу понял: так оно и должно быть! И никак иначе..
Верстальщик теперь имеет дело ТОЛЬКО с любимым фронтендом в виде чистого html! Единственно что он должен знать, что где заканчивается строка, там будет вставлен некий элемент php кодом. Основная структура полностью освобождена от php. Это обстоятельство сильно развязывает оба файла друг от друга, что предоставляет свободу действий для программиста, и избавляет код от ненужных зависимостей.
Размещено в Без категории
Просмотров 794 Комментарии 11
Всего комментариев 11
Комментарии
  1. Старый комментарий
    Цитата:
    Как видим и здесь только PHP и никакого html. Итак код и данные полностью разделены! Свершилась мечта!
    Ну и в чем смысл, если фактически то что раньше было в 1 файле теперь размазано по 2? И любая правка шаблона потребует внесения изменений в двух местах, в том числе и php коде, что очень обрадует верстальщика.
    А читаемость упала до нуля. Теперь в html файле вместо нормально форматирования какая-то мешанина, а в php склейка огромной строки с кучей magic numbers.
    Цитата:
    А это даёт то, что теперь сторонний код может с лёгкостью ИЗМЕНЯТЬ шаблоны! Иногда прямо "на лету"
    И часы "веселой" отладки обеспечены.
    Цитата:
    Ещё этот способ в разы быстрее, чем в существующих шаблонизаторах..
    Сильное заявление, а бенчмарков конечно никаких нет.
    Запись от Jewbacabra размещена 23.09.2018 в 15:37 Jewbacabra вне форума
  2. Старый комментарий
    Аватар для CoderHuligan
    Цитата:
    Ну и в чем смысл, если фактически то что раньше было в 1 файле теперь размазано по 2?
    Смысл в том, что функция вывода какого либо блока может не быть такой простой, что я привёл. А обычно так и есть. Я просто выбрал наиболее простой вариант без циклов и пр. в том же духе. Ну и как прикажете всё это дело прописывать в шаблоне? Верстальщику будет загляденье, да..
    И не размазано оно по двум файлам, ибо эти файлы ничего друг о друге не знают.. Они просто соблюдают некоторые общедоступные соглашения. В файле с шаблоном отсутствуют какие-либо переменные поэтому он не имеет никакого отношения к файлу с кодом, который занимается чистой механикой, то есть тем, чем и должен заниматься.. Ему этому файлу можно скормить совсем другой файл с похожей структурой и он его сьест и не подавится.
    Цитата:
    И любая правка шаблона потребует внесения изменений в двух местах, в том числе и php коде, что очень обрадует верстальщика.
    И не любая, а только такая, которая касается структуры самого шаблона, и то не факт. Что куда вставлять прописано жёстко и верстальщик совершенно незачем нарушать эту структуру. его дело как это будет выглядеть и всё. Есть соглашение: не нарушай общую структуру, что где вставляется, и будет тебе счастье.
    Наоборот: я могу изменить функцию и не менять файл темплейта и обратно, так как в темплейте отсутствуют даже намёки о каких-либо переменных и т.п.
    Цитата:
    А читаемость упала до нуля. Теперь в html файле вместо нормально форматирования какая-то мешанина, а в php склейка огромной строки с кучей magic numbers.
    А что там вычитывать? Человек открывает практически одноимённый файл шаблона и в редакторе смотрит на номер строки вычитая в уме единицу, и всё. Всё сразу понятно где что. Наоборот: это не магические числа сами по себе, а индексы массива, а в редакторе по индексу легко находится нужная часть, причём сразу. Тут всё прозрачно, а если что не ясно то существует документация, в которой прописано какой файл с каким работает.
    Цитата:
    И часы "веселой" отладки обеспечены.
    А вот этого не понял.. То, что ЛЮБАЯ функция может работать с этим файлом темплейта напрямую и изменять его внутри себя, является огромным преимуществом. Расскажите мне в каких шаблонизаторах предусмотрена такая фича. Там извращаются не по детцки обходными путями чтобы что-то там изменить в представлении. Вот эта возможность всё перекрывает, все возможные недостатки. А я лично таких особых проблем не вижу.
    Цитата:
    .Сильное заявление, а бенчмарков конечно никаких нет.
    К сожалению у меня нет вещей, в которых работал бы установленный шаблонизатор. Я видел реализацию подобного. У меня отсутствую строковые функции смею заметить, а это сильно ускоряет код сам по себе. По этому и сужу, что в разы. Если у кого есть подобные фреймворки, то пусть предложат простой тест и протестируют его у себя, а я протестирую свой у себя, а потом сравним.
    Запись от CoderHuligan размещена 24.09.2018 в 11:59 CoderHuligan вне форума
    Обновил(-а) CoderHuligan 24.09.2018 в 12:11
  3. Старый комментарий
    Цитата:
    Смысл в том, что функция вывода какого либо блока может не быть такой простой, что я привёл. А обычно так и есть. Я просто выбрал наиболее простой вариант без циклов и пр. в том же духе. Ну и как прикажете всё это дело прописывать в шаблоне? Верстальщику будет загляденье, да..
    HTML5
    1
    2
    3
    4
    5
    
    <table width="100%" id="logostrip" cellspacing="0" cellpadding="0"><tr><td><a href="index.php" title="
    "><img src="./templates/
    /im/logo.gif" alt="
    " width="207" height="52" border="0" /></a></td><td valign="bottom" align="right"><a href="index.php" style="margin-right:20px;color:#ffffff">
    </a></td></tr></table>
    PHP/HTML
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    <table width="100%" id="logostrip" cellspacing="0" cellpadding="0">
        <tr>
            <td>
                <a href="index.php" title="<?=$title?>">
                    <img src="./templates/<?=$path?>/im/logo.gif" alt="<?=$alt?>" width="207" height="52" border="0" />
                </a>
            </td>
            <td valign="bottom" align="right">
                <a href="index.php" style="margin-right:20px;color:#ffffff"></a>
            </td>
        </tr>
    </table>
    Вопрос: какой из этих двух вариантов более читаем и с каким будет приятно работать верстальщику?

    Цитата:
    И не любая, а только такая, которая касается структуры самого шаблона, и то не факт. Что куда вставлять прописано жёстко и верстальщик совершенно незачем нарушать эту структуру. его дело как это будет выглядеть и всё. Есть соглашение: не нарушай общую структуру, что где вставляется, и будет тебе счастье.
    А какие еще бывают правки в шаблонах, кроме изменения их структуры? Это 90% всех правок.

    Цитата:
    А что там вычитывать? Человек открывает практически одноимённый файл шаблона и в редакторе смотрит на номер строки вычитая в уме единицу, и всё. Всё сразу понятно где что.
    Мне кажется что ты тролль. Предлагаю еще раз взглянуть на шаблоны в начале поста. И это я еще не привел вторую часть $ContentBuf.=$tpl[0].$Config[1].$tpl[1].$Config[4].$tpl[2].$Config[1].$tpl[3].$Config[1].$tpl[4];
    В которой ты предлагаешь высчитывать номера строк и склеивать фрагменты. Нет уж, мне второй вариант нравится куда больше.

    Цитата:
    А вот этого не понял.. То, что ЛЮБАЯ функция может работать с этим файлом темплейта напрямую и изменять его внутри себя, является огромным преимуществом.
    Т.е. еще и строки не по порядку могут идти. Да здравствует спагетти.
    Цитата:
    Расскажите мне в каких шаблонизаторах предусмотрена такая фича
    А зачем эта фича нужна? Чтобы жизнь разработчика сладкой не казалась?

    Цитата:
    Я видел реализацию подобного. У меня отсутствую строковые функции смею заметить, а это сильно ускоряет код сам по себе
    Я привел пример шаблона без какой-либо строковой функции, шаблонизаторы типа twig кешируются в аналогтчные php файлы. А в твоем варианте нужно разобрать файл шаблона, а потом склеить его обратно, и якобы оно будет быстрее. Делая такие утверждения, их нужно подкреплять бенчмарками
    Запись от Jewbacabra размещена 24.09.2018 в 21:11 Jewbacabra вне форума
  4. Старый комментарий
    Аватар для CoderHuligan
    Цитата:
    Вопрос: какой из этих двух вариантов более читаем и с каким будет приятно работать верстальщику?
    Вопрос правильный, и читаемость ЕСТЕСТВЕННО выше у вашего варианта. Я же понимаю всё.. Конечно я могу изменить завершения строк другим символом и сделать почти как у вас, читабельно, но всё равно не буду этого делать ибо это рабочий вариант без излишнего мусора, который нужен только верстальщику, и то практически один раз в жизни, а всё остальное время он будет летать по сети и неперегружать каналы..
    Цитата:
    А какие еще бывают правки в шаблонах, кроме изменения их структуры? Это 90% всех правок.
    Я говорил о структуре, которая не нарушает принцип вставки элементов. А всё остальное можно менять по своему усмотрению. Ссылка так и останется ссылкой, что там менять? Может когда-нибудь в будущем изменится тег <a>? В ближайшем будущем вряд ли..
    Цитата:
    Мне кажется что ты тролль. Предлагаю еще раз взглянуть на шаблоны в начале поста. И это я еще не привел вторую часть
    Мне кажется что мы не понимаем друг-друга. Это же не красивая девушка, чтобы нравится, - это рабочий код, ломовая лошадь, которая призвана пахать и пахать.. Главное ведь в тех возможностях, которые предоставляет тот или иной принцип.
    Цитата:
    Т.е. еще и строки не по порядку могут идти. Да здравствует спагетти.
    Почему не по порядку?
    Приведу реальный случай. Недавно понадобилось одному человеку, в одном файловом движке изменить темплейт.. Я призвался помочь человеку и в результате помог ему вставить блок, который призван отбражать фиксированую кнопку в файл темплейта. Для этого мне понадобилось расписать в инструкции такие вещи как: открыть такой-то файл темплейта, затем найти такую-то строчку, перед которой вставить блок <div> с нашей кнопкой, прописать пути и т.д. В итоге этому человеку пользователю пришлось лезть в сырой код и своими непрограммистскими ручками его править. Но разве таким образом должны решаться проблемы? По уму я должен был написать плагин и отправить его ему, а в этом плагие была бы функция, которая сама бы изменила файл шаблона вставив туда САМОСТОЯТЕЛЬНО блок <div>..
    Всё ведь приходит из жизни, и вот такие проблемы заставили меня изобрести данную вещь. Здесь я могу загрузить файл темплейта, должным образом изменить его, а потом сохранить его в уже изменённом виде.. И всё это делается не ручками, заметьте, а в коде. Зачем же тогда придумали компы? Они должны за на работать, а не мы на них.
    Цитата:
    А зачем эта фича нужна? Чтобы жизнь разработчика сладкой не казалась?
    Вот чтобы вася пупкин не лез ручками править свой код и нужна такая фича.
    Цитата:
    Я привел пример шаблона без какой-либо строковой функции, шаблонизаторы типа twig кешируются в аналогтчные php файлы.
    А каким это образом происходит вставка в шаблон? Не надо меня разводить, я в крсе как это происходит в реальности. И ладно бы ещё регулярками не пользорвались, а то ведь юзают..
    Запись от CoderHuligan размещена 25.09.2018 в 13:28 CoderHuligan вне форума
  5. Старый комментарий
    Цитата:
    А каким это образом происходит вставка в шаблон? Не надо меня разводить, я в крсе как это происходит в реальности. И ладно бы ещё регулярками не пользорвались, а то ведь юзают..
    Какие регулярки? Хватит уже троллить, пхп изначально разрабатывался как шаблонизатор и имеет необходимые для этого инструменты, я уже показал выше как выполнить вставку в шаблон с помощью echo (или сокращенной формы <?= ?>)
    Запись от Jewbacabra размещена 25.09.2018 в 17:55 Jewbacabra вне форума
  6. Старый комментарий
    Аватар для CoderHuligan
    Цитата:
    Хватит уже троллить, пхп изначально разрабатывался как шаблонизатор и имеет необходимые для этого инструменты, я уже показал выше как выполнить вставку в шаблон с помощью echo (или сокращенной формы <?= ?>)
    Только так уже практически никто не делает..
    Цитата:
    А какие еще бывают правки в шаблонах, кроме изменения их структуры? Это 90% всех правок.
    Идея сыровата, признаю. Файлы слишком жёстко завязаны друг на друга, а это минус.. Есть и другие пути, о чём позже..
    Запись от CoderHuligan размещена 26.09.2018 в 11:13 CoderHuligan вне форума
    Обновил(-а) CoderHuligan 26.09.2018 в 11:43
  7. Старый комментарий
    Аватар для Curry
    Цитата:
    В файле с шаблоном не должно быть вообще никаких переменных, условий ..., никаких скобочек что куда вставлять! Там должен находится только ЧИСТЫЙ html!
    Хорошая мысль, полагаю что не новая.
    Цитата:
    Код html по прежнему перемешан с ... третьим языком.
    И у вас перемешан. Третий язык - это сама разметка тегов html по строкам которая сразу делает невозможной использование редакторов html, которые заточены на html, а не на html + ваша разметка. Что куда вставлять нужно хардкодить. Ужас. Вам уже написали.
    Шаблон html должен быть обычным html, места вставок в нём должны быть помечены осмысленными метками не мешающими html-редакторам и дизайнерам.
    Запись от Curry размещена 28.09.2018 в 14:15 Curry вне форума
    Обновил(-а) Curry 28.09.2018 в 14:16
  8. Старый комментарий
    Аватар для CoderHuligan
    Цитата:
    Хорошая мысль, полагаю что не новая.
    До сих пор никем не достигнутая.
    Цитата:
    Что куда вставлять нужно хардкодить. Ужас. Вам уже написали.
    Это существенный минус, я признал.
    Цитата:
    Шаблон html должен быть обычным html, места вставок в нём должны быть помечены осмысленными метками не мешающими html-редакторам и дизайнерам.
    Я уже отказался от этой идеи. Мои шаблоны это функции типа:
    PHP
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    
    function sibb_showLogoMenu() 
    {
        global $ContentBuf, $LanguagesPath, $TemplatesPath, $Config, $User, $Skin, $Lang;
        $arr=sibb_getList($TemplatesPath.$Skin.'/logomenu/config.php');
        $txt=sibb_getArr($LanguagesPath.$Lang.'/logomenu_txt.php');
        $l=count($arr);
        $ContentBuf.='
        <table width="100%" cellspacing="6" id="logomenu" border="0">
            <tr>
                <td align="right" valign="bottom" nowrap>';
        for($i=0; $i<$l; ++$i)
        {
            if($arr[$i][$User[3]])
            {
                $ContentBuf.='
                    <img src="./templates/'.$Skin.'/im/'.$arr[$i][7].'" title="'.$txt[$arr[$i][9]].'" border="0" alt="">&nbsp;
                    <a href="index.php?action='.$arr[$i][8].'" title="'.$txt[$arr[$i][9]].'"><b>'.$txt[$arr[$i][10]].'</b>
                    </a>&nbsp; &nbsp;&nbsp;';
            }
        }
        $ContentBuf.='
                </td>
            </tr>
        </table>';
    }
    Это шаблон. Подобные функции шаблонов вызываются через config файл, в котором происходит переключение с одних функций на другие, если потребуется. Таким образом достигается большая гибкость кода без всякого ООП.
    Запись от CoderHuligan размещена 29.09.2018 в 12:04 CoderHuligan вне форума
  9. Старый комментарий
    Аватар для Curry
    Цитата:
    До сих пор никем не достигнутая.
    Как то даже не верится что не достигнуто никем, ни на каком "серверном" языке.
    Цитата:
    Я уже отказался от этой идеи.
    Зря. Разделение HTML и серверного кода хорошая идея.
    Запись от Curry размещена 29.09.2018 в 13:40 Curry вне форума
  10. Старый комментарий
    Аватар для CoderHuligan
    Цитата:
    Как то даже не верится что не достигнуто никем, ни на каком "серверном" языке.
    Ну, я за PHP только базар веду, а насчёт других не знаю как там.
    Цитата:
    Зря. Разделение HTML и серверного кода хорошая идея.
    Да вот я подумал: а какой смысл в том, что я могу изменить html шаблон, вставив туда например другую кнопку, ведь я не смогу откатывать эти изменения если потребуется, так как скрипт ничего не знает об изменениях. Хардкод. А если сделать чтоб узнал, то там такие костылищи будут, что ..
    Поэтому разумней будет делать по-человечески: путём переключение целого шаблона. Если бы я писал на Си, то применил бы указатели на функции, и вызывал бы функции через эти указатели, а здесь приходится через конфиги. Причём у меня вызов функции даже через конфиг не прямой: вызывающая функция знает только алиас другой функции, а какая будет работать в действительности ей по боку.. Никакого жесткача!))
    Все общаются только через алиасы, а алиасы все прописаны в help файле.. Поэтому вообще ненужно разделять html и php. Нужно разделять ответственность функций и обеспечивать их меньшую между собой связность.
    Запись от CoderHuligan размещена 29.09.2018 в 14:32 CoderHuligan вне форума
  11. Старый комментарий
    Аватар для netBool
    Цитата:
    До сих пор никем не достигнутая.
    В ларавел, насколько знаю, есть шаблонизатор Blade, позволяющий вставлять результат кода довольно просто:
    PHP
    1
    
    Hello, {{ $name }}.
    В Symfony есть Twig с аналогичным функционалом
    в Phalcon - Volt (кстати если верить описанию - написанный на Си! - что делает его довольно крутым в плане производительности)
    Есть так же MUSTACHE.

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

    И даже если я чего-то не понял и ваш шаблонизатор совершил революцию, то, на мой взгляд, обсуждение идеи шаблонизаторов под php без указания уже существующих и сравнения с ними - не будет полным
    Запись от netBool размещена 01.11.2018 в 08:20 netBool вне форума
    Обновил(-а) netBool 01.11.2018 в 08:21
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru