2015-03-10 27 views
9

Mi chiedo se qualche esperto di Yii2 possa aiutarmi a capire come meglio lavorare con i moduli ajax combinati con la convalida Yii ajax. Penso di poter spiegare il problema senza portarti attraverso tutto il mio codice.Yii2: convalida del modulo Ajax su un modulo inviato Ajax

Sto lavorando su un modulo di inserimento del codice promozionale in cui l'utente inserisce il suo codice promozionale nel modulo, il modulo viene inviato tramite ajax. Eseguiamo quindi una ricerca nel database per i dettagli del codice promozionale, convalidiamo il codice e se il codice viene convalidato, vogliamo visualizzare il modulo di registrazione nascosto nella pagina.

Ho una funzione di convalida personalizzata per il campo modulo "codice", che è il campo attivo in uno scenario modello denominato "registro".

class UserCode extends ActiveRecord 
{ 
    ... 

    public function scenarios() 
    { 
     return [ 
      'register' => ['code'], 
     ]; 
    } 

    public function rules() 
    { 
     return [ 
      [['code'], 'required'], 
      [['code'], 'validateUserCode', 'on' => ['register']], 
     ]; 
    } 

    public function validateUserCode($attribute, $params) 
    { 
     // perform all my custom logic to determine if the code is valid 

     if ($code_invalid) { 
      $this->addError($attribute, 'Sorry, this code is invalid.'); 
     } 
    } 

    ... 
} 

Poi nel controller, come la Guida Yii2 suggerisce, ho trappola questa convalida Ajax con il seguente codice:

public function actionValidate() { 

    $model = new UserCode(['scenario' => 'register']); 

    if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) { 
     Yii::$app->response->format = Response::FORMAT_JSON; 
     return ActiveForm::validate($model); 
    } 

    // no logic can be run after the above code b/c the form is submit with ajax 
    // and therefore always trapped in the Yii::$app->request->isAjax conditional 

} 

Il codice soprattutto funziona bene e se tolgo attivo dal campo $form->field($model, 'code') sul mio modulo, la validazione ajax di Yii si attiva e visualizza il mio messaggio di errore personalizzato in base alla logica di convalida personalizzata.

La mia sfida sorge quando vado a inviare il modulo. L'invio del modulo viene gestito anche tramite ajax e pertanto l'azione del controller restituisce sempre il risultato dello ActiveForm::validate($model); poiché if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) si applicherà sia alla convalida del modulo ajax che al modulo di invio.

Con l'approccio sopra riportato, sono costretto a restituire solo i risultati della convalida ajax e non tutti i dati JSON che potrei aver bisogno per la convalida del lato client, come la visualizzazione del modulo di registrazione dopo che un codice di utilizzo valido è stato inviato tramite la forma ajax.

Mi rendo conto che è possibile impostare 'enableAjaxValidation' => false su ActiveForm e quindi restituire i miei dati JSON all'interno della condizione if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())). Se faccio questo, sono in grado di mostrare il modulo di registrazione perché ho i miei dati json con cui lavorare.

C'è un modo per convalidare ajax su un modulo inviato con ajax? Come potresti intrappolare la convalida Ajax separatamente dalla sottomissione del modulo Ajax per gestire i due eventi in modi diversi?

Qualsiasi suggerimento o approccio alternativo è GRANDE apprezzato!

+0

fa [questo] (https://github.com/yiisoft/yii2/issues/5991) aiuto? – Tahir

risposta

16

È necessario impostare validationUrl con un URL diverso rispetto all'URL a cui si invia il modulo. In questo modo è possibile avere la funzione di convalida che convalida e restituisce lo return ActiveForm::validate($model); e il modulo di invio normale che fa qualcos'altro.

Si può leggere di più su validationUrlhere:

+0

Fantastico! Questo e 'esattamente quello che stavo cercando! Grazie mille! – user3033990

+0

Wow, è stato così facile. Grazie ancora! – user3033990

+2

Non l'ho mai usato prima ma ne avevo bisogno anche oggi :) felice di aver dato questa risposta in quanto avrei potuto provare molte altre cose senza ricordare su validationUrl. –

Problemi correlati