Зачем различать $title, $content и прочие $var при передаче? Это, конечно, можно использовать для всяких второстепенных кусочков, но в общем часто используется иерархия шаблонов «снизу вверх». Принцип работы «на пальцах» показан в конце этой статьи: https://gency.ru/g-drive-quick-start (часто отрендеренные блоки делаются доступными по уник. id/ключу для выше стоящих шаблонов; замена значения переменной content – это фишка конкретного движка). --- Добавлено --- И не лепите _once бездумно --- Добавлено --- «Справочники» можно передавать, как вложенные массивы, если хотите структурно различать «основные переменные» страницы и «справочники» (и вы ограничились использованием только одного массива).
Потому что не видел альтернативного варианта. Сейчас задумался. Альтернативы? Внести все эти значения в один массив...Смущает, что самые разные данные упаковываются в один массив. другого выхода пока не вижу. Или же архитектурно по другому, но я ещё этого не вижу. Перечитал три раза, пока что не смог постичь . Пошел исктать туториалы "архитектура view". Спасибо Я задумался. Не могу понять , что противопоставать.
См. приписку из пред. поста: доп. массивы оформляйте, как вложенные массивы или объекты. Сначала отрендери дочерний шаблон, потом воткни результат в родительский (который тоже можно отрендерить). «Плохо» задумались. Там нечего понимать
Мозг человека организован так, что в процессе осознания объекта в сознании появляется образ (класс, сущность). После этого между ячейками памяти в мозге появляются нейронные связи(методы). И при упоминании какого либо слова в сознании человека появляется образ и понимание назначения этого предмета. Это происходит мнгновенно. Если значение слова не понятно, то мозг отказывает в формировании образа и не формируется его назначение(методы). У меня сформировался набор слов и выражений из текста выше, которые не могут сформировать образы и нейронные связи по поводу этих сущностей. я их выделил в массив: [ второстепенные кусочки, иерархия шаблонов, иерархия шаблонов снизу вверх, отрендировать, отрендированные блоки, основные переменные, структурно различать, ] Если можете что то объяснить, то спасибо; если нет, то спасибо за внимание.
отрендировать - в нашем контексте - перевести в данные в HTML-формат, чтоб их мог отобразить браузер отрендированные блоки - соответственно, блоки, в которых после определённого процесса не осталось переменных, а стал чистый HTML структурно различать - понимать разницу между разными элемента иерархия - соотношение, кто родительский, а кто дочерний снизу вверх - от дочерних к родительским второстепенные кусочки - не знаю, что автор имел в виду ))
В рамках иерархии «снизу вверх», конечно, можно делать исключения и подключать одни шаблоны внутри др. обычным способом вроде <?php include __DIR__.'/blocks/block100500.php'; ?>, чтобы не дублировать код, не делать шаблоны слишком громоздкими и т.п.
Не хватает информации для формирования образов Предварительные выводы: - существуют html -шаблоны и они вкладываются один в другой (иерархия); - инклуд используется не как правило а как исключение; Значит, вместо инклуда используется создание объектов класса в котором создаются шаблоны. То есть, в методах класса из html- тегов собираются шаблоны. При таком допущении в папке views лежат классы которые собирают из деталей шаблонов страницы. Правильно ли я сделал вывод? Чтоб расширить в мозге картину ищу в поиске информация по следующим тегам: "рендер php", "php view страницы", "php шаблоны" Правильные ли запросы я сформировал? Если нет, подскажите. Спасибо.
Нет. Для рендеринга достаточно элементарной ф-ции. Просто, чтобы не вызывать ее в контроллере несколько раз, ее можно сделать посложнее. Например, чтобы при вызове с дочерним шаблоном в параметре, в котором прописана связь с родительским, она автоматом обрабатывала все связанные «снизу вверх» шаблоны (ограничителем рекурсии может быть какое-то спец. значение в качестве имени шаблона или, например, одно и то же имя/отсутствие изменения имени на двух соседних уровнях иерархии). --- Добавлено --- Конечно, эта функция может быть частью класса представления, но функции представления часто не оборачиваются в класс, либо методы этого представления оборачиваются в обычные ф-ции. А в папке views обычно лежат только шаблоны. Из-за этого многие даже путают/смешивают понятия «шаблон» и «представление».
Пока что не могу полностью осознать. Нашел пример на https://htmlacademy.ru/tutorial/php/templates, но там нет функции и массива. Пытаюсь разгадать содержание функции и массива. Вот код с сайта: в лейаут выносим общий HTML-код layout.php PHP: <!DOCTYPE html> <html lang="ru"> <head> <title><?= $title; ?></title> <link rel="stylesheet" href="css/style.css"> </head> <body> <header class="main-header"> <h1 class="visually-hidden">Дневник погоды</h1> </header> <div class="main-content"> <main class="content"><?= $content; ?></main> </div> <footer class="main-footer"> Дневник наблюдения за погодой. Все права защищены</footer> </body> </html> Теперь очередь за шаблоном страницы: [main.php] PHP: <div class="content__main-col"> <h2 class="visually-hidden">Последние записи</h2> <a class="button" href="/gif/add">Добавить новую</a> <ul class="items-list"> <?php foreach ($items as $item): ?> <?=renderTemplate('inc/item.php', ['item' => $item]);?> <?php endforeach; ?> </ul> </div> А вот и шаблон блока для показа одной записи: [inc/item.php] PHP: <li class="list-item"> <div class="picture"> <img src="uploads/preview_<?=$item['path'];?>"> </div> <h3 class="desc-title"> <a href="/view?id=<?=$item['id'];?>"><?=$item['title'];?></a> </h3> <div class="desc-data"> <span class="temp"><?=$item['temp'];?></span> </div> </li> index.php: PHP: <?php // двумерный массив со списком записей $items_list = []; // HTML код главной страницы $page_content = renderTemplate('main.php', ['items' => $items_list]); // окончательный HTML код $layout_content = renderTemplate('layout.php', ['content' => $page_content, 'title' => 'Дневник наблюдений за погодой']); // вывод на экран итоговой страницы print($layout_content); Это я пытаюсь додумать содержимое функции и массива: PHP: function renderTemplate($a, $b = array()) { // ?????? include $a; } // $items_list = [ 'items'=>[ 'path'=>'test path', 'id'=>'test id', 'title'=>'test itle', 'temp'=>'test temp' ], 'content'=>'????', 'title'=>['title'=>'title'] ]; Интуитивно чувствую что ответ очень прост, но не получается. Ещё возникает вопрос - а если на одну страницу надо передать множество блоков, скажем штук 10 , такая модель может работать?
https://php.ru/forum/posts/623953/ https://php.ru/forum/posts/561579/ Вот из последнего (на ветвление не обращайте внимания, т.е. делайте без него в ф-ции, о чем мы говорили): PHP: if ($r0['bits']&48) { ob_start(); require PATH.$r0['module'].'.php'; $page['content']=ob_get_clean(); } require PATH.$layout.'.php'; Типа во вложенном можно написать «$layout = 'layout';», задав связь с родителем, о чем я выше писал. --- Добавлено --- Конечно. Почему нет?
Только нужно четко ответить на вопрос, зачем рендерить отдельно. В вашем примере с циклом форыч достаточно обычного include Это как раз тот самый «второстепенный кусочек», который может рендериться обычным путем сверху вниз. --- Добавлено --- А вот, например, виджеты сайдбара можно рендерить отдельно в отдельном процессе и сохранять разметку в файловом кеше, а потом просто считывать эти файлы в отдельные переменные, которые передаются в родительский шаблон.
Привет любителям велосипедов! Писал как-то свой MVC-фреймворк, можно посмотреть примеры кода: Контроллер: https://github.com/WalkWeb/DW-Framework/blob/master/controllers/PostController.php#L46 Рендер вьюхи: https://github.com/WalkWeb/DW-Framework/blob/master/src/NWFramework/Controller.php#L62 P.S. Добавьте автозагрузку классов и использование use Models/CityModel Подгружать классы через include это уж совсем прошлый век.
Возможно надо сделать шаг назад в обучении и проработать рекурсию и многомерные массивы? или что я не понимаю,.. не понимаю?
Рендеринг - преобразование шаблона в готовый html, мы же уже об этом говорили. Шаблонизация - грубо говоря, создание этих самых шаблонов.
Спасибо. Хожу по кругу. Динамически? или мне надо создать 10 блоков для вывода разного из базы в каждом блоке - я создаю , то есть занимаюсь шаблонизацией. создал эти блоки значит у меня создан шаблонизатор. и в рендере эти блоки вставляются каждый в своё место. И получается : ? Я наконец правильно понял терминологию?
Ну да. А за рендерер у нас сам PHP в принципе, мы только говорим ему какие переменные в какой шаблон подставить.
Ну, посмотрите для примера на приведенный мной код с двумя шаблонами (там подключение второго не обернуто ob_-ф-циями по опред. причинам, но вы представьте, что обернуто). Чтобы не вызывать в контроллере два раза ф-цию (по разу для каждого шаблона), можно сделать ф-цию, которая бы при вызове с указанием в параметре только дочернего шаблона рендерила и дочерний, и родительский. Связь с родительским тупо прописывается в дочернем. Если по-прежнему не понятно, пока забейте. Делайте в лоб: PHP: $result = render('layout', ['content' => render('template', $page)] + $page); или PHP: $result = render('layout', array_merge($page, ['content' => render('template', $page)]));
просмотрел материалы на тему создания шаблонизатора . Вот что у меня в результате получилось: PHP: function render($tpl, $var) { if(file_exists($tpl)){ ob_start(); extract($var); require $tpl; return ob_get_clean(); } } $menu = render('menu.php', ['cat'=>$cat]); $main = render('main.php', ['menu'=>$menu, 'content_main'=>$content_main]); $content = render('content.php', ['content'=>$main, 'title'=>'My Render', 'result'=>$res]); echo $content; Какие достоинства и недостатки такой систем? Как улучшить или есть принципиально лучший вариант?
В чём риски\проблемы? : 1. угроза безопасности приложения? 2. негативное влияние на скорость работы приложения? 3. противоречит принципам mvc и при командой работе вызовет раздражение 4. впоследствии будет трудно найти 5. другое.
Ну, например, что там за меню? Если это сквозное меню сайта, контроллер о нем знать не должен. См., что я выше писал про виджеты сайдбара. С меню аналогично.
@viktor72 Везде дублирование кода будет. https://platesphp.com/ - вот смотри тут, фактически, необходимый минимум для нормальной шаблонизации на чистом PHP. --- Добавлено --- Если аналог не потянешь, подойдёт включать всякие там меню прямо в шаблоне через include
ничего не понимаю. --- Добавлено --- английский слабо знаю. гугл перевел своеобразно. Это готовый шаблонизатор. я хочу разобраться как всё работает, пока не хочу использовать готовое решение. Спасибо.