1: <?php
2: namespace TIC\TwigBundle\Traits;
3:
4: use Symfony\Component\HttpFoundation\Response;
5: use Symfony\Component\Form\FormInterface;
6:
7: /**
8: * Méthodes utiles pour générer les vues twig associées.
9: * @see https://symfony.com/doc/current/templates.html
10: */
11: trait ControllerViewable
12: {
13: // Initialisation automatique des propriétés à partir du nom de la classe courante
14: use \TIC\CoreBundle\Traits\ContextProperties; // ctxSnake, ctxPath & ctxBundle
15:
16: protected $defaultViewPath = null;
17: protected $defaultViewType = 'html';
18: protected $defaultViewPage = 'index';
19:
20: /**
21: * Raccourci pour retourner la vue associée par défaut à l'action du controlleur.
22: *
23: * Exemples:
24: * 'demo_pizza/index.html.twig'
25: * 'admin/demo_pizza/index.html.twig'
26: * '@TICDemo/crud_object/index.html.twig'
27:
28: * @param string $page Nom de base du template Twig (voir $defaultViewPage)
29: * @param string $type Suffixe du type du template (voir $defaultViewType)
30: * @return string
31: */
32: protected function getView(string $page = null, string $type = null): string
33: {
34: if (empty($page)) $page = $this->defaultViewPage;
35: if (empty($type)) $type = $this->defaultViewType;
36:
37: if (null !== $this->defaultViewPath) $path = $this->defaultViewPath;
38: else {
39: $path = $this->ctxSnake;
40: if ($this->ctxPath) $path = \strtolower($this->ctxPath) . '/' . $path;
41: if ($this->ctxBundle) $path = $this->ctxBundle . '/' . $path;
42: }
43:
44: return \sprintf('%s/%s.%s.twig', $path, $page, $type);
45: }
46:
47: /**
48: * Génération du rendu de la vue de l'action spécifiée.
49: *
50: * @param string $action (peu contenir le $type en suffixe)
51: * @param array $parameters (conversion auto des FormType en FormView)
52: * @param Response $response (si une réponse déjà initialisée doit être utilisée)
53: * @return Response (status code 422 si FormType en échec)
54: */
55: protected function renderAction(?string $action = '', array $parameters = array(), Response $response = null): Response
56: {
57: $type = null;
58: if (\strpos($action, '.')) list($action, $type) = \explode('.', $action, 2);
59:
60: // reprise de Symfony\Bundle\FrameworkBundle\Controller\AbstractController::renderForm()
61: if (null === $response) $response = new Response();
62: foreach ($parameters as $k => $v) {
63: if (!$v instanceof FormInterface) continue;
64: $parameters[$k] = $v->createView();
65: if (200 === $response->getStatusCode() && $v->isSubmitted() && !$v->isValid()) $response->setStatusCode(422);
66: }
67:
68: return $this->render($this->getView($action, $type), $parameters, $response);
69: }
70:
71: /**
72: * Génération du rendu de la vue de l'action spécifiée.
73: *
74: * @param string $action (peut contenir le $type en suffixe)
75: * @param array $parameters
76: * @return string
77: */
78: protected function renderContent(string $action, array $parameters = array()): string
79: {
80: return $this->renderAction($action, $parameters)->getContent();
81: }
82:
83: }
84: