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

Шаблоны в PHP (продолжение)

Запись от CoderHuligan размещена 18.10.2018 в 10:57
Обновил(-а) CoderHuligan 18.10.2018 в 12:50

Возникшая дискуссия в прошлой записи этого блога побудила меня продолжать поиск. Участник форума Curry ответил на моё замечание о том, что я отказался от прошлого варианта так:
Цитата:
Зря. Разделение HTML и серверного кода хорошая идея.
Продолжив экспериментировать и размышлять я пришёл к варианту шаблонов, который будет описан ниже.
В той дискуссии Jewbacabra, отмечал, что сложно менять структуру шаблона. Я согласился с этим. И я нашёл выход. В новом варианте сохранены положительные качества прошлого варианта, такие как:
1) HTML и PHP полностью разделены. В отличии от smarty в файле с шаблоном абсолютно отсутствует какая бы то ни была логика вывода. Вся логика собрана в отдельном php файле.
2) Создаётся возможность динамически изменять отдельные элементы html кода, что отсутствует в других вариантах шаблонов. Это огромное преимущество ибо в файлах с логикой абсолютно отсутствует какой-либо html, даже мало малейший.
Под отдельными элементами я имею ввиду самостоятельные неделимые части html, которые можно использовать без изменения их структуры, путём простой замены одного на другой. Об этом ниже.

Итак имеем файл шаблона например logomenu.html:
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<table width="100%" cellspacing="6" id="logomenu" border="0">
    <tr>
        <td align="right" valign="bottom" nowrap>
            {menulinks}
        </td>
    </tr>
</table>
[@]
<img src="./templates/{skin}/im/{img_file_name}" title="{text1}" border="0" alt="">
&nbsp;
<a href="index.php?action={action}" title="{text1}">
    <b>
        {text2}
    </b>
</a>
&nbsp; &nbsp;&nbsp;
Код из реального проекта.
Элементы, которые заключены в скобки {} например {menulinks} позже будут заменены на другие элементы, текст, ссылки и т.п. Если то, что будет заменено сам является html кодом, то он прописывается после разделителя [@], который является сепаратором массива элементов в данном файле с шаблоном. Как это работает будет показано ниже.
Можно было бы каждый отдельный неделимый элемент прописывать в своём собственном файле, но так удобнее и нагляднее, хотя требует отдельного документа, где обьясняется что куда вставляется.

Логика вывода прописывается в отдельной функции и это уже не шаблон:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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');
    $tpl=sibb_loadTpl($TemplatesPath.$Skin.'/logomenu/logomenu.html');
    $l=count($arr);
    $menulinks='';
    for($i=0; $i<$l; ++$i)
    {
        if($arr[$i][$User[3]])
        {
            $menulinks.=str_replace(array('{skin}','{img_file_name}','{text1}','{action}','{text2}'), array($Skin,$arr[$i][7],$txt[$arr[$i][9]], $arr[$i][8], $txt[$arr[$i][10]]),$tpl[1]);
            
        }
    }
    $ContentBuf.=str_replace('{menulinks}', $menulinks, $tpl[0]);
}
Функция sibb_loadTpl():
PHP
1
2
3
4
5
6
7
8
9
function sibb_loadTpl($fl)
{
    if(!($f = fopen($fl, "rb")))die();
    flock ($f,LOCK_SH);
    $buf = fread( $f, filesize($fl));
    flock ($f,LOCK_UN);
    fclose($f);
    return explode("[@]", $buf);
}
загружает файл с шаблоном. На выходе - массив неделимых элементов коих может быть много, здесь показан простой лёгкий вариант.
Бенчмарки показали, что скорость str_replace() более чем приемлема даже на 5000 замен, что конечно нереально.

В таком варианте шаблонов полностью разделено представление от логики, поэтому отдельные части html можно легко менять сторонним кодом, или полностью менять папку с шаблоном, тем более что вся логика вынесена, в отличии от смарти из шаблонов.
Структуру такого шаблона легко изменять даже не зная PHP. Хотелось бы услышать критику, которая позволила бы что-либо улучшить, как и мнения заинтересованных в данном вопросе людей.
Добавлю. Изюминка в том, что мы применяем к шаблонам принцип data-driven programming. Например, если между элементами меню нуже видимый сепаратор, например точка -
HTML5
1
&middot;
то мы его не пишем в php, а просто прописываем его в файле с шаблоном после сепаратора [@]
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<table width="100%" cellspacing="6" id="logomenu" border="0">
    <tr>
        <td align="right" valign="bottom" nowrap>
            {menulinks}
        </td>
    </tr>
</table>
[@]
<img src="./templates/{skin}/im/{img_file_name}" title="{text1}" border="0" alt="">
&nbsp;
<a href="index.php?action={action}" title="{text1}">
    <b>
        {text2}
    </b>
</a>
&nbsp; &nbsp;&nbsp;
[@]
&middot;
Теперь если разделитель меню нужно изменить меняем его только в файле с шаблоном, а в коде php он легко доступен из массива.
Размещено в Без категории
Просмотров 400 Комментарии 2
Всего комментариев 2
Комментарии
  1. Старый комментарий
    Все это не ново (тот же бородатый Smarty).
    Приходилось на практике с разными вариантами сталкиваться и с опытом я прихожу к другой мысли. Все ниже на правах ИМХО.
    Все эти "сказки" про то, что верстальщику не надо учить ЯП вроде как логичны. Но.
    1. Вот какая разница запомнить {text2} или <?=$text2;?> да собственно ни какой. Не требуется в шаблонах программировать классы или какие то супералгоритмы. Вывод, циклы, условия, подключения блоков/модулей/компонентв. Так или иначе это есть везде, и от того как это выглядит сути не меняется: создающий шаблон должен знать как это делается.

    2. Исходя из выше перечисленного, все эти str_replace (а, кстати, как выводить в вашем варианте строки в той же таблице с неизвестным количеством строк и столбцов), лишь дополнительная нагрузка (и не важно их быстродействие), которая все го лишь заменяет использование PHP на другой "язык". Т.е. в плане скорости формирования страницы здесь 0 сравнивается с парсингом, который точно больше 0.

    Т.е.
    Цитата:
    Структуру такого шаблона легко изменять даже не зная PHP.
    Но вы должны знать "язык" этого шаблона. Тут сравнение передернутое. Для шаблонов нет необходимость знать весь PHP. Достаточно знать ограниченую его часть. Можно даже сказать верстальщику что это не PHP, а просто такой синтаксис.
    Запись от voral размещена 08.11.2018 в 09:07 voral вне форума
  2. Старый комментарий
    Аватар для CoderHuligan
    Цитата:
    Сообщение от voral Просмотреть комментарий
    Исходя из выше перечисленного, все эти str_replace (а, кстати, как выводить в вашем варианте строки в той же таблице с неизвестным количеством строк и столбцов), лишь дополнительная нагрузка (и не важно их быстродействие), которая все го лишь заменяет использование PHP на другой "язык". Т.е. в плане скорости формирования страницы здесь 0 сравнивается с парсингом, который точно больше 0.
    Да. Я пришёл к такому же выводу. У меня теперь всё намного проще.))
    Запись от CoderHuligan размещена 27.11.2018 в 17:44 CoderHuligan вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru