*/ final class ArticleCrudController extends AbstractCrudController { public function __construct(private readonly ArticleService $articleService) { } public static function getEntityFqcn(): string { return Article::class; } public function configureCrud(Crud $crud): Crud { return $crud->setEntityLabelInSingular('Article')->setEntityLabelInPlural('Articles'); } public function configureActions(Actions $actions): Actions { $activate = Action::new('activate', 'Activate') ->linkToRoute('admin_article_activate', static fn (Article $a) => ['id' => $a->getId()->toRfc4122()]) ->displayIf(static fn (Article $a) => ArticleStatus::Draft === $a->getStatus()); return $actions ->add(Crud::PAGE_INDEX, $activate) ->disable(Action::NEW, Action::EDIT, Action::DELETE); } public function configureFields(string $pageName): iterable { yield IdField::new('id')->hideOnForm(); yield TextField::new('sku'); yield TextField::new('inventoryNumber', 'Inventory #'); yield AssociationField::new('articleType'); yield ChoiceField::new('status')->setChoices( array_combine( array_map(static fn ($s) => $s->value, ArticleStatus::cases()), ArticleStatus::cases(), ) ); yield ChoiceField::new('condition')->setChoices( array_combine( array_map(static fn ($c) => $c->value, ArticleCondition::cases()), ArticleCondition::cases(), ) ); yield MoneyField::new('listingPrice')->setCurrency('EUR')->setRequired(false); } #[Route('/admin/articles/{id}/activate', name: 'admin_article_activate')] public function activateArticle(string $id, Request $request): RedirectResponse { $result = $this->articleService->activate(Uuid::fromString($id)); if ([] !== $result['missing']) { $this->addFlash('warning', 'Cannot activate: missing attributes: '.implode(', ', $result['missing'])); } else { $this->addFlash('success', 'Article activated.'); } return $this->redirectToRoute('easyadmin', [ 'crudAction' => 'index', 'crudControllerFqcn' => self::class, ]); } }