Tipo di campo repeated

Uno speciale “gruppo” di campi, che crea due campi identici, i cui valori devono combaciare (altrimenti, viene lanciato un errore di validazione). L’uso più comune è quando serve che l’utente ripeta la sua password o la sua email, per verificarne l’accuratezza.

Reso come solitamente campo input text, ma vedere l’opzione type
Opzioni
Opzioni ridefinite
Opzioni ereditate
Tipo genitore form
Classe Symfony\Component\Form\Extension\Core\Type\RepeatedType

Esempio di utilizzo

$builder->add('password', 'repeated', array(
    'type' => 'password',
    'invalid_message' => 'Le password devono combaciare.',
    'options' => array('attr' => array('class' => 'password-field')),
    'required' => true,
    'first_options'  => array('label' => 'Password'),
    'second_options' => array('label' => 'Ripetere Password'),
));

Dopo un invio di form con successo, il valore inserito in entrambi i campi “password” diventa il dato della voce password. In altre parole, anche se i due campi sono effettivamente resi, i dati finali del form conterranno il singolo valore (solitamente una stringa) necessario.

L’opzione più importante è type, che può essere un qualsiasi tipo di campo e determina il tipo effettivo dei due campi. L’opzione options è passata a ciascuno dei due campi, il che vuol dire, in questo esempio, che è supportata qualsiasi opzione supportata dal tipo password.

Resa

Il tipo di campo repeated consiste in realtà di due campi, che possono essere resi in una volta sola o singolarmente. Per renderli in una volta sola, usare qualcosa come:

  • Twig
    {{ form_row(form.password) }}
    
  • PHP
    <?php echo $view['form']->row($form['password']) ?>
    

Per rendere ogni campo singolarmente, usare qualcosa come:

  • Twig
    {# .first e .second possono variare, vedere nota più avanti #}
    {{ form_row(form.password.first) }}
    {{ form_row(form.password.second) }}
    
  • PHP
    <?php echo $view['form']->row($form['password']['first']) ?>
    <?php echo $view['form']->row($form['password']['second']) ?>
    

Nota

I nomi first e second sono i predefiniti per i due sottocampi. Tuttavia, tali nomi possono essere controllati tramite opzioni first_name e second_name. Se sei impostano tali opzioni, occorre usare i valori impostati, al posto di first e second, durante la resa.

Validazione

Una delle caratteristiche fondamentali del campo repeated è la validazione interna (non occorre fare nulla per impostarla), che forza i due campi ad avere valori combacianti. Se i due campi non combaciano, sarà mostrato un errore all’utente.

Si può usare l’opzione invalid_message per personalizzare l’errore che sarà mostrato quando i due campi non combaciano.

Opzioni del campo

type

tipo: stringa predefinito: text

I due campi sottostanti saranno di questo tipo. Per esempio, passare un tipo password renderà due campi password.

options

tipo: array predefinito: array()

Questa opzione sarà passata a ciascuno dei due campi sottostanti. In altre parole, queste opzioni personalizzano i singoli campi. Per esempio, se l’opzione type è password, questo array potrebbe contenere le opzioni always_empty o required, che sono opzioni supportate dal tipo di campo password.

first_options

tipo: array predefinito: array()

Ulteriori opzioni (saranno fuse in options) da passare solo al primo campo. Particolarmente utile per personalizzare la label:

$builder->add('password', 'repeated', array(
    'first_options'  => array('label' => 'Password'),
    'second_options' => array('label' => 'Ripetere Password'),
));

second_options

tipo: array predefinito: array()

Ulteriori opzioni (saranno fuse in options) da passare solo al secondo campo. Particolarmente utile per personalizzare la label (vedere first_options).

first_name

tipo: stringa predefinito: first

L’effettivo nome del campo usato per il primo campo. Per lo più non ha significato, tuttavia, essendo i dati effettivi inseriti in entrambi i campi disponibili sotto la chiave associata al campo repeated medesimo (p.e. password). Tuttavia, se non si specifica una label, questo nome di campo è usato per “indovinare” la label.

second_name

tipo: stringa predefinito: second

Come first_name, ma per il secondo campo.

Opzioni ridefinite

error_bubbling

predefinito: false

Opzioni ereditate

Queste opzioni sono ereditate dal tipo form:

data

tipo: mixed predefinito: Predefinito al campo dell’oggetto sottostante (se presente)

Quando si crea un form, ogni campo inizialmente mostra il valore della proprietà corrispondente dell’oggetto del dominio del form (se un oggetto è legato al form). Se si vuole sovrascrivere il valore iniziale per il form o solo per un singolo campo, lo si può fare con l’opzione data:

$builder->add('token', 'hidden', array(
    'data' => 'abcdef',
));

invalid_message

tipo: stringa predefinito: This value is not valid

Questo è il messaggio di errore di validazione usato quando i dati inseriti sono determinati dalla validazione interna di un tipo di campo. Questo può accadere, per esempio, se l’utente inserire una stringa dentro un campo time che non può essere convertito in un tempo reale. Per i normali messaggi di validazione (come quando si imposta la lunghezza minima per un campo), impostare i messaggi di validazione con le proprie regole di validazione (riferimento).

invalid_message_parameters

tipo: array predefinito: array()

Impostando l’opzione invalid_message, si potrebbe aver bisogno di includere alcune variabili nella stringa. Lo si può fare aggiungendo dei segnaposto all’opzione e includendo le variabili in questa opzione:

$builder->add('un_campo', 'un_tipo', array(
    // ...
    'invalid_message'            => 'Valore inserito non valido: deve includere almeno %num% caratteri',
    'invalid_message_parameters' => array('%num%' => 6),
));

mapped

tipo: booleano

Se si vuole che il campo sia ignorato durante la lettura o la scrittura dell’oggetto, si può impostare l’opzione mapped a false

error_mapping

tipo: array predefinito: empty

Questa opzione consente di modificare il bersaglio di un errore di validazione.

Si immagini di avere un metodo personalizzato, di nome matchingCityAndZipCode, che valida se una città e un codice postale corrsispondano. Purtroppo non c’è un campo “matchingCityAndZipCode” nel form, quindi tutto ciò che può fare Symfony è mostrare l’errore in cima al form stesso.

Con la mappatura personalizzata degli errori, si può fare meglio: mappare l’errore al campo della città, in modo che sia mostrato accanto a esso:

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'error_mapping' => array(
            'matchingCityAndZipCode' => 'city',
        ),
    ));
}

Ecco le regole per i lati destro e sinistro della mappatura:

  • I lato sinistro contiene i percorsi delle proprietà.
  • Se la validazione è generata su una proprietà o metodo di una classe, il suo percorso è semplicemente “nomeProprietà”.
  • Se la validazione è generata su un elemento di un array od oggetto ArrayAccess, il percorso è [nomeIndice].
  • Si possono costruire percorsi innestati, concatenandoli, separando le proprietà con dei punti. Per esempio: addresses[work].matchingCityAndZipCode
  • Anche il lato sinistro della mappatura accetta un punto ., che si riferisce al campo stesso. Questo significa che un errore aggiunto al campo è aggiunto invece al dato campo innnestato.
  • Il lato destro contiene semplicemente i nomi dei campi nel form.