Twig и WordPress

adm
Карма
0

4 года назад | #210

Кто когда-либо работал с MVC фреймворками и решил (был вынужден) внезапно перейти на чистый PHP, знает насколько невыносимая это пытка снова программировать перемешивая PHP и HTML.

С такой проблемой столкнулся и я, когда решил, что разработаю этот портал на CMS WordPress. Я долгое время программировал сначала на CakePHP, а потом на Symfony, и во время работы с WP мне действительно не хватало архитектуры MVC. Даже были моменты когда думал полностью удалить WP и разработать портал на Symfony, и единственное что меня от этого воздерживало это WP back-end. Вряд-ли мне хватило бы время ближайшие месяцы написать что-то подобное. Поэтому я все же решил остаться на WP и найти другое решение.

К моему огромному счастью, мне удалось найти плагин под названием Timber, который позволяет работать с Twig в среде WP.

Что такое Twig

Twig is a template engine for the PHP programming language. Its syntax originates from Jinja and Django templates. It's an open source product licensed under a BSD License and maintained by Fabien Potencier. The initial version was created by Armin Ronacher. Symfony2 PHP framework comes with a bundled support for Twig as its default template engine

Это тема посвящена системе Twig (в среде WP).

adm
Карма
0

4 года назад | #6499

Timber просто плагин, который подключает Twig к WP, т.е. на самом деле вы работаете с той же самой библиотекой Twig, которая присутствует например в Symfony. Есть небольшое отличие из-за архитектуры WP. Например в Symfony данные в шаблон передавались следующим образом:


class ArticleController extends Controller
{
    public function recentArticlesAction($max = 3)
    {
        // make a database call or other logic
        // to get the "$max" most recent articles
        $articles = ...;

        return $this->render(
            'article/recent_list.html.twig',
            array('articles' => $articles)
        );
    }
}

В среде WP вам необходимо context настроить в ручную, следующим образом:

// single.php
$context = Timber::get_context();
$context['post'] = new TimberPost();
Timber::render('single.twig', $context);

А в шаблоне single.twig никаких отличий нет - работаете с переменной post.

{# single.twig #}
{% extends "base.twig" %}
{% block content %}
    <div class="content-wrapper">
        <article class="post-type-{{post.post_type}}" id="post-{{post.ID}}">
            <section class="article-content">
                {% block headline %}
                    <h1 class="article-h1">{{post.title}}</h1>
                    <h2 class="article-h2">{{post.subtitle}}</h2>
                {% endblock %}
                <p class="blog-author"><span>By</span> {{ post.author.name }} <span>&bull;</span> {{ post.post_date|date }}</p>
                {{post.content}}
            </section>
        </article>
    </div> <!-- /content-wrapper -->
{% endblock %}
adm
Карма
0

4 года назад | #6498

Преимущество этого подхода в том, что в среде WP вы можете польностью отделить PHP код от HTML.

При использовании Timber вам больше не придется встраивать всякие while-loop-ы и php условия в HTML, это во первых. А во вторых, Twig автоматически защищает вас от XSS-injection. В третьих, Timber (а не Twig) содержит несколько встроенных класс, которые очень сильно упрощают работу с объектами WP.

Кстати,  недавно я сообщал об обновлении сайта, так вот, это касалось именно перехода на Twig.

Войдите в свой аккаунт, чтобы ответить в данной теме.