Check Box Required Non Funziona

Salve, ecco il mio problema:

ho più classi model, ognuna con un attributo required chiamato "accetta_condizioni".

In tutti i form le validazioni client funzionano correttamente, tranne che per uno!!

Ho controllato ovunque ma non sono riuscito a venirne a capo, mi sono imbattuto in alcuni post vecchi del 2011 dove veniva segnalato come bug, ma credo sia stato risolto.

Inoltre (a parte il fatto che sto utilizzando l’ultima versione di yii) se fosse ancora un bug, non funzionerebbe da nessuna parte.

Invece in 5 form, collegati a 5 model diversi, in 4 il checkbox funziona e in uno solo non da segni di vita.

Ovviamente in ogni form ci sono più campi obbligatori, succede che nel form maledetto, se provo a fare il submit con tutti i campi ancora da compilare, nell’error-summary viene stampato anche l’errore relativo al checkbox.

Se però compilo tutti i campi obbligatori, tranne il checkbox, il submit viene effettuato lo stesso.

Sto impazzendo e non so più dove guardare. Help me!! Please!!!

Come sempre: se non vediamo codice non possiamo capire che errore è.

Di quale parte di codice hai bisogno?

Avresti qualche idea nel frattempo su cosa potrei controllare?

Partiamo dal codice che non funziona. O meglio, da quello che non fa quello che ti aspetti.

Potresti mostrare model, view, controller (action) che non funzionano?

Allora, queste sono le rules del model:




public function rules() {

        // NOTE: you should only define rules for those attributes that

        // will receive user inputs.

        return array(

            array('venditore, stato,titolo,descrizione, lingua_default, vendi_a, accetta_condizioni', 'required'),

            array('venditore, attivo, quantita, articolo_permanente, accetta_condizioni', 'numerical', 'integerOnly' => true),

            array('stato, codice_magazzino, offerta_privati, offerta_azienda', 'length', 'max' => 45),

            array('vendi_a', 'length', 'max' => 20),

            //array('accetta_condizioni','required', 'requiredValue'=>1 ),

            array('video, immagine', 'length', 'max' => 255),

            array('peso, altezza, lunghezza, larghezza, lingua_default, prezzo_privati, prezzo_azienda, percentuale_sconto_privati, soglia_trasporto_gratuito_privati, percentuale_sconto_azienda, soglia_trasporto_gratuito_azienda, minimo_ordine', 'length', 'max' => 10),

            array('titolo, titleTag', 'length', 'max' => 65),

            array('descrizione, h1Tag', 'length', 'max' => 250),

            array('descriptionTag, keywordTag', 'length', 'max' => 160),

            array('inizio_offerta_privati, termine_offerta_privati, inizio_offerta_azienda, termine_offerta_azienda', 'default' , 'setOnEmpty'=>true),

            array('inizio_offerta_privati, termine_offerta_privati, inizio_offerta_azienda, termine_offerta_azienda', 'date', 'format' => 'dd/mm/yyyy', 'allowEmpty' => true),

            //array('immagine', 'file','types'=>'jpg, gif, png','allowEmpty'=>true, 'on'=>'update'),

            //array('video', 'file','types'=>'avi, mpeg, mpg, flv, mov, wmv', 'allowEmpty'=>true, 'on'=>'update'),						

            array('titolo, descrizione', 'unique'),

            array('cat', 'safe'),

            array('dataInserimento, dataScadenza, ultimoRinnovo, scadenzaB2B, ultimoRinnovoB2B, inizio_offerta_privati, termine_offerta_privati, inizio_offerta_azienda, termine_offerta_azienda', 'safe'),

            //array('prezzo_privati', 'validatePrezzoPrivati'),


            array('id, venditore, dataInserimento, dataScadenza, ultimoRinnovo, attivo, stato, vendi_a, scadenzaB2B, ultimoRinnovoB2B, video, immagine, quantita, codice_magazzino, articolo_permanente, peso, altezza, lunghezza, larghezza, offerta_privati, offerta_azienda, titolo, descrizione, titleTag, descriptionTag, h1Tag, keywordTag, lingua_default, accetta_condizioni, prezzo_privati, prezzo_azienda, percentuale_sconto_privati, soglia_trasporto_gratuito_privati, inizio_offerta_privati, termine_offerta_privati, percentuale_sconto_azienda, soglia_trasporto_gratuito_azienda, inizio_offerta_azienda, termine_offerta_azienda, minimo_ordine', 'safe', 'on' => 'search'),

            

            array('vendi_a', 'application.extensions.YiiConditionalValidator',

                'validation' => array('compare', 'compareValue' => "privati"),

                'dependentValidations' => array(

                    'prezzo_privati' => array(

                        array('required'),

                    ),

                ),

            ),

         

            array('vendi_a', 'application.extensions.YiiConditionalValidator',

                'validation' => array('compare', 'compareValue' => "aziende_privati"),

                'dependentValidations' => array(

                    'prezzo_privati' => array(

                        array('required'),

                    ),

                ),

            ),

            

            

            array('offerta_privati', 'application.extensions.YiiConditionalValidator',

                'validation' => array('compare', 'compareValue' => '', 'operator' => "!="),

                'dependentValidations' => array(

                    'inizio_offerta_privati, termine_offerta_privati' => array(

                        array('required'),

                        array('date',"format"=>'dd/mm/yyyy'),

                    ),

                ),

            ),

            array('offerta_azienda', 'application.extensions.YiiConditionalValidator',

                'validation' => array('compare', 'compareValue' => '', 'operator' => "!="),

                'dependentValidations' => array(

                    'inizio_offerta_azienda, termine_offerta_azienda' => array(

                        array('required'),

                        array('date',"format"=>'dd/mm/yyyy'),

                    ),

                ),

            ),

            array('offerta_privati', 'application.extensions.YiiConditionalValidator',

                'validation' => array('compare', 'compareValue' => 'sconto', 'operator' => "=="),

                'dependentValidations' => array(

                    'percentuale_sconto_privati' => array(

                        array('required'),

                    ),

                ),

            ),

            array('offerta_privati', 'application.extensions.YiiConditionalValidator',

                'validation' => array('compare', 'compareValue' => 'trasporto_gratuito_soglia', 'operator' => "=="),

                'dependentValidations' => array(

                    'soglia_trasporto_gratuito_privati' => array(

                        array('required'),

                    ),

                ),

            ),

            array('offerta_azienda', 'application.extensions.YiiConditionalValidator',

                'validation' => array('compare', 'compareValue' => 'trasporto_gratuito_soglia', 'operator' => "=="),

                'dependentValidations' => array(

                    'soglia_trasporto_gratuito_azienda' => array(

                        array('required'),

                    ),

                ),

            ),

            array('offerta_azienda', 'application.extensions.YiiConditionalValidator',

                'validation' => array('compare', 'compareValue' => 'sconto', 'operator' => "=="),

                'dependentValidations' => array(

                    'percentuale_sconto_azienda' => array(

                        array('required'),

                    ),

                ),

            ),

            array('termine_offerta_privati', 'dateCompare', 'compareAttribute' => 'inizio_offerta_privati', 'operator' => '>=', 'allowEmpty' => true,),

            array('termine_offerta_azienda', 'dateCompare', 'compareAttribute' => 'inizio_offerta_azienda', 'operator' => '>=', 'allowEmpty' => true,),                 

        );

    }



