2012-09-27 10 views
7

Mi proyecto requiere que reconstruya la funcionalidad de un sistema grande mientras conserva la estructura de la base de datos (por razones de facturación histórica). Empecé con Symfony 2.0.xy comencé el proceso de actualización a Symfony 2.1.2.Acceder a elecciones específicas directamente desde el elemento ChoiceType en Twig

Anteriormente, podía acceder directamente a las opciones individuales de un grupo de radio (múltiple = falso, expandido = verdadero) en Twig utilizando la notación de puntos. Por ejemplo, en mi forma he definido el elemento parecido a esto:

$builder->add('settings_group', 'choice', array(
     'choices' => array(
      'existing' => 'A pre-existing setting group', 
      'override' => 'Specify an override instead' 
     ), 
     'multiple' => false, 'expanded' => true, 
     'property_path' => false 
     ) 
    ); 

En mi plantilla Twig, mi margen de beneficio fue de esta manera:

<ul> 
     <li> 
      {{ form_widget(form.settings_group.existing) }} 
      [ .. dropdown ..] 
     </li> 
     <li> 
      {{ form_widget(form.settings_group.override) }} 
      [ .. text input .. ] 
     </li> 
    </ul> 

Funcionó a la perfección para lo que tenía que hacer, como los botones de opción "existente" o "anular" determinarían qué campos se conservaron y cuáles se restablecieron cuando se guardó la entidad. Específicamente, mi problema surge porque quiero separar manualmente los botones de radio y enviar varios otros campos de formulario antes del siguiente botón de radio. Es un patrón recurrente en varias formas en este sistema, basado en la funcionalidad y base de datos existentes.

Después de actualizar a Symfony 2.1, esto ya no es posible y me sale un error:

Method "existing" for object "Symfony\Component\Form\FormView" does not exist

He intentado varias posibilidades incluyendo .get() y la iteración en .choices() [que termina dándome objetos ChoiceView que luego no puedo enviar usando form_widget()]. Intenté crear un solo botón de encapsulación de tipo de letra personalizado más los campos de configuración asociados, pero debido a la forma en que se crean los nombres de los elementos, no puedo permitir que sean mutuamente exclusivos. También intenté hacer que un tipo más complejo representara ambas opciones y campos asociados, pero una vez más no pude acceder y presentar una opción específica en la plantilla del tipo.

Idealmente, espero algo en la API que simplemente haya pasado por alto y que pueda encontrar/reemplazar y ponerlo en funcionamiento. De lo contrario, se agradecerían consejos sobre (o un enlace a) un enfoque más amigable con Symfony para hacer esto.

Respuesta

0

Ha intentado algo así como:

<ul> 
    <li> 
     {{ form_widget(form['settings_group']['existing']) }} 
     [ .. dropdown ..] 
    </li> 
    <li> 
     {{ form_widget(form['settings_group']['override']) }} 
     [ .. text input .. ] 
    </li> 
</ul> 
+0

Hola, tenía esperanzas. Está cerca, pero no hay cigarro. Me dicen: 'Key" existing "en el objeto (con ArrayAccess) del tipo" Symfony \ Component \ Form \ FormView "no existe ...' –

+0

Una idea: ¿estás usando Twig's {{dump ()} } para imprimir el contenido de los objetos, como para depurar su código? Voy a echar un vistazo más adelante a lo que está tratando de lograr. –

2

me he enfrentado a una situación similar y resuelto de esta manera:

<li> 
    {{ form_widget(form.myRadioField.children[0]) }} 
</li> 
<li> 
    {{ form_widget(form.myRadioField.children[1]) }} 
</li> 

Esto es de ninguna manera limpia, reutilizable, mejor -practicar el código pero funciona.

+0

¡Ack! Eso funciona, y nada más lo he intentado ... pero, como tú dices, no es reutilizable ... ¿alguna vez encontraste otra forma? – matt

+0

Sí, en realidad Twig proporciona una manera de anular el diseño de cualquier parte del formulario. Incluso para un campo dado específico. Deberías usar esa posibilidad para personalizarlo. –

Cuestiones relacionadas