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.
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>
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!
Sous symfony, il y a un soucis de ce genre parfois quand le fichier n'est pas encodé en utf-8 SANS BOM.
Sinon essaie cette syntaxe : {% extends ['enfant.html', 'parent.html'] %}
Cf: documentation twig sur le site de sensiolab car oui twig est développé par symfony
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..
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.
Bonsoir.
Tu fais une erreur sur la fermeture de ton block, ce n'est pas {% endblock body %}
mais juste {% endblock %}
.
L'erreur qui t'es retourné doit être dù à ça.
Voir ici : block - Documentation - Twig - The flexible, fast, and secure PHP template engine.