YII2: Использование шаблонизатора Twig + Темы

Предварительное обсуждение найденных ошибок перед отправкой их авторам фреймворка, а также внесение новых предложений.
Ответить
khaperets
Сообщения: 18
Зарегистрирован: 2014.03.12, 00:25

YII2: Использование шаблонизатора Twig + Темы

Сообщение khaperets »

Здравствуйте!

Есть парочка предложений по поводу расширения yii2-twig:

1. Загрузчик файлов для твига должен быть Twig_Loader_Filesystem, так как в нем есть поддержка неймспейсов.
А они (неймспейсы) очень помогают не путаться в расположении шаблонов + более короткий и красивый путь к файлу.
Например:

Код: Выделить всё

{% extends "@layouts/common.twig" %}
Для этого нужно в классе \yii\twig\ViewRenderer добавить свойство

Код: Выделить всё

public $namespaces = []; 
и в конце (пофик где, главное чтобы перед вызовом $this->twig->render()) метода init:

Код: Выделить всё

$loader = new Loader\Filesystem;

foreach ($this->namespaces as $dir => $namespace) {
    if ($path = \Yii::getAlias($dir, false)) {
        $loader->addPath($path, $namespace);
    }
}

$this->twig->setLoader($loader); 
класс Loader\Filesystem унаследован от Twig_Loader_Filesystem.
Таким образом в конфиге, можно указывать неймспейсы:

Код: Выделить всё

    'view'         => [
        'defaultExtension' => 'twig',
        'theme'            => [
            'basePath' => '@app/themes/default',
            'baseUrl'  => '@web/themes/default'
        ],
        'renderers'        => [
            'twig' => [
                'class'      => '\yii\twig\ViewRenderer',
                'cachePath'  => '@runtime/twig/cache',
                'globals'    => [
                    'html' => '\yii\helpers\Html'
                ],
                'filters'    => [
                    'dump'       => '\yii\helpers\BaseVarDumper::dump'
                ],
                'namespaces' => [
                    '@app/themes/default/views/layouts' => 'layouts',
                    '@app/views/layouts'                => 'layouts',
                    '@app/themes/default/views'         => '__main__',
                    '@app/views'                        => '__main__'
                ]
            ]
        ]
    ]
На заметку: 'defaultExtension' => 'twig' позволяет не указывать в методе контроллера при вызове render расширение файла (.twig).
2. Расширить загрузчик Twig_Loader_Filesystem, переопределив метод normalizeName:

Код: Выделить всё

class Filesystem extends \Twig_Loader_Filesystem
{

    protected function normalizeName($name)
    {
        return parent::normalizeName(strtr($name, PATH_SEPARATOR, DIRECTORY_SEPARATOR));
    }

}
Это для того, чтобы можно было в пути к файлам использовать : (двоеточие) как разделитель директорий.
Пример:

Код: Выделить всё

{% extends "@layouts:common.twig" %}
PS. Идея навеяна Symfony. Для глаз такой путь приятней разбирать ;)
Последний раз редактировалось khaperets 2014.03.12, 01:14, всего редактировалось 1 раз.
khaperets
Сообщения: 18
Зарегистрирован: 2014.03.12, 00:25

Re: YII2: Использование шаблонизатора Twig + Темы

Сообщение khaperets »

Еще были вопросы:
1. Где лучше хранить свой унаследованный от \yii\web\Controller абстрактный класс контроллера? В app/components?
2. Где можно почитать максимально больше информации о темах для Yii2?
3. Есть ли сборщик статики? То есть: все css-файлы или js-файлы собираются в один (+ сжатие, по желанию), и в шаблоне автоматически вызывается скомпилированный css или js-файл.
khaperets
Сообщения: 18
Зарегистрирован: 2014.03.12, 00:25

Re: YII2: Использование шаблонизатора Twig + Темы

Сообщение khaperets »

Ах да, еще в классе \yii\twig\ViewRenderer нужно отключить дефолтный layout приложения:

Код: Выделить всё

Yii::$app->layout = false;
Это позволит использовать привычно Twig-шаблоны. К примеру:

Код: Выделить всё

{% extends "@layouts:common.twig" %}

{% block content %}
    Hi, {{ name }}!
{% endblock %}
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: YII2: Использование шаблонизатора Twig + Темы

Сообщение samdark »

Предложение дельные. Уже почитал в виде pull-request-а.

По вопросам:

1. Да.
2. Пока только гайд. Если есть вопросы, создавайте отдельные топики, отвечу.
3. Да. В гайде есть.
Ответить