Здравствуйте дорогие джоновцы и люди которые мне помогают)
Пишу одну хрень и понадобилось реализовать так называемый Layout, люди которые работают с фреймворками должны понять. Мне нужно вставлять код в средину html страницы - грубо говоря. Но голова не варит как это сделать, то есть есть идея искать какой-то ранее заданный тег в main шаблоне страницы и заменять его, но верный ли это путь - хз.
Пока что создан простой метод для вывод файла шаблона и передача в него данных:
public function view($template, $data = [])
{
foreach($data as $key => $value) {
$$key = $value;
}
if(!is_readable(ROOT.$template)) {
exit('Template '.$template.' does not exist');
}
require ROOT.$template;
}
Буду благодарен за наводки в этом вопросе рейтингом в вк
Ну лично сталкивался с тремя способами реализация лайота:
1. Через extends в шаблонизаторе, типа smarty
{extends "layout/default.tpl"}
{block "content"}
<div>
...
</div>
{/block}
2. Через вкладывание одного шаблона в другой на уровне контроллера:
public function indexAction(){
...
$this->layout('layout/default.tpl');
return new ViewModel([...])->setTemplate('page/index.tpl');
}
3. Через декларацию лайота в шаблоне:
<?php $this->layout('layout/default.tpl') ?>
<div>
...
</div>
Какой тебе больше нравится?
Ну как вариант можно так:
Сам шаблонизатор:
class Template{
protected $file;
protected $data;
public function __construct($file, array $data = []){
$this->file = $file;
$this->data = $data;
}
public function __toString(){
extract($this->data);
ob_start();
include($this->file);
return ob_get_clean();
}
}
Страница:
<div>
<?= $data ?>
</div>
Layout:
<!DOCTYPE html>
<html>
<head>
<title><?= $title ?></title>
<meta charset="utf-8" />
</head>
<body>
<?= $content ?>
</body>
</html>
Используется так:
$page = new Template('page.html', ['data' => 'Hello world']);
$layout = new Template('layout.html', ['title' => 'Test title', 'content' => $page]);
echo $layout;
На выходе получается так:
<!DOCTYPE html>
<html>
<head>
<title>Test title</title>
<meta charset="utf-8" />
</head>
<body>
<div>
Hello world
</div>
</body>
</html>
Delphinum, это как у тебя на Гите?
ValekS, да, то же самое, только в облегченном виде
Сам уже сделал. Хз почему я думал что это тяжело(
Но спасибо, за то что помогали)