Source of file ControllerCrudable.php

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

/home/websites/teicee/packagist/site/phpdoc/conf/../vendor/teicee/dorm-bundle/src/Traits/ControllerCrudable.php

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
<?php
namespace TIC\DormBundle\Traits;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

/** @TODO: pouvoir utiliser un autre trait fournissant la méthode renderAction */
use TIC\TwigBundle\Traits\ControllerViewable;

/**
 * Méthodes utiles pour disposer des actions CRUD.
 */
trait ControllerCrudable
{
	use ControllerItemable;   // EntityManager avec méthodes getRepo, getItem, saveItem & deleteItem
	use ControllerViewable;   // Méthode pour le rendu des vues Twig renderAction

	/**
	 * List items (Index).
	 *
	 * @param   array   $filters
	 * @param   string  $orders
	 * @param   array   $params     Liste de paramètres à passer à la vue
	 * @return  Response
	 */
	protected function crudList(?array $filters = [], ?string $orders = null, array $params = []): Response
	{
		return $this->renderAction('list', array(
			'items' => $this->getRepo()->listAll($filters, $orders),
		) + $params);
	}

	/**
	 * Show item (Read).
	 *
	 * @param   mixed   $id
	 * @param   array   $params     Liste de paramètres à passer à la vue
	 * @return  Response
	 */
	protected function crudShow(mixed $id, array $params = []): Response
	{
		return $this->renderAction('show', array(
			'item' => $this->getItem($id),
		) + $params);
	}

	/**
	 * Edit item (Create / Update).
	 * Note: la clé $params['view'] permet de spécifier le template à utiliser ('form' par défaut)
	 *
	 * @param   Request $request
	 * @param   mixed   $id
	 * @param   array   $options    Liste d'options pour initialiser le FormType
	 * @param   array   $params     Liste de paramètres à passer à la vue
	 * @return  Response
	 */
	protected function crudForm(Request $request, mixed $id = null, array $options = [], array $params = []): Response
	{
		// nouvel élément (avec valeurs par défaut) ou récupération de l'élément édité
		$item = $this->getItem($id);
		// génération du formulaire
		$form = $this->getForm($item, $request, $options);
		
		// validation du formulaire
		if ($form->isSubmitted() && $form->isValid()) {
			// enregistrement avec message et redirection
			return $this->saveItem($item, true);
		}
		
		// affichage du formulaire
		$page = isset($params['view']) ? $params['view'] : 'form';
		return $this->renderAction($page, array(
			'form' => $form,
			'item' => $item,
		) + $params);
	}

	/**
	 * Delete item.
	 *
	 * @param   Request $request
	 * @param   mixed   $id
	 * @return  Response
	 */
	protected function crudDelete(?Request $request, mixed $id): Response
	{
		// récupération de l'élément à supprimer
		$item = $this->getItem($id);
		
		// vérification du token CSRF (sinon redirection vers la fiche)
		if (false === $this->checkCSRF('delete'.$id, $request))
			return $this->alert('danger', "error.csrf.invalid_token", $item);
		
		// suppression avec message et redirection
		return $this->deleteItem($item, true);
	}

	/**
	 * Toggle item property boolean value.
	 *
	 * @param   Request $request
	 * @param   mixed   $id
	 * @param   string  $field      Nom de la propriété de l'élément à modifier
	 * @param   mixed   $state      Valeur à affecter à la propriété (convertie en booléen)
	 * @return  Response
	 */
	protected function crudToggle(Request $request, mixed $id, string $field, string $state = null): Response
	{
		// récupération de l'élément à modifier
		$item = $this->getItem($id);
		
		// modification de la propriété, enregistrement avec message et redirection par défaut (referer)
		return $this->toggleItem($item, $field, $state);
	}

	/**
	 * List items with pagination (AJAX).
	 * @TODO
	 */
/*
	protected function crudPageAction(Request $request): JsonResponse
	{
		if (! $request->isXmlHttpRequest()) return $this->renderAction('list', array(
			'items'   => array(),
			'nbItems' => $this->getRepo()->pageCount(),
			'selOpts' => $this->selOpts,
		));
		
		$length = max($request->get('length', 0), 0);
		$start  = max($request->get('start',  0), 0);
		$order   = $request->get('order',   array());
		$search  = $request->get('search',  array());
		$columns = $request->get('columns', array());
		
		$output = array(
			'recordsTotal'    => $this->getRepo()->pageCount(),
			'recordsFiltered' => $this->getRepo()->pageCount($search, $columns),
			'data' => array(),
		);
		foreach ($this->getRepo()->pageSearch($search, $columns, $order, $start, $length) as $item) {
			$output['data'][] = explode("\n\n\n", $this->renderContent('list-line.data', array('item' => $item)));
		}
		return new JsonResponse($output);
	}
 */

}