2011-12-07 8 views
21

Attualmente sto cercando di utilizzare il Componente Modulo Symfony2 nonostante il microframework Silex.Componente Modulo Symfony2 - creazione di campi senza il nome del modulo nell'attributo nome

mio modulo di accesso viene generato come segue:

$app = $this->app; 

$constraint = new Assert\Collection(array(
    'username' => new Assert\NotBlank(), 
    'password' => new Assert\NotBlank(), 
)); 

$builder = $app['form.factory']->createBuilder('form', $data, array('validation_constraint' => $constraint)); 

$form = $builder 
    ->add('username', 'text', array('label' => 'Username')) 
    ->add('password', 'password', array('label' => 'Password')) 
    ->getForm() 
; 

return $form; 

Il problema è che la forma risultante è stato creato come segue:

<fieldset> 
    <input type="hidden" value="******" name="form[_token]" id="form__token"> 
    <section class=""> 
     <label class=" required" for="form_username">Username</label> 
     <div><input type="text" value="" name="form[username]" id="form_username" class="text"></div> 
    </section> 
    <section class=""> 
     <label class=" required" for="form_password">Password</label> 
     <div><input type="password" value="" name="form[password]" id="form_password" class="password"></div> 
    </section> 
    <section> 
     <div><button class="fr submit">Login</button></div> 
    </section> 
</fieldset> 

Mentre io voglio il nome e l'ID attributi per essere il più segue:

Ho setacciato il Web e ho trovato consigli sull'opzione 'property_path' ma credo che questo abbia a che fare con la classe utilizzata per elaborare i dati quando viene utilizzata nell'attuale framework Symfony2 stesso.

che ho passato i file di componenti forma e il punto come che questo è stato impostato è in:

Symfony/Component/Form/Extension/core/tipo/FieldType.php - linea 71

public function buildView(FormView $view, FormInterface $form) 
{ 
    $name = $form->getName(); 

    if ($view->hasParent()) { 
     $parentId = $view->getParent()->get('id'); 
     $parentFullName = $view->getParent()->get('full_name'); 
     $id = sprintf('%s_%s', $parentId, $name); 
     $fullName = sprintf('%s[%s]', $parentFullName, $name); 
    } else { 
     $id = $name; 
     $fullName = $name; 
    } 
    ... 

Unforunately the FormFactory utilizza il FormBuilder che quindi funziona con la classe Form e non ho avuto il tempo sufficiente per analizzare l'intero funzionamento interno del componente.

So che i campi vengono aggiunti alla matrice "bambini" all'interno di FormBuilder con un elenco di opzioni corrispondente. Quando viene chiamata la funzione getForm, viene creato un nuovo modulo e ogni FieldType figlio viene immesso nel modulo utilizzando il metodo add(). Questo form-> add() metodo imposta automaticamente il modulo come il genitore di ogni bambino:

public function add(FormInterface $child) 
{ 
    $this->children[$child->getName()] = $child; 

    $child->setParent($this); 

    if ($this->dataMapper) { 
     $this->dataMapper->mapDataToForm($this->getClientData(), $child); 
    } 

    return $this; 
} 

senza iniziare a ignorare queste classi solo per rimuovere questo Qualcun altro sa del metodo migliore per la semplice visualizzazione del nome campi ?

È possibile estrarre semplicemente "nome" anziché "full_name" nel blocco form_div_layout.html.twig widget_attributes ma non ero sicuro se questo fosse ideale (dato che l'ID rimane invariato) o se c'era un altro metodo o opzioni iniettabili che farebbero il trucco.

risposta

24

Invece di utilizzare la funzione createBuilder:

$builder = $app['form.factory']->createNamedBuilder(null, 'form', $data, array('validation_constraint' => $constraint)); 

Primo parametro è il nome del modulo.

Esempio di Bernhard Schussek se stesso al https://stackoverflow.com/a/13474522/520114

+0

Ahhh, ora, perché non ho guardato su GitHub, avrebbe avuto senso. Grazie :) – thingygeoff

+0

@thingygeoff quindi puoi accettare questa risposta :) – j0k

+0

Ah ah! hai aggiornato la tua risposta - una soluzione ideale! Grazie – thingygeoff

7

Se non si utilizza form figlio è possibile impostare il metodo getName del modulo come stringa vuota:

class FormType extend AbstractType { 
    // ... 

    public function getName() { 
     return ''; 
    } 
} 
25

In Symfony3, ignorare AbstractType :: getBlockPrefix in classe figlio per restituire null.

Problemi correlati