/** * Exchange default admin controller by custom entity admin controller. * * @param FilterControllerEvent $event */ public function onKernelController(FilterControllerEvent $event) { $request = $event->getRequest(); if ('easyadmin' !== $request->attributes->get('_route')) { return; } $currentController = $event->getController(); // if the controller is defined in a class, $currentController is an array // otherwise do nothing because it's a Closure (rare but possible in Symfony) if (!is_array($currentController)) { return; } // this condition happens when accessing the backend homepage, which // then redirects to the 'list' action of the first configured entity. if (null === ($entityName = $request->query->get('entity'))) { return; } $entity = $this->configManager->getEntityConfig($entityName); // if the entity doesn't define a custom controller, do nothing if (!isset($entity['controller'])) { return; } $customController = $entity['controller']; $controllerMethod = $currentController[1]; // build the full controller name depending on its type if (class_exists($customController)) { // 'class::method' syntax for normal controllers $customController .= '::' . $controllerMethod; } else { // 'service:method' syntax for controllers as services $customController .= ':' . $controllerMethod; } $request->attributes->set('_controller', $customController); $newController = $this->resolver->getController($request); if (false === $newController) { throw new NotFoundHttpException(sprintf('Unable to find the controller for path "%s". Check the "controller" configuration of the "%s" entity in your EasyAdmin backend.', $request->getPathInfo(), $entityName)); } $event->setController($newController); }
/** * {@inheritdoc} */ public function buildForm(FormBuilderInterface $builder, array $options) { $entity = $options['entity']; $view = $options['view']; $entityConfig = $this->configManager->getEntityConfig($entity); $entityProperties = $entityConfig[$view]['fields']; $formGroups = array(); $currentFormGroup = null; foreach ($entityProperties as $name => $metadata) { $formFieldOptions = $metadata['type_options']; // Configure options using the list of registered type configurators: foreach ($this->configurators as $configurator) { if ($configurator->supports($metadata['fieldType'], $formFieldOptions, $metadata)) { $formFieldOptions = $configurator->configure($name, $formFieldOptions, $metadata, $builder); } } $formFieldType = LegacyFormHelper::getType($metadata['fieldType']); // if the form field is a special 'group' design element, don't add it // to the form. Instead, consider it the current form group (this is // applied to the form fields defined after it) and store its details // in a property to get them in form template if (in_array($formFieldType, array('easyadmin_group', 'JavierEguiluz\\Bundle\\EasyAdminBundle\\Form\\Type\\EasyAdminGroupType'))) { $currentFormGroup = $metadata['fieldName']; $formGroups[$currentFormGroup] = $metadata; continue; } // 'divider' and 'section' are 'fake' form fields used to create the design // elements of the complex form layouts: define them as unmapped and non-required if (0 === strpos($metadata['property'], '_easyadmin_form_design_element_')) { $formFieldOptions['mapped'] = false; $formFieldOptions['required'] = false; } $formField = $builder->getFormFactory()->createNamedBuilder($name, $formFieldType, null, $formFieldOptions); $formField->setAttribute('easyadmin_form_group', $currentFormGroup); $builder->add($formField); } $builder->setAttribute('easyadmin_form_groups', $formGroups); }