Segnalare L'errore "uno Dei Ter Campi È Obbligatorio" Una Sola Volta

ho tre campi, opzionali, ma ALMENO UNO dei tre deve essere inserito.

Ho creato un vaildatore custom che, se nessuno dei tre è compilato, esegue l’addError SOLO SUL PRIMO dei tre campi.

Solo che, giustamente, questo validatore viene eseguito 3 volte.

Il risultato è che in cima alla form di inserimento ho 3 volte la notifica dello stesso errore… C’è modo di dirgli aggiungi questo errore se non c’è già ? O qualcosa del genere ?

Si accettano suggerimenti su strade alternative

Innanzitutto gestirei l’attivazione o meno di questi 3 checkbox tramite un solo campo

(di tipo set mysql, oppure int con potenze del 2, …).

Dopodichè se il campo non è impostato (cioè null), nessun check è attivo e quindi si attività

solo una visualizzazione di errore.

Eventualmente se non vuoi gestire con un solo campo, puoi togliere la gestione automatica

dell’errore e mettere un messaggio di errore personalizzato:

http://www.yiiframework.com/wiki/463/custom-login-error-messages/

Cerco di rispiegarmi: io ho 3 campi la cui validazione è: OK se almeno uno dei tre è compilato.

Cio vuol dire che l’utente deve sempre compilare almeno uno dei tre, ma a sua scelta, quindi non ho afferrato l’utilizzo che mi consigli di fare della checkbox.

Potrei semplicemente eseguire la validazione su un campo solo (tenendo conto però di tutte e tre), ma poi in futuro me ne pentirò di sicuro, quindi voglio evitarlo

Ti faccio un esempio di quello che ti ho scritto.

Mettiamo che il campo si chiami "selezione_check".

Se tu hai tre checkbox:

<input type="checkbox" name="selezione_check" value="1" />

<input type="checkbox" name="selezione_check" value="2" />

<input type="checkbox" name="selezione_check" value="3" />

Se tu mandi il form senza selezionare alcun check, avrai che selezione_check = NULL. Se lo metti nella lista dei required (in rules()),

otterrai un solo messaggio di errore.

Se ne viene selezionato uno, la validazione passa.

Se ne viene selezionato più di uno, per memorizzarlo hai 2 opzioni: puoi memorizzare il campo in un campo di tipo SET su MySQL (mettendo nel valore magari un testo piuttosto che un numero), oppure se il valore è un numero usare le potenze del 2, come somma dei valori selezionati, ciascuno preso come potenza di 2.

Esempio, in questo secondo caso, se sono selezionati il primo ed il terzo, avrai che il campo che conterrà il valore sarà: 1^2 + 3^2 = 1 + 9 = 10

Poi quando devi sapere se un check è utilizzato o meno, basta fare = <valore_campo> AND <valore_da_controllare>^2.

L’approccio con il campo SET forse è più semplice nel tuo caso (soprattutto se il check riguarda testi.

se ti trovi nel caso che ha spiegato bene Fabrizio, segui il suo consiglio… anche io in quel caso lì farei la stessa cosa.

Se invece sono tre campi distinti e devono rimanere tali perchè magari non omogenei tra loro… prova a guardarti questa estensione:

http://www.yiiframework.com/extension/yii-conditional-validator/

l’ho provata un paio di volte e faceva il suo lavoro egregiamente.

scusate ma ancora una volta non mi devo essere spiegato bene …

la validazione è fatta e funziona , e i tre campi devono rimane separati, perchè tra l’altro vengono rice&trasmessi da un altra applicazione

Posto questo, se c’è un errore in uno dei tre campi, l’addError viene eseguito tre volte (sempre sul primo dei tre), e quindi vedo un ‘hint’ di tipo errore una sola volta, ma in cima al form, dove c’è l’elenco degli errori, viene riportato tre volte.

Vi chiedevo solo come evitare sta cosa, e comunque grazie per l’approccio a campo singolo, anche se insolitamente complesso per un problema così banale.

Se imposti una variabile $_errorepresente nel tuo model,

la funzione di validazione potrebbe controllare se è già settata, nel qual caso non verrebbe eseguita. Altrimenti controlla, valida o meno e setta a 1 la variabile, restituendo l’errore…