Nella view, il form viene inizializzato in questa maniera (il form permette l’upload di più file):


 

$form = $this->beginWidget('CActiveForm', array(

        'id' => 'prodotto-form',

        'enableAjaxValidation' => true,

        'enableClientValidation' => true,

      

        'clientOptions'=>array(

                'validateOnSubmit'=>true,

                'validateOnChange'=>true,

                'validateOnType'=>true,

        ),

        'htmlOptions' => array('enctype' => 'multipart/form-data'),

            ));



e il campo ‘accetta_condizioni’ viene inizilizzato cosi:




<div class="row">

    <?php echo $form->labelEx($prodottoModel, 'accetta_condizioni'); ?>

    <?php echo $form->checkBox($prodottoModel, 'accetta_condizioni'); ?>

    <?php echo $form->error($prodottoModel, 'accetta_condizioni'); ?>

</div>



nel controller:




$prodottoModel = new Prodotto;        

if (isset($_POST['Prodotto'])) {





            $prodottoModel->attributes = $_POST['Prodotto'];

            $prodottoModel->dataInserimento = new CDbExpression('NOW()');

            $prodottoModel->venditore = Yii::app()->user->id;

            $prodottoModel->attivo = 0;

            $prodottoModel->stato = 'da_validare';

            $prodottoModel->lingua_default = Yii::app()->getLanguage();

}



ho riportato solo i frammenti di codice riguardanti il campo in questione.

Ma il codice è quasi identico negli altri form. Ripeto il problema, quello che voglio ottenere è la seguente cosa, voglio che quando il checkbox non è flaggato sotto deve apparire l’errore e che scompaia non appena lo clicco.

E che inoltre se premo sul pulsante invia, il submit del form non venga effettuato se il checkbox non è flaggato.

In altri form con codice quasi identico funziona, qui no.

Inoltre il codice postato è sufficiente o serve quello completo?

Grazie

Non dovrebbe cambiare nulla, ma prova a toglierlo dall’elenco dei campi ‘safe’.

l’unica riga dove il campo ‘accetta_condizioni’ appare come safe è safe on=>search

che appunto serve per la ricerca, intendi li?

Comunque ho provato e non va

Boh, a questo punto ti direi di togliere tutti i validatori che hai messo, e di aggiungerne uno alla volta per capire qual’è il pezzo che non si comporta bene. Un lavoraccio. =(