Source of file ControllerViewable.php

Size: 3,029 Bytes - Last Modified: 2023-11-16T22:56:02+01:00

/home/websites/teicee/packagist/site/phpdoc/conf/../vendor/teicee/twig-bundle/src/Traits/ControllerViewable.php

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
<?php
namespace TIC\TwigBundle\Traits;

use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Form\FormInterface;

/**
 * Méthodes utiles pour générer les vues twig associées.
 * @see https://symfony.com/doc/current/templates.html
 */
trait ControllerViewable
{
	// Initialisation automatique des propriétés à partir du nom de la classe courante
	use \TIC\CoreBundle\Traits\ContextProperties;   // ctxSnake, ctxPath & ctxBundle

	protected $defaultViewPath = null;
	protected $defaultViewType = 'html';
	protected $defaultViewPage = 'index';

	/**
	 * Raccourci pour retourner la vue associée par défaut à l'action du controlleur.
	 *
	 * Exemples:
	 *    'demo_pizza/index.html.twig'
	 *    'admin/demo_pizza/index.html.twig'
	 *    '@TICDemo/crud_object/index.html.twig'

	 * @param   string          $page           Nom de base du template Twig (voir $defaultViewPage)
	 * @param   string          $type           Suffixe du type du template  (voir $defaultViewType)
	 * @return  string
	 */
	protected function getView(string $page = null, string $type = null): string
	{
		if (empty($page)) $page = $this->defaultViewPage;
		if (empty($type)) $type = $this->defaultViewType;
		
		if (null !== $this->defaultViewPath) $path = $this->defaultViewPath;
		else {
			$path = $this->ctxSnake;
			if ($this->ctxPath)   $path = \strtolower($this->ctxPath) . '/' . $path;
			if ($this->ctxBundle) $path = $this->ctxBundle . '/' . $path;
		}
		
		return \sprintf('%s/%s.%s.twig', $path, $page, $type);
	}

	/**
	 * Génération du rendu de la vue de l'action spécifiée.
	 *
	 * @param   string          $action         (peu contenir le $type en suffixe)
	 * @param   array           $parameters     (conversion auto des FormType en FormView)
	 * @param   Response        $response       (si une réponse déjà initialisée doit être utilisée)
	 * @return  Response                        (status code 422 si FormType en échec)
	 */
	protected function renderAction(?string $action = '', array $parameters = array(), Response $response = null): Response
	{
		$type = null;
		if (\strpos($action, '.')) list($action, $type) = \explode('.', $action, 2);
		
		// reprise de Symfony\Bundle\FrameworkBundle\Controller\AbstractController::renderForm()
		if (null === $response) $response = new Response();
		foreach ($parameters as $k => $v) {
			if (!$v instanceof FormInterface) continue;
			$parameters[$k] = $v->createView();
			if (200 === $response->getStatusCode() && $v->isSubmitted() && !$v->isValid()) $response->setStatusCode(422);
		}
		
		return $this->render($this->getView($action, $type), $parameters, $response);
	}

	/**
	 * Génération du rendu de la vue de l'action spécifiée.
	 *
	 * @param   string        $action           (peut contenir le $type en suffixe)
	 * @param   array         $parameters
	 * @return  string
	 */
	protected function renderContent(string $action, array $parameters = array()): string
	{
		return $this->renderAction($action, $parameters)->getContent();
	}

}