Source of file ControllerItemable.php

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

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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
<?php
namespace TIC\DormBundle\Traits;

use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RedirectResponse;

use TIC\CoreBundle\Util\ConvertHelper;
use TIC\CoreBundle\Util\ObjectHelper;

/**
 * Méthodes utiles pour gérer l'entité associée (EntityManager et raccourcis en surcouche).
 */
trait ControllerItemable
{
	use \TIC\DormBundle\Traits\ManagerTrait;        // EntityManager avec méthodes saveEntity & deleteEntity
	use \TIC\CoreBundle\Traits\ControllerRouting;   // Méthodes pour les réponses redirectItem & redirectList
#	use \TIC\CoreBundle\Traits\ContextProperties;   // ctxMesg (déjà inclu par ManagerTrait & ControllerRouting)

	/**
	 * Exécution de l'enregistrement d'une entité en BdD.
	 *
	 * @param   object  $item       Entité à enregistrer
	 * @param   bool    $redirect   Rediriger vers la page d'origine (défaut) ou la fiche de l'entité (true)
	 * @param   string  $alert      Message de succès personnalisé (au lieu des tokens générés par défaut)
	 *                              (si spécifié, le message de l'exception sera utilisé en cas d'échec)
	 * @return  RedirectResponse    Réponse HTTP optionnelle vers la page précédente ou la fiche de l'entité
	 */
	protected function saveItem(object $item, ?bool $redirect = null, ?string $alert = null): ?RedirectResponse
	{
		$error = $this->saveEntity($item);
		
		// génération du message de retour (alert)
		if (null === $error) {
			$message = ($alert === null) ? \sprintf('alert.%s.save.success', $this->ctxMesg) : $alert;
			$this->addFlash('success', $message);
		} else {
			$message = ($alert === null) ? \sprintf('alert.%s.save.failed', $this->ctxMesg) : $error;
			$this->addFlash('danger', $message);
		}
		
		// génération d'une redirection HTTP en retour ?
		if ($redirect === false) return null;
		return ($redirect) ? $this->redirectItem($item) : $this->redirectReferer();
	}

	/**
	 * Exécution de la suppression d'une entité en BdD.
	 *
	 * @param   object  $item       Entité à supprimer
	 * @param   bool    $redirect   Rediriger vers la page d'origine (défaut) ou la fiche de l'entité (true) sur erreur
	 *                              ou sur la liste des entités en cas de succès (car la fiche devient indisponible)
	 * @param   string  $alert      Message de succès personnalisé (au lieu des tokens générés par défaut)
	 *                              (si spécifié, le message de l'exception sera utilisé en cas d'échec)
	 * @return  RedirectResponse    Réponse HTTP optionnelle vers la liste (si erreur page précédente ou fiche)
	 */
	protected function deleteItem(object $item, ?bool $redirect = null, ?string $alert = null): ?RedirectResponse
	{
		$error = $this->deleteEntity($item);
		
		// génération du message de retour (alert)
		if (null === $error) {
			$message = ($alert === null) ? \sprintf('alert.%s.delete.success', $this->ctxMesg) : $alert;
			$this->addFlash('success', $message);
		} else {
			$message = ($alert === null) ? \sprintf('alert.%s.delete.failed', $this->ctxMesg) : $error;
			$this->addFlash('danger', $message);
		}
		
		// génération d'une redirection HTTP en retour ?
		if ($redirect === false) return null;
		if (null === $error) return $this->redirectList();
		return ($redirect) ? $this->redirectItem($item) : $this->redirectReferer();
	}

	/**
	 * Exécution de la suppression d'une entité en BdD en coupant si possible le softdelete.
	 *
	 * @param   object  $item       Entité à supprimer
	 * @param   bool    $redirect   Rediriger vers la page d'origine (défaut) ou la fiche de l'entité (true) sur erreur
	 *                              ou sur la liste des entités en cas de succès (car la fiche devient indisponible)
	 * @param   string  $alert      Message de succès personnalisé (au lieu des tokens générés par défaut)
	 *                              (si spécifié, le message de l'exception sera utilisé en cas d'échec)
	 * @return  RedirectResponse    Réponse HTTP optionnelle vers la liste (si erreur page précédente ou fiche)
	 */
	protected function harddeleteItem(object $item, ?bool $redirect = null, ?string $alert = null): ?RedirectResponse
	{
		$error = $this->harddeleteEntity($item);
		
		// génération du message de retour (alert)
		if (null === $error) {
			$message = ($alert === null) ? \sprintf('alert.%s.delete.success', $this->ctxMesg) : $alert;
			$this->addFlash('success', $message);
		} else {
			$message = ($alert === null) ? \sprintf('alert.%s.delete.failed', $this->ctxMesg) : $error;
			$this->addFlash('danger', $message);
		}
		
		// génération d'une redirection HTTP en retour ?
		if ($redirect === false) return null;
		if (null === $error) return $this->redirectList();
		return ($redirect) ? $this->redirectItem($item) : $this->redirectReferer();
	}

