[Вопрос] Layout своими руками

349
.
КоханийВолодимир
Здравствуйте дорогие джоновцы и люди которые мне помогают)
Пишу одну хрень и понадобилось реализовать так называемый 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>
.
Ей 25
Delphinum, это как у тебя на Гите?
.
ValekS, да, то же самое, только в облегченном виде
.
КоханийВолодимир
Сам уже сделал. Хз почему я думал что это тяжело(
Но спасибо, за то что помогали)
Всего: 7