2012-08-31 16 views
13

Estoy tratando de hacer un formulario simple para agregar una actividad con un nombre y un color.symfony2 personalizar formulario seleccionar opciones

Así que quiero hacer una lista con algunos colores, por ahora funciona. Tengo el nombre del color.
puedo añadir cualquier atributo a mi seleccione la etiqueta:

$form = $this->createFormBuilder($myclass) 
->add('Colors','choice',array('label'=>'select some colors', 
      'multiple'=>true, 
      'choices'=>array(1=>'red', 2=>'blue', 3=>'green'), 
      'attr'=>array('style'=>'width:300px', 'customattr'=>'customdata') 
      )); 

La salida será algo como esto:

<select name="select" style="width: 300px;" multiple="multiple" customattr="customdata"> 
    <option value="1">red</option> 
    <option value="2">blue</option> 
    <option value="3">green</option> 
</select> 

Pero, ¿cómo puedo añadir que selected="selected" y cualquier atributo Quiero mis seleccionar opciones? de esta manera:

<select name="select" style="width: 300px;" multiple="multiple" customattr="customdata"> 
    <option style="background-color: #F00;" value="1" selected="selected">red</option> 
    <option style="background-color: #00F;" value="2" selected="selected">blue</option> 
    <option style="background-color: #0F0;" value="3">green</option> 
</select> 

Mi pregunta es: ¿cómo puedo añadir attr personalizado para option etiqueta (no para select etiqueta) por FormBuilder Symfony.
AVISO: No quiero usar JavaScript. Deseo usar Symfony2 FormBuilder para personalizar mis opciones de selección.

Respuesta

10

Normalmente, los datos predeterminados de un campo están determinados por el valor almacenado en su objeto. Por ejemplo, si

class MyClass 
{ 
    private $Colors = array(1, 2); 
} 

entonces las entradas "1" y "2" (con las etiquetas "rojo" y "verde") se mostrará como seleccionado por defecto. También podría almacenar este valor en el objeto antes de pasarlo a la forma:

$myObject->Colors = array(1, 2); 

$form = $this->createFormBuilder($myObject) 
    ... 

La última posibilidad es para anular el valor predeterminado almacenado en el objeto pasando la opción "datos":

$builder->add('Colors', 'choice', array(
    'label' => 'select some colors', 
    'multiple' => true, 
    'choices' => array(1 => 'red', 2 => 'blue', 3 => 'green'), 
    'attr' => array('style' => 'width:300px', 'customattr' => 'customdata'), 
    'data' => array(1, 2), 
)); 
1

Cada Field en symfony hereda de abstract field type, que tiene una opción data, en la que puede pasar la opción predeterminada.

Por cierto, no pase style cosas, y para attrs personalizados use atributos data-*.

+0

cómo puedo usar ''-atributos de datos? cómo lo paso a FormBuilder. por favor explica más. –

+0

Simplemente cambie el nombre 'customattr' por' data-customattr', para que sea compatible con HTML. – moonwave99

+0

Quiero usar 'customattr' para mi etiqueta' option', no para la etiqueta 'select'. ¿Cómo puedo hacer esto con FormBuilder? –

3

utilizar la opción de datos tal como se describe aquí fo selected = "selected": http://symfony.com/doc/current/reference/forms/types/field.html

en caso de ur podría ser así

$form = $this->createFormBuilder($myclass) 
->add('Colors','choice',array('label'=>'select some colors', 
      'multiple'=>true, 
      'choices'=>array(1=>'red', 2=>'blue', 3=>'green'), 
      'attr'=>array('style'=>'width:300px', 'customattr'=>'customdata'), 
      'data'=> 1 
      )); 

el nuevo elemento es datos el ajuste del número de la matriz de elección como atributo seleccionado

1

Agregar a método de clase de formulario Symfony \ Component \ Form \ AbstractType :: finishView

public function finishView(FormView $view, FormInterface $form, array $options) 
{ 
    parent::finishView($view, $form, $options); 

    $additionalAttributes = array(); 

    // myMethod - method $choice, returns a value that is to be substituted into the attribute 
    foreach ($view->children['orders']->vars['choices'] as $id => $choice) { 
     $additionalAttributes[$id] = array(
      'data-cost' => $this->propertyAccessor->getValue($choice->data, 'myMethod'), 
      'disabled' => 'disabled', 
     ); 
    } 

    foreach ($view->children['orders']->children as $id => $child) { 
     $child->vars['attr'] = array_replace(
      isset($child->vars['attr']) ? $child->vars['attr'] : array(), 
      $additionalAttributes[$id] 
     ); 
    } 
} 

Symfony2 Form – add attribute tag option in select field type

1

Con el fin de agregar su atributo personalizado en la elección, basado en el valor de esa opción, considere usar la opción choice_attr del campo ChoiceType.

Por ejemplo, si desea pasar JSON codificado entidad a la opción, se puede usar algo como esto:

'choice_attr' => function($val, $key) { 
    return ['data-object' => json_encode($val)]; 
}, 
Cuestiones relacionadas