M é m o - l a b .
Le principe est le même que celui abordé dans le chapitre précédent (Modèle Vue/Controller – Approche), en utilisant la librairie Timber.
Dans functions.php, appeler l’autoload de composer (vendor/autoload.php) :get_tempate_part('vendor/autoload')
;
Installation de Timber : depuis une console, se placer au niveau du thème et lancer les commandes :composer init
composer req timber/timber
Dans le fichier composer.json, rajouter la partie concernant l’autoload pour définir l’emplacement des fichiers correspondants à un espace de nom donné :"autoload": {
Pour le schéma de structure des fichiers, se rapprocher du chapitre précédent Modèle Vue/Controller – Approche. Timber étant basé sur le moteur de template twig, le fichier de configuration n’est plus nécessaire. Le dossier par défaut utilisé pour accueillir les vues est views.
"psr-4": {
"App\\Controller\\": "./"
}
}
Controller.php
<?php
namespace App\Controller;
class Controller
{
public function __construct() {
$timber = new \Timber\Timber();
$this->index();
}
}
front-page.php
<?php
namespace App\Controller;
class FrontpageCtrl extends Controller
{
public function index() {
$context = \Timber::context();
$posts = \Timber::get_posts([
'post_type' => 'post',
'posts_per_page' => -1,
]);
$context['posts'] = $posts;
\Timber::render('frontpage.html.twig', $context);
}
}
new FrontpageCtrl();
single.php
<?php
namespace App\Controller;
class SingleCtrl extends Controller
{
public function index() {
$context = \Timber::context();
$context['post'] = \Timber::get_post(get_the_id());
\Timber::render('single.html.twig', $context);
}
}
new SingleCtrl();
fichiers twig (vues) :
views/base.html.twig
<!DOCTYPE html>
<html {{ site.language_attributes }}>
<head>
<meta charset="{{ site.charset }}">
<meta name="description" content="{{ site.description }}">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Document</title>
{{ wp_head() }}
</head>
<body class="{{ body_class }}">
<main role="main">
{% block body %}{% endblock %}
</main>
{{ wp_footer() }}
</body>
</html>
views/frontpage.html.twig
{% extends 'base.html.twig' %}
{% block body %}
{% for post in posts %}
<a href="{{ post.link }}"><h1>{{ post.title }}</h1></a>
<p>{{ post.content }}</p>
{% endfor %}
{% endblock %}
views/single.html.twig
{% extends 'base.html.twig' %}
{% block body %}
<h1>{{ post.title }}</h1>
<p>{{ post.content }}</p>
{% endblock %}