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 | <?phpnamespace 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(); } } |