33namespace App \Controller \Admin ;
44
55use App \Entity \Answer ;
6+ use App \Entity \Question ;
7+ use App \Entity \System ;
68use Doctrine \ORM \EntityManagerInterface ;
79use EasyCorp \Bundle \EasyAdminBundle \Config \Action ;
810use EasyCorp \Bundle \EasyAdminBundle \Config \Actions ;
9- use EasyCorp \Bundle \EasyAdminBundle \Config \ Crud ;
11+ use EasyCorp \Bundle \EasyAdminBundle \Context \ AdminContext ;
1012use EasyCorp \Bundle \EasyAdminBundle \Controller \AbstractCrudController ;
1113use EasyCorp \Bundle \EasyAdminBundle \Field \ChoiceField ;
1214use EasyCorp \Bundle \EasyAdminBundle \Field \TextareaField ;
1315use EasyCorp \Bundle \EasyAdminBundle \Field \TextField ;
1416use Symfony \Component \HttpFoundation \RedirectResponse ;
17+ use Symfony \Component \HttpKernel \Exception \BadRequestHttpException ;
18+ use Symfony \Component \Translation \TranslatableMessage ;
1519
1620class AnswerCrudController extends AbstractCrudController
1721{
22+ public function __construct (
23+ private readonly EntityManagerInterface $ entityManager ,
24+ ) {
25+ }
26+
1827 public static function getEntityFqcn (): string
1928 {
2029 return Answer::class;
2130 }
2231
2332 #[\Override]
24- public function updateEntity ( EntityManagerInterface $ entityManager , mixed $ entityInstance ): void
33+ protected function getRedirectResponseAfterSave ( AdminContext $ context , string $ action ): RedirectResponse
2534 {
26- // TODO: Change the autogenerated stub
27- parent ::updateEntity ($ entityManager , $ entityInstance );
35+ // Lifted from parent::getRedirectResponseAfterSave().
36+ $ submitButtonName = $ context ->getRequest ()->request ->all ()['ea ' ]['newForm ' ]['btn ' ] ?? null ;
37+
38+ // Answers don't have an index which is where EasyAdmin will return to by default on save.
39+ // Therefore we return to somewhere else on save.
40+ if (Action::SAVE_AND_RETURN === $ submitButtonName ) {
41+ $ request = $ context ->getRequest ();
2842
29- $ url = $ this ->generateUrl ('dashboard ' , ['entityType ' => 'system ' ]);
30- $ response = new RedirectResponse ($ url );
31- $ response ->send ();
43+ // Check if we have a “referer” (sic!) set.
44+ if ($ referer = $ request ->get ('referer ' )) {
45+ return $ this ->redirect ($ referer );
46+ }
47+ // Check if we have a “system” set.
48+ if ($ system = $ request ->get ('system ' )) {
49+ return $ this ->redirectToRoute ('admin_system_detail ' , ['entityId ' => $ system ]);
50+ }
51+
52+ // Use system index as fallback.
53+ return $ this ->redirectToRoute ('admin_system_index ' );
54+ }
55+
56+ return parent ::getRedirectResponseAfterSave ($ context , $ action );
57+ }
58+
59+ #[\Override]
60+ public function createEntity (string $ entityFqcn ): Answer
61+ {
62+ /** @var Answer $entity */
63+ $ entity = parent ::createEntity ($ entityFqcn );
64+
65+ // Set system and question on new answers.
66+ $ params = $ this ->getContext ()->getRequest ()->query ->all ();
67+ if (isset ($ params ['system ' ], $ params ['question ' ])) {
68+ $ system = $ this ->entityManager ->getRepository (System::class)->find ($ params ['system ' ]);
69+ $ question = $ this ->entityManager ->getRepository (Question::class)->find ($ params ['question ' ]);
70+ if ($ system && $ question ) {
71+ $ entity
72+ ->setSystem ($ system )
73+ ->setQuestion ($ question );
74+ } else {
75+ throw new BadRequestHttpException ();
76+ }
77+ }
78+
79+ return $ entity ;
3280 }
3381
3482 #[\Override]
3583 public function configureActions (Actions $ actions ): Actions
3684 {
3785 return $ actions
38-
39- ->add (Crud::PAGE_EDIT , Action::EDIT )
40- ->add (Crud::PAGE_DETAIL , Action::DETAIL )
41- ->disable (Action::NEW , Action::DELETE , Action::INDEX )
42- ;
86+ ->disable (Action::SAVE_AND_ADD_ANOTHER , Action::DELETE , Action::INDEX , Action::DETAIL );
4387 }
4488
4589 /**
@@ -48,20 +92,19 @@ public function configureActions(Actions $actions): Actions
4892 #[\Override]
4993 public function configureFields (string $ pageName ): iterable
5094 {
51- $ question = TextField::new ('question ' )->setFormTypeOptions (['disabled ' => true ]);
52- $ smiley = ChoiceField::new ('smiley ' )->setChoices ([
53- 'GREEN ' => 'GREEN ' ,
54- 'RED ' => 'RED ' ,
55- 'BLUE ' => 'BLUE ' ,
56- 'YELLOW ' => 'YELLOW ' ,
57- ]);
58- $ note = TextareaField::new ('note ' );
59- if (Crud::PAGE_EDIT === $ pageName ) {
60- return [$ question , $ smiley , $ note ];
61- } elseif (Crud::PAGE_DETAIL === $ pageName ) {
62- return [$ question , $ smiley , $ note ];
63- } else {
64- throw new \Exception ('Invalid page: ' .$ pageName );
65- }
95+ $ question = TextField::new ('question ' )
96+ ->setFormTypeOptions (['disabled ' => true ]);
97+ yield $ question ;
98+ yield ChoiceField::new ('smiley ' )
99+ ->setTranslatableChoices ([
100+ 'GREEN ' => new TranslatableMessage ('smiley.GREEN ' ),
101+ 'RED ' => new TranslatableMessage ('smiley.RED ' ),
102+ 'BLUE ' => new TranslatableMessage ('smiley.BLUE ' ),
103+ 'YELLOW ' => new TranslatableMessage ('smiley.YELLOW ' ),
104+ ])
105+ // We want to use fancy smileys in the options (cf. translations/messages.da.yml).
106+ ->escapeHtml (false )
107+ ;
108+ yield TextareaField::new ('note ' );
66109 }
67110}
0 commit comments