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 permanecernull
en la base de datossi 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);
}
}
}