php symfony nested sonata-admin symfony-sonata

php - Campos de recopilación anidados en Sonata Admin(2.3)



symfony nested (2)

Tengo problemas para crear mi formulario para crear un curso. Esto es parte de mi esquema de base de datos para el cual intento crear un formulario:

Entonces, lo que trato de hacer es crear un curso donde pueda crear sesiones y fechas (momento) asociadas a esa sesión. Debería verse algo como esto:

En mi clase CourseAdmin tengo:

protected function configureFormFields(FormMapper $formMapper) { $formMapper ->add(''name'', ''text'', array(''label'' => ''Naam'')) ->add(''description'', ''textarea'', array(''label'' => ''Beschrijving'')) ->add(''materials'', ''textarea'', array(''label'' => ''Benodigde materialen'')) ->add(''numberOfParticipants'', ''number'', array(''label'' => ''Aantal deelnembers'')) ->add(''numberOfDays'', ''number'', array(''label'' => ''Aantal dagen'')) ->add(''price'', ''number'', array(''label'' => ''Prijs'')) ->add(''priceKmo'', ''number'', array(''label'' => ''KMO-portefeuille Prijs'')) ->add(''location'', ''sonata_type_model'', array(''expanded'' => true, ''by_reference'' => false, ''multiple'' => true, ''btn_add'' => false)) ->add(''session'', ''sonata_type_collection'', array( ''by_reference'' => false, ''type_options'' => array( // Prevents the "Delete" option from being displayed ''delete'' => false, ''delete_options'' => array( // You may otherwise choose to put the field but hide it ''type'' => ''hidden'', // In that case, you need to fill in the options as well ''type_options'' => array( ''mapped'' => false, ''required'' => false, ) ) ) ), array( ''edit'' => ''inline'', ''inline'' => ''table'', ''sortable'' => ''position'' )) ; }

En mi clase SessionAdmin tengo:

protected function configureFormFields(FormMapper $formMapper) { $formMapper ->add(''type'', ''text'', array(''label'' => ''Type opleiding (Dag / Avond)'')) ->add(''moment'', ''sonata_type_collection'', array( ''by_reference'' => false, ''type_options'' => array( // Prevents the "Delete" option from being displayed ''delete'' => false, ''delete_options'' => array( // You may otherwise choose to put the field but hide it ''type'' => ''hidden'', // In that case, you need to fill in the options as well ''type_options'' => array( ''mapped'' => false, ''required'' => false, ) ) ) ), array( ''edit'' => ''inline'', ''inline'' => ''table'', ''sortable'' => ''position'' )) ; }

Y en mi clase MomentAdmin tengo:

protected function configureFormFields(FormMapper $formMapper) { $formMapper ->add(''time'', ''date'', array(''label'' => ''Datum'')) ; }

El problema en mi forma es cuando trato de agregar un momento (fecha) a mi sesión, obtengo el siguiente error:

FatalErrorException: Error: llamada a una función miembro getName () en null en /myproject/app/cache/dev/classes.php línea 9772

Entonces, puedo agregar una sesión, pero cuando trato de agregar un momento a mi sesión, obtengo el error ...

Cuando miro en el archivo classes.php en las reglas 9771 y 9772, aparece:

$childFormBuilder = $this->getChildFormBuilder($formBuilder, $elementId); $fieldDescription = $admin->getFormFieldDescription($childFormBuilder->getName());

$childFormBuilder es nulo .

Cuando miro esa función, obtengo esto:

public function getChildFormBuilder(FormBuilder $formBuilder, $elementId) { foreach (new FormBuilderIterator($formBuilder) as $name => $formBuilder) { if ($name == $elementId) { return $formBuilder; } } return; }

Cuando hago un var_dump de $ name y $ elementId como este:

public function getChildFormBuilder(FormBuilder $formBuilder, $elementId) { foreach (new FormBuilderIterator($formBuilder) as $name => $formBuilder) { var_dump("name: " . $name); var_dump("elementId: " . $elementId); if ($name == $elementId) { return $formBuilder; } } die; return; }

Y presione el botón Agregar nuevo como en la siguiente imagen:

Entonces obtengo esta salida:

name: s56cda71d2daa0_name elementId: s56cda71d2daa0_session_0_moment name: s56cda71d2daa0_description elementId: s56cda71d2daa0_session_0_moment name: s56cda71d2daa0_materials elementId: s56cda71d2daa0_session_0_moment name: s56cda71d2daa0_numberOfParticipants elementId: s56cda71d2daa0_session_0_moment name: s56cda71d2daa0_numberOfDays elementId: s56cda71d2daa0_session_0_moment name: s56cda71d2daa0_price elementId: s56cda71d2daa0_session_0_moment name: s56cda71d2daa0_priceKmo elementId: s56cda71d2daa0_session_0_moment name: s56cda71d2daa0_location elementId: s56cda71d2daa0_session_0_moment name: s56cda71d2daa0_session elementId: s56cda71d2daa0_session_0_moment

En todas mis entidades tengo una función __toString. Un ejemplo en mi entidad de curso:

public function __toString() { if(!is_null($this->name)) { return $this->name; } else{ return ""; } }

Cual podría ser el problema aquí? Estoy realmente atrapado con esto. También he publicado un issue en el repositorio github de Sonata Admin, pero no hay respuestas ...

Mis entidades :

Entidad del curso :

<?php namespace Studyx/EnrolmentBundle/Entity; use Doctrine/ORM/Mapping as ORM; /** * Course * * @ORM/Table(name="course") * @ORM/Entity */ class Course { /** * @var string * * @ORM/Column(name="name", type="string", length=255, nullable=false) */ private $name; /** * @var string * * @ORM/Column(name="description", type="text", nullable=false) */ private $description; /** * @var string * * @ORM/Column(name="materials", type="text", nullable=true) */ private $materials; /** * @var integer * * @ORM/Column(name="number_of_participants", type="integer", nullable=true) */ private $numberOfParticipants; /** * @var integer * * @ORM/Column(name="number_of_days", type="integer", nullable=true) */ private $numberOfDays; /** * @var string * * @ORM/Column(name="price", type="decimal", nullable=true) */ private $price; /** * @var string * * @ORM/Column(name="price_kmo", type="decimal", nullable=true) */ private $priceKmo; /** * @var integer * * @ORM/Column(name="ID", type="integer") * @ORM/Id * @ORM/GeneratedValue(strategy="IDENTITY") */ private $id; /** * @var /Doctrine/Common/Collections/Collection * * @ORM/ManyToMany(targetEntity="Studyx/EnrolmentBundle/Entity/Location", inversedBy="course") * @ORM/JoinTable(name="course_has_location", * joinColumns={ * @ORM/JoinColumn(name="course_ID", referencedColumnName="ID") * }, * inverseJoinColumns={ * @ORM/JoinColumn(name="location_ID", referencedColumnName="ID") * } * ) */ private $location; /** * @var /Doctrine/Common/Collections/Collection * * @ORM/OneToMany(targetEntity="Studyx/EnrolmentBundle/Entity/Session", mappedBy="course") */ private $session; /** * Add session * * @param /Studyx/EnrolmentBundle/Entity/Session $session * @return Session */ public function addSession(/Studyx/EnrolmentBundle/Entity/Session $session) { $this->session[] = $session; return $this; } /** * Remove session * * @param /Studyx/EnrolmentBundle/Entity/Session $session */ public function removeSession(/Studyx/EnrolmentBundle/Entity/Session $session) { $this->session->removeElement($session); } /** * Get session * * @return /Doctrine/Common/Collections/Collection */ public function getSession() { return $this->session; } /** * Constructor */ public function __construct() { $this->location = new /Doctrine/Common/Collections/ArrayCollection(); } public function __toString() { if(!is_null($this->name)) { return $this->name; } else{ return ""; } } /** * Set name * * @param string $name * @return Course */ public function setName($name) { $this->name = $name; return $this; } /** * Get name * * @return string */ public function getName() { return $this->name; } /** * Set description * * @param string $description * @return Course */ public function setDescription($description) { $this->description = $description; return $this; } /** * Get description * * @return string */ public function getDescription() { return $this->description; } /** * Set materials * * @param string $materials * @return Course */ public function setMaterials($materials) { $this->materials = $materials; return $this; } /** * Get materials * * @return string */ public function getMaterials() { return $this->materials; } /** * Set numberOfParticipants * * @param integer $numberOfParticipants * @return Course */ public function setNumberOfParticipants($numberOfParticipants) { $this->numberOfParticipants = $numberOfParticipants; return $this; } /** * Get numberOfParticipants * * @return integer */ public function getNumberOfParticipants() { return $this->numberOfParticipants; } /** * Set numberOfDays * * @param integer $numberOfDays * @return Course */ public function setNumberOfDays($numberOfDays) { $this->numberOfDays = $numberOfDays; return $this; } /** * Get numberOfDays * * @return integer */ public function getNumberOfDays() { return $this->numberOfDays; } /** * Set price * * @param string $price * @return Course */ public function setPrice($price) { $this->price = $price; return $this; } /** * Get price * * @return string */ public function getPrice() { return $this->price; } /** * Set priceKmo * * @param string $priceKmo * @return Course */ public function setPriceKmo($priceKmo) { $this->priceKmo = $priceKmo; return $this; } /** * Get priceKmo * * @return string */ public function getPriceKmo() { return $this->priceKmo; } /** * Get id * * @return integer */ public function getId() { return $this->id; } /** * Add location * * @param /Studyx/EnrolmentBundle/Entity/Location $location * @return Course */ public function addLocation(/Studyx/EnrolmentBundle/Entity/Location $location) { $this->location[] = $location; return $this; } /** * Remove location * * @param /Studyx/EnrolmentBundle/Entity/Location $location */ public function removeLocation(/Studyx/EnrolmentBundle/Entity/Location $location) { $this->location->removeElement($location); } /** * Get location * * @return /Doctrine/Common/Collections/Collection */ public function getLocation() { return $this->location; } }

Entidad de sesión :

<?php namespace Studyx/EnrolmentBundle/Entity; use Doctrine/ORM/Mapping as ORM; /** * Session * * @ORM/Table(name="session") * @ORM/Entity */ class Session { /** * @var string * * @ORM/Column(name="type", type="string", length=45, nullable=false) */ private $type; /** * @var integer * * @ORM/Column(name="ID", type="integer") * @ORM/Id * @ORM/GeneratedValue(strategy="IDENTITY") */ private $id; /** * @var /Studyx/EnrolmentBundle/Entity/Course * * @ORM/ManyToOne(targetEntity="Studyx/EnrolmentBundle/Entity/Course", inversedBy="session") * @ORM/JoinColumns({ * @ORM/JoinColumn(name="course_ID", referencedColumnName="ID") * }) */ private $course; /** * @var /Doctrine/Common/Collections/Collection * * @ORM/OneToMany(targetEntity="Studyx/EnrolmentBundle/Entity/Moment", mappedBy="session") */ private $moment; /** * Add moment * * @param /Studyx/EnrolmentBundle/Entity/Moment $moment * @return Moment */ public function addMoment(/Studyx/EnrolmentBundle/Entity/Moment $moment) { $this->moment[] = $moment; return $this; } /** * Remove moment * * @param /Studyx/EnrolmentBundle/Entity/Moment $moment */ public function removeMoment(/Studyx/EnrolmentBundle/Entity/Moment $moment) { $this->moment->removeElement($moment); } /** * Get moment * * @return /Doctrine/Common/Collections/Collection */ public function getMoment() { return $this->moment; } public function __toString() { if(!is_null($this->type)) { return $this->type; } else{ return ""; } } /** * Set type * * @param string $type * @return Session */ public function setType($type) { $this->type = $type; return $this; } /** * Get type * * @return string */ public function getType() { return $this->type; } /** * Get id * * @return integer */ public function getId() { return $this->id; } /** * Set course * * @param /Studyx/EnrolmentBundle/Entity/Course $course * @return Session */ public function setCourse(/Studyx/EnrolmentBundle/Entity/Course $course = null) { $this->course = $course; return $this; } /** * Get course * * @return /Studyx/EnrolmentBundle/Entity/Course */ public function getCourse() { return $this->course; } }

Entidad de momento :

<?php namespace Studyx/EnrolmentBundle/Entity; use Doctrine/ORM/Mapping as ORM; /** * Moment * * @ORM/Table(name="moment") * @ORM/Entity */ class Moment { /** * @var /DateTime * * @ORM/Column(name="time", type="datetime", nullable=false) */ private $time; /** * @var integer * * @ORM/Column(name="ID", type="integer") * @ORM/Id * @ORM/GeneratedValue(strategy="IDENTITY") */ private $id; /** * @var /Studyx/EnrolmentBundle/Entity/Session * * @ORM/ManyToOne(targetEntity="Studyx/EnrolmentBundle/Entity/Session") * @ORM/JoinColumns({ * @ORM/JoinColumn(name="session_ID", referencedColumnName="ID") * }) */ private $session; public function __toString() { if(!is_null($this->time)) { return $this->time; } else{ return ""; } } /** * Set time * * @param /DateTime $time * @return Moment */ public function setTime($time) { $this->time = $time; return $this; } /** * Get time * * @return /DateTime */ public function getTime() { return $this->time; } /** * Get id * * @return integer */ public function getId() { return $this->id; } /** * Set session * * @param /Studyx/EnrolmentBundle/Entity/Session $session * @return Moment */ public function setSession(/Studyx/EnrolmentBundle/Entity/Session $session = null) { $this->session = $session; return $this; } /** * Get session * * @return /Studyx/EnrolmentBundle/Entity/Session */ public function getSession() { return $this->session; } }

ACTUALIZAR:

He agregado algunos var_dumps a mi función getChildFormBuilder así:

public function getChildFormBuilder(FormBuilder $formBuilder, $elementId) { foreach (new FormBuilderIterator($formBuilder) as $name => $formBuilder) { if ($name == $elementId) { return $formBuilder; } } var_dump(__METHOD__); var_dump($elementId); var_dump(debug_backtrace()); return; }

El resultado es esto:

string ''Sonata/AdminBundle/Admin/AdminHelper::getChildFormBuilder'' (length=57) string ''s56cdfa72c4dea_session_0_moment'' (length=31) array (size=8) 0 => array (size=7) ''file'' => string ''/Applications/MAMP/htdocs/studyx_enrolments/app/cache/dev/classes.php'' (length=69) ''line'' => int 9774 ''function'' => string ''getChildFormBuilder'' (length=19) ''class'' => string ''Sonata/AdminBundle/Admin/AdminHelper'' (length=36) ''object'' => object(Sonata/AdminBundle/Admin/AdminHelper)[339] protected ''pool'' => object(Sonata/AdminBundle/Admin/Pool)[104] ... ''type'' => string ''->'' (length=2) ''args'' => array (size=2) 0 => object(Symfony/Component/Form/FormBuilder)[436] ... 1 => &string ''s56cdfa72c4dea_session_0_moment'' (length=31) 1 => array (size=7) ''file'' => string ''/Applications/MAMP/htdocs/studyx_enrolments/vendor/sonata-project/admin-bundle/Controller/HelperController.php'' (length=110) ''line'' => int 95 ''function'' => string ''appendFormFieldElement'' (length=22) ''class'' => string ''Sonata/AdminBundle/Admin/AdminHelper'' (length=36) ''object'' => object(Sonata/AdminBundle/Admin/AdminHelper)[339] protected ''pool'' => object(Sonata/AdminBundle/Admin/Pool)[104] ... ''type'' => string ''->'' (length=2) ''args'' => array (size=3) 0 => object(Studyx/EnrolmentBundle/Admin/CourseAdmin)[370] ... 1 => object(Studyx/EnrolmentBundle/Entity/Course)[415] ... 2 => &string ''s56cdfa72c4dea_session_0_moment'' (length=31) 2 => array (size=5) ''function'' => string ''appendFormFieldElementAction'' (length=28) ''class'' => string ''Sonata/AdminBundle/Controller/HelperController'' (length=46) ''object'' => object(Sonata/AdminBundle/Controller/HelperController)[244] protected ''twig'' => object(Twig_Environment)[220] ... protected ''helper'' => object(Sonata/AdminBundle/Admin/AdminHelper)[339] ... protected ''pool'' => object(Sonata/AdminBundle/Admin/Pool)[104] ... protected ''validator'' => object(Symfony/Component/Validator/Validator)[340] ... ''type'' => string ''->'' (length=2) ''args'' => array (size=1) 0 => object(Symfony/Component/HttpFoundation/Request)[6] ... 3 => array (size=4) ''file'' => string ''/Applications/MAMP/htdocs/studyx_enrolments/app/bootstrap.php.cache'' (length=67) ''line'' => int 2957 ''function'' => string ''call_user_func_array'' (length=20) ''args'' => array (size=2) 0 => & array (size=2) ... 1 => & array (size=1) ... 4 => array (size=7) ''file'' => string ''/Applications/MAMP/htdocs/studyx_enrolments/app/bootstrap.php.cache'' (length=67) ''line'' => int 2931 ''function'' => string ''handleRaw'' (length=9) ''class'' => string ''Symfony/Component/HttpKernel/HttpKernel'' (length=39) ''object'' => object(Symfony/Component/HttpKernel/DependencyInjection/ContainerAwareHttpKernel)[300] protected ''container'' => object(appDevDebugProjectContainer)[304] ... protected ''dispatcher'' => object(Symfony/Component/HttpKernel/Debug/TraceableEventDispatcher)[299] ... protected ''resolver'' => object(Symfony/Component/HttpKernel/Controller/TraceableControllerResolver)[249] ... ''type'' => string ''->'' (length=2) ''args'' => array (size=2) 0 => object(Symfony/Component/HttpFoundation/Request)[6] ... 1 => &int 1 5 => array (size=7) ''file'' => string ''/Applications/MAMP/htdocs/studyx_enrolments/app/bootstrap.php.cache'' (length=67) ''line'' => int 3060 ''function'' => string ''handle'' (length=6) ''class'' => string ''Symfony/Component/HttpKernel/HttpKernel'' (length=39) ''object'' => object(Symfony/Component/HttpKernel/DependencyInjection/ContainerAwareHttpKernel)[300] protected ''container'' => object(appDevDebugProjectContainer)[304] ... protected ''dispatcher'' => object(Symfony/Component/HttpKernel/Debug/TraceableEventDispatcher)[299] ... protected ''resolver'' => object(Symfony/Component/HttpKernel/Controller/TraceableControllerResolver)[249] ... ''type'' => string ''->'' (length=2) ''args'' => array (size=3) 0 => object(Symfony/Component/HttpFoundation/Request)[6] ... 1 => &int 1 2 => &boolean true 6 => array (size=7) ''file'' => string ''/Applications/MAMP/htdocs/studyx_enrolments/app/bootstrap.php.cache'' (length=67) ''line'' => int 2333 ''function'' => string ''handle'' (length=6) ''class'' => string ''Symfony/Component/HttpKernel/DependencyInjection/ContainerAwareHttpKernel'' (length=73) ''object'' => object(Symfony/Component/HttpKernel/DependencyInjection/ContainerAwareHttpKernel)[300] protected ''container'' => object(appDevDebugProjectContainer)[304] ... protected ''dispatcher'' => object(Symfony/Component/HttpKernel/Debug/TraceableEventDispatcher)[299] ... protected ''resolver'' => object(Symfony/Component/HttpKernel/Controller/TraceableControllerResolver)[249] ... ''type'' => string ''->'' (length=2) ''args'' => array (size=3) 0 => object(Symfony/Component/HttpFoundation/Request)[6] ... 1 => &int 1 2 => &boolean true 7 => array (size=7) ''file'' => string ''/Applications/MAMP/htdocs/studyx_enrolments/web/app_dev.php'' (length=59) ''line'' => int 29 ''function'' => string ''handle'' (length=6) ''class'' => string ''Symfony/Component/HttpKernel/Kernel'' (length=35) ''object'' => object(AppKernel)[5] protected ''bundles'' => array (size=22) ... protected ''bundleMap'' => array (size=22) ... protected ''container'' => object(appDevDebugProjectContainer)[304] ... protected ''rootDir'' => string ''/Applications/MAMP/htdocs/studyx_enrolments/app'' (length=47) protected ''environment'' => string ''dev'' (length=3) protected ''debug'' => boolean true protected ''booted'' => boolean true protected ''name'' => string ''app'' (length=3) protected ''startTime'' => float 1456339594.61 protected ''loadClassCache'' => array (size=2) ... ''type'' => string ''->'' (length=2) ''args'' => array (size=1) 0 => object(Symfony/Component/HttpFoundation/Request)[6] ...

ACTUALIZACIÓN 2:

Cambié el requerimiento en mi composer.json a "sonata-project / admin-bundle": "^2.4@dev" y lo actualicé con el compositor. Pero ahora estoy obteniendo este error:

ContextErrorException: Advertencia: Illegal string offset ''admin'' en la aplicación / cache / dev / classes.php línea 10482

El error está en esta función:

public function getDashboardGroups() { $groups = $this->adminGroups; foreach ($this->adminGroups as $name => $adminGroup) { if (isset($adminGroup[''items''])) { foreach ($adminGroup[''items''] as $key => $item) { if (''''!= $item[''admin'']) { $admin = $this->getInstance($item[''admin'']); if ($admin->showIn(Admin::CONTEXT_DASHBOARD)) { $groups[$name][''items''][$key] = $admin; } else { unset($groups[$name][''items''][$key]); } } else { unset($groups[$name][''items''][$key]); } } } if (empty($groups[$name][''items''])) { unset($groups[$name]); } } return $groups; }

Los errores en línea: if (''''!= $item[''admin'']) { .

En mi config.yml tengo:

sonata_admin: title: Studyx title_logo: bundles/studyxenrolment/images/logo.png templates: layout: StudyxEnrolmentBundle:Admin:standard_layout.html.twig edit: StudyxEnrolmentBundle:CRUD:edit.html.twig user_block: StudyxEnrolmentBundle:Admin:user_block.html.twig # search: SonataAdminBundle:Core:search.html.twig # search_result_block: SonataAdminBundle:Block:block_search_result.html.twig dashboard: groups: studyx.admin.group.inschrijvingen: label: Inschrijvingen items: ~ item_adds: - sonata.admin.enrolment studyx.admin.group.algemeen: label: Algemeen items: ~ item_adds: - sonata.admin.course - sonata.admin.student studyx.admin.group.extra: label: Extra items: ~ item_adds: - sonata.admin.location blocks: - position: top class: col-md-12 type: sonata.admin.block.admin_list

Así que creo que la función getDashboardGroups se llama allí.

ACTUALIZACIÓN 3:

En mi composer.json ahora tengo lo siguiente:

"sonata-project/block-bundle": "~2.3", "sonata-project/admin-bundle": "^2.4@dev", "sonata-project/doctrine-orm-admin-bundle": "2.3.*", "sonata-project/formatter-bundle": "^2.3"

¿Debo actualizarlos todos a ^2.4@dev ?


Este error se produce porque tiene más de dos niveles de formularios de recopilación anidados y actualmente no es compatible con ninguna versión de sonata-admin.

De @rande (propietario) y mantenedores de sonata en los números #262 , #1228 , #1327 y #1971 :

Esto todavía no es compatible por ahora ...

También puede ver este viejo PR #1971 que debería resolver el problema solo para algunos casos de uso.

La solución que le propongo es implementar la solución provista por la última PR abierta #2985 .
Debido a que el PR no está fusionado, necesita decirle al compositor que lo cargue en lugar de la versión actual (que no funciona como se esperaba). (ver compositor y VCS ).

Espero que el PR se fusione pronto.
Hasta que lo haga, no dude en solucionar su problema en este momento utilizándolo directamente, como lo hacen muchas personas.

ACTUALIZAR

La Solicitud de extracción n.º 3553 se ha fusionado recientemente y soluciona el problema de las colecciones anidadas en> 2 niveles (anidados en anidados).

Para obtener la versión fija, debe usar la etiqueta dev-master del paquete (al menos desde la confirmación 926f159 que representa la combinación de la PR).

Lo intenté y funciona bien con el siguiente requisito:

// composer.json "require": { "sonata-project/admin-bundle": "^2.4@dev", ... },

Espero que pueda actualizar fácilmente el paquete para obtener la solución.

Actualización2

Aparentemente, tu compositor no toma los últimos cambios de la rama.
La solución proporcionada por el PR #2739 se ha fusionado hace 6 días.

Para solucionar este último (esperanza), debe cambiar un bloque de código muy corto en AddDepencyCallsCompilerPass ubicado en vendor/sonata-project/admin-bundle/DependencyInjection/Compiler/AddDependencyCallsCompilerPass .

En la línea 95, reemplace esta línea:

$groupDefaults[$resolvedGroupName][''items''][] = $id;

Para aquellos:

$groupDefaults[$resolvedGroupName][''items''][] = array( ''admin'' => $id, ''label'' => !empty($attributes[''label'']) ? $attributes[''label''] : '''', ''route'' => '''', ''route_params'' => array(), );

Al igual que lo hace el RP (es el único cambio necesario para que funcione).

Haría la corrección manualmente porque es muy nueva, y después de algunos días / semanas, ejecute los siguientes comandos:

composer clear-cache y composer update sonata-project/admin-bundle

Debería probarlo ahora antes de agregar la corrección manualmente, tal vez se agregarán los cambios.

Además, puede usar el enlace sobre compositor y VCS que proporcioné al comienzo de mi respuesta y requerir la solución directamente. Es en su propio aprecio debido a que es una solución en este momento.

Y, por último, tenga paciencia, las correcciones se fusionarán pronto en versiones estables.


public function getChildFormBuilder(FormBuilder $formBuilder, $elementId) { foreach (new FormBuilderIterator($formBuilder) as $name => $formBuilder) { if ($name == $elementId) { return $formBuilder; } } return; }

Volcar el nombre y la identificación del elemento dentro del ciclo no logrará nada. Obviamente, su aplicación falla cuando no hay nada que iterar: luego recorre el ciclo, sale y va a la última línea donde se devuelve NULL .

Sugiero que elimines el ID del elemento justo después del ciclo, como el siguiente. El uso de debug_backtrace también podría ayudar:

public function getChildFormBuilder(FormBuilder $formBuilder, $elementId) { foreach (new FormBuilderIterator($formBuilder) as $name => $formBuilder) { if ($name == $elementId) { return $formBuilder; } } var_dump(__METHOD__); var_dump($elementId); var_dump(debug_backtrace()); return; }