	/**
	 * Exécution d'un changement de valeur sur une entité en BdD.
	 *
	 * @param   object  $item       Entité à modifier et enregistrer
	 * @param   string  $field      Nom de la propriété à modifier
	 * @param   mixed   $value      Valeur à affecter à la propriété
	 * @param   bool    $redirect   Rediriger vers la page d'origine (défaut) ou la fiche de l'entité (true)
	 * @param   bool    $no_alert   Ne pas générer le message de retour selon résultat (token avec ctxMesg)
	 * @return  RedirectResponse    Réponse HTTP optionnelle vers la page précédente ou la fiche de l'entité
	 */
	protected function changeItem(object $item, string $field, mixed $value, ?bool $redirect = null, ?bool $no_alert = false): ?RedirectResponse
	{
		// méthodes utilitaires pour changer la valeur du champs
		try {
			$change = ObjectHelper::changeField($item, $field, $value);
		} catch (\Exception $e) {
			return $this->alert('danger', ['title'=>"error.item.no_property", 'text'=>$e->getMessage()], false);
		}
		
		// si valeur modifiée : enregistrement en BdD
		if ($change) $error = $this->saveEntity($item);
		
		// message de retour selon l'état et le résultat
		if (! $no_alert) {
			if (! $change)
				$this->addFlash('warning', \sprintf('alert.%s.change.already', $this->ctxMesg));
			elseif ($error === null)
				$this->addFlash('success', \sprintf('alert.%s.change.success', $this->ctxMesg));
			else
				$this->addFlash('danger', ['title'=>\sprintf('alert.%s.change.failed', $this->ctxMesg), 'text'=>$error]);
		}
		
		// génération d'une redirection HTTP en retour ?
		if ($redirect === false) return null;
		return ($redirect) ? $this->redirectItem($item) : $this->redirectReferer();
	}

	/**
	 * Exécution d'une inversion de valeur (booléenne) sur une entité en BdD.
	 *
	 * @param   object  $item       Entité à modifier et enregistrer
	 * @param   string  $field      Nom de la propriété à modifier
	 * @param   mixed   $value      Valeur à affecter à la propriété (convertie en booléen via ConvertHelper)
	 * @param   bool    $redirect   Rediriger vers la page d'origine (défaut) ou la fiche de l'entité (true)
	 * @param   bool    $no_alert   Ne pas générer le message de retour selon résultat (token avec ctxMesg)
	 * @return  RedirectResponse    Réponse HTTP optionnelle vers la page précédente ou la fiche de l'entité
	 */
	protected function toggleItem(object $item, string $field, mixed $value, ?bool $redirect = null, ?bool $no_alert = false): ?RedirectResponse
	{
		// méthodes utilitaires pour changer la valeur du champs
		try {
			$value = ConvertHelper::boolean($value);
			$state = ObjectHelper::toggleField($item, $field, $value);
		} catch (\Exception $e) {
			return $this->alert('danger', ['title'=>"error.item.no_property", 'text'=>$e->getMessage()], false);
		}
		
		// si valeur modifiée : enregistrement en BdD
		if ($value === null) $value = $state;
		if ($state !== null) $error = $this->saveEntity($item);
		
		// message de retour selon l'état et le résultat
		if (! $no_alert) {
			$action = ($value) ? "enable" : "disable";
			if ($state === null)
				$this->addFlash('warning', \sprintf('alert.%s.%s.already', $this->ctxMesg, $action));
			elseif ($error === null)
				$this->addFlash('success', \sprintf('alert.%s.%s.success', $this->ctxMesg, $action));
			else
				$this->addFlash('danger', ['title'=>\sprintf('alert.%s.%s.failed', $this->ctxMesg, $action), 'text'=>$error]);
		}
		
		// génération d'une redirection HTTP en retour ?
		if ($redirect === false) return null;
		return ($redirect) ? $this->redirectItem($item) : $this->redirectReferer();
	}

}