ticketFactory = $ticketFactory; $this->ticketMessageFactory = $ticketMessageFactory; $this->adminUrlGenerator = $adminUrlGenerator; $this->translatorAdmin = $translatorAdmin; } public static function getEntityFqcn(): string { return TicketInterface::class; } public function configureAssets(Assets $assets): Assets { $assets = parent::configureAssets($assets); $assets->addWebpackEncoreEntry('sov-ticket'); return $assets; } public function configureFields(string $pageName): iterable { return [ IntegerField::new('id') ->hideOnForm(), DateField::new('createdAt')->setFormat('short') ->hideOnForm(), TextField::new('visitorFirstName') ->setTemplatePath('@LcSov/admin/ticket/field/username.html.twig') ->hideOnForm(), TextField::new('visitorEmail') ->setTemplatePath('@LcSov/admin/ticket/field/email.html.twig') ->hideOnForm(), AssociationField::new('user') ->hideOnIndex(), TextField::new('subject'), TextField::new('lastMessage') ->setTemplatePath('@LcSov/admin/ticket/field/lastmessage.html.twig') ->hideOnForm(), ChoiceField::new('type') ->autocomplete() ->setChoices( $this->translatorAdmin->transChoices(TicketModel::getTypeChoices(), 'Ticket', 'type') ), ChoiceField::new('status') ->autocomplete() ->setChoices( $this->translatorAdmin->transChoices(TicketModel::getStatusChoices(), 'Ticket', 'status') ) ->setTemplatePath('@LcSov/admin/ticket/field/status.html.twig') ->hideOnForm(), ]; } public function configureActions(Actions $actions): Actions { $actions ->add(Crud::PAGE_INDEX, Action::DETAIL) ->remove(Crud::PAGE_INDEX, Action::EDIT); return parent::configureActions($actions); } public function createEntityFromFactory() { return $this->ticketFactory->create(); } public function new(AdminContext $context) { $ticket = $this->createEntityFromFactory(); $form = $this->createForm(TicketFormType::class, $ticket); $form->handleRequest($context->getRequest()); if ($form->isSubmitted() && $form->isValid()) { $ticket = $form->getData(); $this->get('em')->persist($ticket); $this->get('em')->flush(); $url = $this->adminUrlGenerator ->setAction('index') ->generateUrl(); return $this->redirect($url); } return $this->render( '@LcSov/admin/ticket/new.html.twig', [ 'form' => $form->createView(), ] ); } public function detail(AdminContext $context) { $ticket = $context->getEntity()->getInstance(); $url = $this->adminUrlGenerator ->setAction('ticketStatusAction') ->generateUrl(); $formTicketStatus = $this->createForm( TicketStatusType::class, $ticket, [ 'action' => $url, 'method' => 'POST', ] ); $ticketMessage = $this->ticketMessageFactory->create(); $formAddTicketMessage = $this->createForm(TicketMessageFormType::class, $ticketMessage); $formAddTicketMessage->handleRequest($this->get('request')->getMasterRequest()); if ($formAddTicketMessage->isSubmitted() && $formAddTicketMessage->isValid()) { $ticketMessage = $formAddTicketMessage->getData(); $ticketMessage->setTicket($ticket); $ticketMessage->setAnswerByAdmin(true); $this->get('em')->persist($ticketMessage); $this->get('em')->flush(); } return $this->render( '@LcSov/admin/ticket/detail.html.twig', [ 'form_ticket_status' => $formTicketStatus->createView(), 'form_add_ticket_message' => $formAddTicketMessage->createView(), 'ticket' => $ticket, ] ); } public function ticketStatusAction() { $request = $this->get('request')->getMasterRequest(); $ticket = $request->attributes->get('easyadmin_context')->getEntity()->getInstance(); $formTicketStatusForm = $this->createForm(TicketStatusType::class, $ticket); $formTicketStatusForm->handleRequest($request); $success = false; if ($formTicketStatusForm->isSubmitted() && $formTicketStatusForm->isValid()) { $this->get('em')->persist($ticket); $this->get('em')->flush(); $success = true; } return new JsonResponse(['success' => $success]); } }