Форум программистов, компьютерный форум, киберфорум
Наши страницы
CoderHuligan
Войти
Регистрация
Восстановить пароль
Оценить эту запись

Шаблоны в php(окончание)

Запись от CoderHuligan размещена 01.11.2018 в 07:16
Обновил(-а) CoderHuligan 01.11.2018 в 10:27

Вариант который я предложил в прошлой записи блога, всё-таки имеет свои ограничения.
Дело всё в том, что логика вывода 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($Skin, $Lang) 
{
    $LogomenuConfig=include(SHOWTOOLS.'logomenu/config.php');
    $LogomenuTxt=include(LANGUAGES.$Lang.'/logomenu_txt.php');
    $l=count($LogomenuConfig);
    $menulinks='';
    for($i=0; $i<$l; ++$i)
    {
        $menulinks.='
        <img src="./templates/'.$Skin.'/im/'.$LogomenuConfig[$i]['imgname'].'" title="'.$LogomenuTxt[$LogomenuConfig[$i]['titletext']].'" border="0" alt="">
        &nbsp;
        <a href="index.php?action='.$LogomenuConfig[$i]['action'].'" title="'.$LogomenuTxt[$LogomenuConfig[$i]['titletext']].'">
            <b>'.$LogomenuTxt[$LogomenuConfig[$i]['menutext']].'</b>
        </a>
        &nbsp; &nbsp;&nbsp;';
    }
    return '
    <table width="100%" cellspacing="6" id="logomenu" border="0">
        <tr>
            <td align="left" valign="bottom" nowrap>
                '.$menulinks.'
            </td>
        </tr>
    </table>';
}
На выходе функции сформированный html код, который потом собирается в другой функции.
Миф о том, что якобы должны существовать два программиста обязанности одного из которых должны заключаться в дизайне, другого в логике, не подтверждается практикой. Это всего лишь миф. Человеку, ни на йоту не знакомому с php в общем то нечего делать в web программинге. Этим должны заниматься профессионалы, а не любители. Если сайт статичный, то да, такой подход приемлем. Человек знает только html и всё. Этого ему хватает. А если сайт динамичный, то пытаться с ним совладать не зная cgi это утопия. Ему всё равно придётся учить хотя бы язык шаблонов - по сути совершенно отдельный язык программирования. Доходит до абсурда: люди изобретают третий язык для представления шаблонов, чтобы не дай бог дизайнер не выучил простой php. Но это же БРЕД и бредом погоняет! ))
---------------
Одним словом нужно не отделять html от php, а отделять функции вывода от функций, которые подготавливают контент!!!
К тому же, такая концепция, при которой функции вывода отделены от функций, которые подготавливают контент, позволяет программировать по компонентному принципу и полностью отказаться от ООП!
Никаких глобальных переменных, за исключением системных, и может быть путей в виде констант.
Все значения передаются посредством параметров функций. Иерархический метод группировки функций-компонентов позволяет легко структурировать программу. Чем ближе к вершине, тем меньше компонентов.
Размещено в Без категории
Просмотров 322 Комментарии 7
Всего комментариев 7
Комментарии
  1. Старый комментарий
    А тут получается вообще верстка это программирование. На мой взгляд перекос в другую сторону. На сложном проекте это уже вообще зло...
    Да даже вот эта функция. Какой смысл выносить в цикл, а потом клеить?. Чтобы верстка была менее наглядна? Т.е. находясь на 9-16 строке мы должны помнить, что это все внутри td. А зачем и ради чего? При этом подсветка черти какая. Не легче обернуть все в функции ob_* и оставить как есть: вывели table, потом набираем содержимое, потом закрываем.... Стоп. И тут приходим что мы убрали в функцию тупо кусок шаблона.... Точнее избавились от шаблона ради функции.... А зачем? Ради чего?

    ИМХО, не надо городить огород ради мнимого феншуя. Практики отделения функционала от шаблонов обкатаны и в целом все очень похожи, по большому счету разница только в синтаксисе. Применение всяких решений убирающих php из шаблона это лишь искусственное ограничение. На самом деле просто достаточно не начинать в шаблонах закладывать мегаалгоритмы. Только непосредственное обслуживание вывода подготовленной информации
    Запись от voral размещена 08.11.2018 в 09:18 voral вне форума
    Обновил(-а) voral 08.11.2018 в 15:19
  2. Старый комментарий
    Аватар для CoderHuligan
    Извините, что поздно отвечаю, так как форум не уведомляет меня о комментах в блоге.
    Цитата:
    Сообщение от voral Просмотреть комментарий
    Да даже вот эта функция. Какой смысл выносить в цикл, а потом клеить?. Чтобы верстка была менее наглядна? Т.е. находясь на 9-16 строке мы должны помнить, что это все внутри td. А зачем и ради чего? При этом подсветка черти какая.
    Да, - вы правы. Но в данном конкретном случае это позволяет отделить блок элементов меню, от контейнера таблицы, так как переменная $menulinks в своём имени ясно отражает природу её содержимого. Если бы вставка шла в одну и ту же переменную, то это было бы менее ясным.

    Цитата:
    Сообщение от voral Просмотреть комментарий
    Стоп. И тут приходим что мы убрали в функцию тупо кусок шаблона.... Точнее избавились от шаблона ради функции.... А зачем? Ради чего?
    Дело в том, что у меня шаблоны в виде функций. Функции позволяют скрывать внутренние переменные, что облегчает кодинг и повышает багоустойчивость скрипта. Это похоже на то, как реализованы шаблоны в известном форумном движке SMF. Сейчас эта функция выглядит намного проще:
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    
    <?php if(!defined('SIBB_OK')){die('Access denied!');}
     
    function sibb_logomenuTpl()
    {
        global $Skin;
    ?>
        <table width="100%" cellspacing="6" id="logomenu" border="0">
            <tr>
                <td align="left" valign="bottom" nowrap>
                
                    <img src="./templates/<?php echo $Skin?>/im/help.gif" title="Переход на страницу помощи" border="0" alt="">
                    &nbsp;
                    <a href="index.php?action=15" title="Переход на страницу помощи">
                        <b>Помощь</b>
                    </a>
                        &nbsp; &nbsp;&nbsp;
                        
                    <img src="./templates/<?php echo $Skin?>/im/members.gif" title="Пользователи" border="0" alt="">
                        &nbsp;
                    <a href="index.php?action=15" title="Список пользователей форума">
                        <b>Пользователи</b>
                    </a>
                    &nbsp; &nbsp;&nbsp;
     
                    <img src="./templates/<?php echo $Skin?>/im/rules.png" title="Правила" border="0" alt="">
                    &nbsp;
                    <a href="index.php?action=15" title="Прежде чем использовать данный форум внимательно прочитайте правила!">
                        <b>Правила</b>
                    </a>
                        &nbsp; &nbsp;&nbsp;
     
                    <img src="./templates/<?php echo $Skin?>/im/search.gif" title="Поиск" border="0" alt="">
                    &nbsp;
                    <a href="index.php?action=15" title="Поиск по форуму">
                        <b>Поиск</b>
                    </a>
                    &nbsp; &nbsp;&nbsp;
        
                </td>
            </tr>
        </table>
    <?php
    }
    sibb_logomenuTpl();
    ?>
    После описания сразу следует её вызов. И прописывается она в своём файле. Файл просто инклюдится в нужном месте. Как видно здесь я избавился от конфига в котором прописаны все менюшки и отказался от языковой поддержки, так как движок планируется чисто русскоязычным.
    Если нужно изменить шаблон, меняем функцию.
    Изначала намерением было сделать навороченный движок с языковой поддержкой и пр. Однако таких движков пруд пруди, а простых и понятных как заклёпка мало, а такие как раз нужны многим. Делаю чисто для своего сайта, для себя, и мне побоку универсальные решения. Если мне нужно будет вставить пункт меню, то я сделаю это прямо в этом файле. Зачем постоянно греть конфиги, да и сервер?
    Это путь дзен: избавление от всего лишнего..
    Похоже, что это может быть и окончательный вариант.. PHP сам по себе шаблонизатор, и подсветка работает как надо. А как бы вы поступили?
    Запись от CoderHuligan размещена 27.11.2018 в 18:12 CoderHuligan вне форума
    Обновил(-а) CoderHuligan 28.11.2018 в 13:42
  3. Старый комментарий
    По этому куску трудно судить. (тут вообще практически статика, ради которой нет смысла функцию пилить) Если у вас "логоменю" присутствует на странице всегда и на одном месте, то я даже выделять бы не стал. Т.е. ваша ф-ия по сути это подключение некоего компонента. (код упрощеный - просто чтоб показать подход)
    PHP
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    function includeComponenet($componentName, $componentTemplateName, $componentOptions) {
    // используем автозагрузку классов
         $component = new $componentName;
         $arData = $component->getData($componentOptions); // тут получаем, собираем, формируем 
                                                                                    // данные необходимые для вывода
         $templateFile = sprintf(
                  '%s/comps/%s/%s/template.php',
                  $siteTemplate, // название он же каталог шаблона всего сайта
                  $componentName, // имя компонента
                  $componentTemplateName // шаблон компонента
         );
         require $templateFile; // там доступны наши $arData$component, $componentName,
                                        // $componentTemplateName, $componentOptions и это просто
                                       // html файл в котором для вывода используется минимально необходимый php
    }
    Все компоеннты наследники одного класса. Возможно даже подключение шаблона убрал бы внутрь....

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

    При этом если вы решите, что php в html не надо вплетать переделаете в шаблонах (которые будут собраны в одном каталоге и его подкаталогах) все echo $myVar; на %myVar% и вместо require в одном месте сделаете парсер....
    Запись от voral размещена 28.11.2018 в 16:07 voral вне форума
    Обновил(-а) voral 28.11.2018 в 16:12
  4. Старый комментарий
    Аватар для CoderHuligan
    Цитата:
    Сообщение от voral Просмотреть комментарий
    тут вообще практически статика, ради которой нет смысла функцию пилить
    Это в данной конкретной функции так. Взял самую простую. А в других есть свои переменые, поэтому и обёрнуто всё в функции.
    Цитата:
    Сообщение от voral Просмотреть комментарий
    Т.е. ваша ф-ия по сути это подключение некоего компонента.
    Так оно и есть. А для сокрытия информации шаблон обёрнут в функцию.
    Цитата:
    Сообщение от voral Просмотреть комментарий
    Т.е. я могу "переключать" и шаблон всего сайта, и шаблон отдельного компонента. Т.е. тут "скин" более широкое понятие. И все компоненты подключаются стандартно.
    Понятно. Скорее всего вы пользуетесь традиционными шаблонизаторами и ООП. А я не пользуюсь ни тем ни другим. Хотя элементы ООП и присутствуют в моём коде, но они лишь отдельные элементы, а не основа. основа это процедурный подход, или по правильному компонентный. Не только класс скрывает информацию, но и обычная функция, причем делает это автоматически, естественно, не налагая никаких дополнительных расходов.
    И я могу на лету менять шаблоны, причём для каждого юзверя отдельно.
    А вам по всей видимости, придётся валидировать компоненты путей, прежде чем передавать их в вашу функцию, или делать это в самой функции. У меня все пути прописаны через дефайны, константно.
    Запись от CoderHuligan размещена 28.11.2018 в 16:26 CoderHuligan вне форума
  5. Старый комментарий
    Ну ООП тут постольку по скольку. Можете include использовать и функции.
    Шаблоны как раз в моем случае гораздо легче менять (по крайней мере нагляднее) функция вообще не меняется. Изменяется параметр и все. То что у вас пути прописаны особо ни чего не меняет. Вы исходите из того, что вы не забыли его прописать, если я буду исходить из тех же соображений - ни чего проверять не буду. Ведь по аналогии вам тоже надо тогда проверять, а "существует ли такая функция?"
    Запись от voral размещена 28.11.2018 в 16:32 voral вне форума
  6. Старый комментарий
    При этом сомттрите вам понадобилось по сути то же самое меню но немного другая верстка.. У вас будет новая функция включая сбор/расчет переменных. И разница только в верстке, в моем случае просто параметр...
    Если же вы выделите в ф-ию только верстку (а подготовка в другой ф-ии), то у вас не будет особо отличаться от моего варианта. Только если мой файл открыть там будет всеже html. В Вашем html но обернутый в функцию.... оба фала будут инклудится и какой смысл в функции тогда?
    Запись от voral размещена 28.11.2018 в 16:36 voral вне форума
  7. Старый комментарий
    Аватар для CoderHuligan
    Цитата:
    Сообщение от voral Просмотреть комментарий
    В Вашем html но обернутый в функцию.... оба фала будут инклудится и какой смысл в функции тогда?
    Смысл в том, что у меня каждая функция tpl сама подготавливает переменные с контентом. Возможно, что такой подход и является неверным..
    Скорее всего, первоначальный вариант был более правильным..
    Запись от CoderHuligan размещена 28.11.2018 в 16:51 CoderHuligan вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru