Twig

Par Mizzou, il y a 7 ans


Bonjour à tous,
A l'issue du chapitre de twig dans la formation POO par la pratique.
Je rencontre un petit problème.
Lorsque je décide de charger une vue qui se situe dans le blogModule et après avoir bien ajouter mon path avec le namespace correspondant.
Twig trouve bien la vue dans le bon namespace.
Cependant lorsque je demande à cette vue d'étendre d'un layout se trouvant dans le meme module.
Ce dernier me renvoie sur le layout par défaut dans le framework.

Merci de votre aide.

8 réponses

Mizzou, il y a 7 ans

Cela ne marche malheureusement pas...
du coup je recherche une solutions de substitution...
je recherce la fonction de twig qui permet de changer le bon chemin dans twig .. et comme ca dans la fonction render .. je renverai le bon chemin..

Digivia, il y a 7 ans

Salut Mizzou,

Peux tu poster ton appel twig? On y verra peut-être plus clair...

Mizzou, il y a 7 ans

Bien entendu.

Mizzou, il y a 7 ans

Alors je n'utilise pas le meme container que grafikart, j'utiliser un serviceProvider.
Voici mon service provider, dans lequel je déclare ma classe TwigView et dans lequel je déclare un chemin par défault.

class ViewServiceProvider extends AbstractServiceProvider { protected $provides = [ TwigView::class, PhpView::class ]; public function register() { $container = $this->getContainer(); $container->share(TwigView::class, function () use ($container) { // Route par défaut $path = __DIR__ . '/../Ressources/Views'; $loader = new Twig_Loader_Filesystem($path); $twig = new Twig_Environment($loader, [ 'cache' => false, ]); // Ajout des extensions $routes = $container->get(RouteCollection::class); $twig->addExtension( new TwigRoutePathExtension($routes)); // $twig->addExtension( new TwigPageFantaExtension()); return new TwigView($twig, $loader); }); $container->share(PhpView::class, function(){ return new PhpView(); }); } }

Voici ma class TwigView

namespace Framework\Views; use Psr\Http\Message\ResponseInterface; use Twig_Environment; use Twig_Loader_Filesystem; class TwigView extends View { protected $twig; public $loader; public function __construct(Twig_Environment $twig, Twig_Loader_Filesystem $loader) { $this->twig = $twig; $this->loader = $loader; } public function render(ResponseInterface $response, $view, $data = []) { // $this->loader->getPaths('blog'); $response->getBody()->write( $this->twig->render($view, $data) ); return $response; } }

Dans un controller du blogmodule , je récupère mon Twigview grace à l'autowiring. Et je rajoute un chemin avec un namespace.

class BlogController { public $view; private $postTable; public function __construct(TwigView $view) { $this->view = $view; $this->view->loader->addPath(__DIR__.'/../Ressources/Views', 'blog'); }

Et lorsque j'appelle ma vue, par exemple store qui rendra la vue blog dans le namespace blog.

public function index(ServerRequestInterface $request, ResponseInterface $response) { $lists = ['mizzou', 'emilie', 'moi']; // return $this->view->render($response, 'blog.twig', compact('lists')); return $this->view->render($response, '@blog/blog.twig', compact('lists', 'posts')); }

Ma vue qui se trouve dans le blogbungle est bien récupérer.
Il respecte bien le chemin déclarer.

<h1>BlogBundle</h1> {% block body %} <ul> {% for post in posts %} <li> <a href="#">{{ post.name }}</a> </li> {% endfor %} </ul> {% endblock body %} <p> <a href="{{ path('facebook_path') }}">Facebook</a> </p>

Le problème est que dès que je rajoute le template, il ne veut pas me le récupérer

{% extends '@blog/Layouts/master.twig' %}

Le problème ne se pose pas lorsque, je decide de renvoyer la vue sans le namespace. La vue et le template sont bien rendu.

return $this->view->render($response, 'blog.twig', compact('lists', 'posts'));

Dans l'autre cas , voici l'erreur.

Fatal error: Uncaught Twig_Error_Syntax: A template that extends another one cannot include content outside Twig blocks. Did you forget to put the content inside a {% block %} tag?

Je vous remercie pour l'aide.

Mizzou, il y a 7 ans

C'était presque cela. J'ai finalement trouver mon erreure.
Voici ma vue telle qu'elle était lorsque j'avais une erreure.

{% extends '@blog/Layouts/master.twig' %} <h1>BlogBundle</h1> {% block body %} <ul> {% for post in posts %} <li> <a href="#">{{ post.name }}</a> </li> {% endfor %} </ul> <p> <a href="{{ path('facebook_path') }}">Facebook</a> </p> {% endblock %}

Voici la vue corrigée.

{% extends '@blog/Layouts/master.twig' %} {% block body %} <h1>BlogBundle</h1> <ul> {% for post in posts %} <li> <a href="#">{{ post.name }}</a> </li> {% endfor %} </ul> <p> <a href="{{ path('facebook_path') }}">Facebook</a> </p> {% endblock %}

Le bloc en html suivant que j'avais mis entre les deux de twig produisait l'erreure.

<h1>BlogBundle</h1>
Digivia, il y a 7 ans

Pour nfo @Lartak, il n'y a aucun problème à fermer un balise twig endblock par son nom, question de lisibilité, je le fais systématiquement!
C'est plus simple pour la maintenance quand il y a un certain nombre de balises endblock, aucun pb pour twig!