2012-08-31 20 views
13

Sto provando a fare un semplice modulo per aggiungere un'attività con un nome e un colore.symfony2 personalizza modulo seleziona opzioni

Quindi voglio fare una lista con un po 'di colori, per ora funziona, ho il nome del colore.
posso aggiungere qualsiasi attributo alla mia tag select:

$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') 
      )); 

L'output sarà simile a questo:

<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> 

Ma come posso aggiungere selected="selected" e qualsiasi attributo che voglio ai miei selezionare le opzioni? in questo modo:

<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> 

La mia domanda è: come posso aggiungere attr personalizzato per option tag (non per select tag) da symfony FormBuilder.
AVVISO: Non voglio usare JavaScript. Voglio usare symfony2 FormBuilder per personalizzare le mie opzioni di selezione.

risposta

10

In genere, i dati predefiniti di un campo sono determinati dal valore memorizzato nell'oggetto. Ad esempio, se

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

quindi la voci "1" e "2" (con le etichette "rosso" e "verde") viene visualizzata come selezionata per impostazione predefinita. Si potrebbe anche memorizzare questo valore nell'oggetto prima di passarlo al form:

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

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

L'ultima possibilità è quella di sostituire il valore di default memorizzato nell'oggetto passando l'opzione "Data":

$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

Ogni Field in symfony eredita da abstract field type, che ha un'opzione data, in cui è possibile passare l'opzione predefinita.

A proposito, non passare il materiale style e per gli attrs personalizzati utilizzare gli attributi data-*.

+0

come posso usare ''-dati attributi? come lo passo al FormBuilder. per favore spiega di più –

+0

Basta rinominare 'customattr' in' data-customattr', per essere conforme a HTML. – moonwave99

+0

Voglio usare 'customattr' per il mio tag' option', non per il tag 'select'. Come posso fare questo da FormBuilder? –

3

utilizzare l'opzione di dati descritte qui fo selected = "selezionato": http://symfony.com/doc/current/reference/forms/types/field.html

in ur caso potrebbe essere così

$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 
      )); 

il nuovo elemento è dati impostazione del numero della matrice scelta come attributo selezionato

1

Aggiungi nel metodo di classe sotto forma 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

Per aggiungere la attributo personalizzato sulla scelta, in base al valore di tale scelta, considerare l'utilizzo dell'opzione choice_attr del campo ChoiceType.

Per esempio, se si desidera passare JSON entità codificato per l'opzione, si può usare qualcosa di simile:

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