Для получения полного доступа
зарегистрируйтесь

Еще один мини шаблонизатор на php


У меня на работе появилась задачка сделать небольшой проект, для простого просмотра картинок из папок локальной сети.. И как то так само собой сложилось, что я написал вот такой класс для рендеринга видов ( просто я люблю Yii2 да и вообще MVC ). Вот решил поделиться и спросить у занющих людей насколько рабочим в реальных проектах был бы этот класс??? Возможно ли решить задачу по другому?? Просто это первое что пришло в голову и есть сомнения в качестве...

Реализацию yii2 рендеринга не смотрел, так как само как то получилось... но посмотрю как нибудь обязательно...

Еще дополню, в проекте не использовался вообще никакой фреймворк... просто приложение на PHP.

После знакомства с Yii рендерингом заменил все таки eval на require, потому что так получается на одну строку меньше =)

После некоторого времени работы с этим классом решил добавить в него возможность рендеринга множественных файлов, чтобы можно было до вывода страницы добавить контент из разных файлов, плюс добавить какие-нибудь файлы для рендеринга из самих файлов видов.

class Renderer
{
    private $meta       = array();
    private $js         = array();
    private $css        = array();
    private $data       = array();
    private $view_files = array();
    private $title      = '';
    private $encoding   = 'utf-8';
    private $layout;
    private $interpreted_code;

    public function __construct($layout_file)
    {
        if (is_file($layout_file)) {
            $this->layout = $layout_file;    
        } else {
            throw new \Exception('layout file is required!');
        }
    }
    
    public function showPage()
    {
        $this->prepareContent();
        echo $this->interpreted_code;
    }
    
    public function file($view_file, $variables = array())
    {
    	$this->view_files[] = [
        	'file' => $view_file,
            'vars' => $variables
        ];
    }
    
    private function prepareContent()
    {
        $content = '';
        foreach ($this->view_files as $block) {
            $content .= $this->renderPartial($block['file'], $block['vars']);
        }
        $this->interpreted_code = $this->renderPartial(
            $this->layout, compact('content')
        );
    }

    private function renderPartial($file, $vars = array())
    {
        ob_start();
		ob_implicit_flush(false);
        extract($vars, EXTR_OVERWRITE);
        require $file;
        return ob_get_clean();
    }
    
    private function addMeta($name, $content)
    {
        $this->meta[] = [
            'name'    => $this->encode($name),
            'content' => $this->encode($content)
        ];
    }
    
    private function registerCssFile($file)
    {
        $this->css[] = $this->encode($file);
    }

    private function registerJsFile($file)
    {
        $this->js[] = $this->encode($file);
    }

    private function head()
    {
        $header = '<meta charset="' . $this->encode($this->encoding) . '" />'
            . '<title>' . $this->encode($this->title) . '</title>';

        foreach ($this->meta as $meta) {
            $header .= '<meta name="' . $meta['name']
                . '" content="' . $meta['content'] . '" />';
        }

        foreach ($this->js as $js) {
            $header .= '<script type="text/javascript">' . $js . '</script>';
        }

        foreach ($this->css as $css) {
            $header .= '<link rel="stylesheet" href="' . $css . '" />';
        }
        
        return $header;
    }

    private function encode($param)
    {
        return htmlspecialchars($param, ENT_QUOTES | ENT_SUBSTITUTE, $this->encoding);
    }
}

Хочется заметить, что теперь есть два способа рендеринга отедельных файлов, либо делать это из вызывающего кода методом Renderer::file() либо из кода шаблона методом Renderer::renderPartial().

При использовании этого класса в контроллере или роутере можно использовать вот такой код

$render   = new Renderer('layout.php');

$some_var = 'Что-то передаем в вид';
$render->file('home.php',
        compact('some_var'));
        
$render->showPage();
// layout.php
<html>
	<head>
    	$this->head()
    </head>
    <body>
    	<?= $this->renderPartial('header.php') ?>
    	<?= $content ?>
    </body>
</html>
// Внутри вида
<?php
$this->title = 'hello world';
$this->registerCssFile('css/style.css');
?>
<h1>
<?= $some_var ?>
</h1>

Чтобы увидеть комментарии, нужно быть участником сообщества

Регистрация