es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Symfony Easy Admin Bundle: Precargar datos de formulario anidados – La entidad de tipo … debe estar gestionada

Estoy tratando de crear un formulario anidado para estas tres instancias, donde el inventario tiene datos por defecto, y el formulario anidado “InventoryProduct” tiene todos los productos en la base de datos por defecto en el formulario.

  • Inventory (tiene uno o más InventarioProducto) – Id, Fecha de inicio, fecha de finalización
  • InventoryProduct – Id, Producto, Unidades, Unidades rechazadas, Unidades en cuarentena
  • Producto – Id, Nombre, Inci, algunos otros datos del producto

Entonces agregamos al “InventoryCrudController” el método “createEntity”:

public function createEntity(string $entityFqcn)
    {
        $inventory= new Inventory();
        $inventory->setStartDate(new DateTime('now'));
        $inventory->setEndDate(null);

    $productRepository= $this->entityManager->getRepository(MateriaPrima::class);

    $products= $productRepository->findAll();

    foreach ($products as $product) {
        $inventoryProduct= new InventoryProduct();
        $inventoryProduct->setProduct($product);
        $inventoryProduct->setUnits(0);
        $inventoryProduct->setUnitsRejected(0);
        $inventoryProduct->setUnitsQuarantine(0);
        $inventoryProduct->setInventory($inventory);

        $inventory->addInventarioProduct($inventoryProduct);
    }
}

Y en el método “configureFields” en “InventoryCrudController”:

public function configureFields(string $pageName): iterable
    {

    if (Crud::PAGE_EDIT === $pageName || Crud::PAGE_NEW == $pageName) {
        return [
            DateTimeField::new('startDate')
                ->setColumns(6)
                ->setValue(new DateTime()),
            DateTimeField::new('endDate')
                ->setColumns(6),
            CollectionField::new('products', 'Products:')
                ->onlyOnForms()
                ->allowAdd()
                ->allowDelete()
                ->setEntryIsComplex(false)
                ->setEntryType(InventoryProductType::class)
                ->renderExpanded(true)
                ->setFormTypeOptions(
                    [
                        'by_reference' => false,
                    ]
                )
                ->setColumns(12),

Y agregamos la clase “InventoryProductType” para el formulario personalizado:

class InventoryProducts extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        $builder
            ->add(
                'product',
                EntityType::class,
                ['class' => Product::class, 'label' => '-']
            )
            ->add('units')
            ->add('unitsRejected')
            ->add('unitsQuarantine')
            ;
    }

    public function configureOptions(OptionsResolver $resolver): void
    {
        $resolver->setDefaults([
            'data_class' => InventoryProduct::class,
        ]);
    }
}

Cuando intentamos agregar otro registro, obtenemos:

La entidad de tipo “App\Entity\Inventory” pasada al campo de elección debe ser gestionada. ¿Quizás olvidaste persistirla en el gestor de entidades?

¿Qué estoy haciendo mal?

¡Gracias por tu ayuda!

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error indica que la entidad Inventario pasada al campo de elección no es administrada por el gestor de entidades. Esto puede suceder si olvida persistir la entidad en la base de datos antes de llamar al formulario.

    Para solucionar esto, asegúrese de persistir la entidad Inventario antes de crear el formulario. En el código que proporcionó, esto significa llamar a $entityManager->persist($inventory); antes de crear el formulario en la página de creación.

    Tenga en cuenta que este código asume que el formulario se crea utilizando una clase de tipo de formulario InventoryType, que es responsable de renderizar el formulario anidado.

Comments are closed.