type sonata_type_model_list collection symfony sonata-admin symfony-sonata symfony-2.3

sonata_type_model_list - Detener SonataAdmin/Symfony2 para crear objetos vacíos con sonata_type_admin administradores incorporados



sonata collection type (2)

Podría ser causado por la falta de ''required'' => false , ¿no?

protected function configureFormFields(FormMapper $formMapper) { $formMapper ->add(''color'', null, array(''required'' => true)) ->add(''owner'', null, array(''required'' => false)) ->add(''leftFrontWheel'', ''sonata_type_admin'', array(''required'' => false, ''delete'' => false)) ; }

Antes que nada, no estoy seguro de si esto es un problema de Sonata o uno de Symfony2, esta es la primera vez que trabajo con formularios Sf2 para editar una relación.

Aquí está el problema:

Tengo dos clases, llamémoslas los viejos favoritos: Car and Wheel . El automóvil tiene una relación opcional uno-a-uno con Wheel (es por ejemplo, simplemente hazlo ...). He configurado SonataAdmin con una clase CarAdmin que incorpora un WheelAdmin usando sonata_type_admin y trata de crear un automóvil sin ingresar datos para Wheel.

Sin embargo, en submit (en algún lugar de $ form-> bind () / $ form-> submit () por lo que puedo rastrear) Symfony y / o Sonata están instanciando una rueda e intentando persistirla (con todos sus valores como null ) Como Wheel tiene algunas restricciones no nulas, arroja una excepción DBALException que no puede INSERTAR una Rueda con mensajes nulos.

Esto es travieso y me gustaría evitar que suceda. Si no ingreso ningún detalle para Wheel, no quiero que una rueda fantasma amenace mi código y mi base de datos. Lo que espero es que si ingreso ningún dato, no hay nada que insertar / persistir, por lo que se deja solo. Pero esto no es lo que está pasando ... ¿Alguna idea de cómo domar esto en algo sensato?

Aquí está la versión larga, con bloques de código y todo:

Las definiciones ORM primero:

# MyNS/MyBundle/Resources/Config/Doctrine/Car.orm.yml MyNS/MyBundle/Entity/Car: type: entity repositoryClass: MyNS/MyBundle/Entity/Repositories/CarRepository table: test_cars id: id: type: integer generator: { strategy: AUTO } fields: color: type: string length: 50 owner: type: string length: 50 nullable: true oneToOne: leftFrontWheel: targetEntity: Wheel cascade: [ persist ] joinColumn: name: leftFrontWheelId referencedColumnName: id # MyNS/MyBundle/Resources/Config/Doctrine/Wheel.orm.yml MyNS/MyBundle/Entity/Wheel: type: entity repositoryClass: MyNS/MyBundle/Entity/Repositories/WheelRepository table: test_wheels id: id: type: integer generator: { strategy: AUTO } fields: diameter: type: integer length: 5

Luego, las clases de SonataAdmin:

namespace MyNS/MyBundle/Admin use ... class CarAdmin extends Admin { protected function configureFormFields(FormMapper $formMapper) { $formMapper ->add(''color'', null, array(''required'' => true)) ->add(''owner'', null, array(''required'' => false)) ->add(''leftFrontWheel'', ''sonata_type_admin'', array(''delete'' => false)) ; } protected function configureListFields(ListMapper $listMapper) { ... } }

y

namespace MyNS/MyBundle/Admin; use ... class WheelAdmin extends Admin { protected function configureFormFields(FormMapper $formMapper) { $formMapper ->add(''diameter'', null, array(''required'' => false)) ; } protected function configureListFields(ListMapper $listMapper) { ... } }

y finalmente las entradas admin.yml:

services: sonata.admin.car: class: MyNS/MyBundle/Admin/CarAdmin tags: - { name: sonata.admin, manager_type: orm, label: "Car" } arguments: - ~ - MyNS/MyBundle/Entity/Car - ''SonataAdminBundle:CRUD'' calls: - [ setTranslationDomain, [MyNS/MyBundle]] sonata.admin.wheel: class: MyNS/MyBundle/Admin/WheelAdmin tags: - { name: sonata.admin, manager_type: orm, label: "Wheel" } arguments: - ~ - MyNS/MyBundle/Entity/Wheel - ''SonataAdminBundle:CRUD'' calls: - [ setTranslationDomain, [MyNS/MyBundle]]

Comportamiento esperado / requerido:

  • Muestra un formulario con tres campos:

    • car.color (requerido)
    • propietario del automóvil (opcional)
    • car.wheel.diameter (opcional)
  • si car.wheel.diameter se deja en blanco, no se debe crear Wheel y test_cars.leftFrontWheelId debe permanecer null en la base de datos

  • si se ingresa car.wheel.diameter, se debe crear una rueda y vincularla con el automóvil (esto parece funcionar bien con la configuración existente)

La pregunta: ¿Cómo hago para que este sistema se comporte como antes?


Cambia tu campo de formulario de Wheel por algo como:

$formMapper // ... ->add(''leftFrontWheel'', ''sonata_type_admin'', array( ''delete'' => false, ''by_reference => true, ''required'' => false, )) // ...

Ver by_reference documentación de by_reference

Si no es suficiente, use un gancho prePersist en su clase de administrador principal y administre el campo que almacena. es decir:

// Fire on submit, before the object persisting public function prePersist($object) if ($wheel = $object->getLeftFrontWheel()) { if (!$wheel->getYourNonNullableField()) { $object->setLefTFrontWheel(null); } } }