2013-04-23 13 views
5

Ho un modulo Yii che chiama un partial di rendering da un altro modello (team has_many team_members). Voglio chiamare tramite ajax una vista parziale per aggiungere membri in team/_form. Tutto funziona (chiama, mostra, salva) ad eccezione delle convalide ajax (lato server e client). Se invio il modulo, il modello del membro non convalida, anche dal lato client, non convalida i campi richiesti.Yii Convalida ClientSide su Render parziale non funzionante

Qualsiasi indizio?

// _ forma

<?php $form=$this->beginWidget('CActiveForm', array(
    'id'=>'team-form', 
     'enableAjaxValidation'=>true, 
     'enableClientValidation'=>true, 
     'clientOptions'=>array(
      'validateOnSubmit'=>true, 
      'validateOnChange'=>true 

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

// controller

public function actionMember($index) 
{ 
    $model = new TeamMember(); 
     $this->renderPartial('_member',array(
      'model'=> $model, 'index'=> $index 
     ) 
       ,false,true 
       ); 
} 

public function actionCreate() 
{ 
     $model=new Team; 
     $members = array(); 
     if(isset($_POST['Team'])) 
     { 
       $model->attributes=$_POST['Team']; 

       if(!empty($_POST['TeamMember'])){ 
       foreach($_POST['TeamMember'] as $team_member) 
          { 
           $mem = new TeamMember(); 
           $mem->setAttribute($team_member); 
           if($mem->validate(array('name'))) $members[]=$mem; 
          } 
       } 
         $this->redirect(array('team/create','id'=>$model->id,'#'=>'submit-message')); 

     } 

     $members[]=new TeamMember; 
     $this->performAjaxMemberValidation($members); 
     $this->render('create',array(
       'model'=>$model,'members'=>$members 
     )); 

} 

// _ membro

<div class="row-member<?php echo $index; ?>"> 
    <h3>Member <?php echo $index+1; ?></h3> 
    <div class="row"> 
    <?php echo CHtml::activeLabel($model, "[$index]name",array('class'=>'member')); ?> 
    <?php echo CHtml::activeTextField($model, "[$index]name",array('class'=>'member')); ?> 
    <?php echo CHtml::error($model, "[$index]name");?>  
    </div> 
</div> 

ProcessOutput è stato impostato su true. Niente da fare. Switch renderPartial() a render(). Niente da fare.

+0

MEM, coppettim: sei lo stesso ragazzo? In caso contrario, perché hai modificato questa domanda e aggiunto l'ultima riga, come hai potuto saperlo ?? – soju

+0

@soju: Non siamo lo stesso ragazzo. Ma entrambi stiamo lavorando su questo stesso problema. - E nessuno di noi è stato in grado di trovare la risposta ancora. – MEM

+0

Quali sono le tue regole()? – JorgeeFG

risposta

6

Se si guarda al CActiveForm::run:

$cs->registerCoreScript('yiiactiveform'); 
//... 
$cs->registerScript(__CLASS__.'#'.$id,"jQuery('#$id').yiiactiveform($options);"); 

Allora si capirà che la convalida non funzionerà, perché si esegue il rendering parziale e non l'intera pagina. E questi script appaiono in fondo alla pagina. Quindi dovresti risolvere questo eseguendo questi script.

Dopo aver parziale è reso, cercare di ottenere ActiveForm script che dovrebbe essere conservati presso l'scipts matrice:

$this->renderPartial('_member',array('model'=> $model, 'index'=> $index)); 
$script = Yii::app()->clientScript->scripts[CClientScript::POS_READY]['CActiveForm#team-form']; 

dopo, inviarlo con html reso alla pagina:

echo "<script type='text/javascript'>$script</script>" 

Anche ricordare prima di aggiungere il codice html ricevuto nella pagina, è necessario includere jquery.yiiactiveform.js, se non lo si è già fatto (eseguendo il rendering di un altro modulo, o registerCoreScript('yiiactiveform')), nella pagina di chiamata di una richiesta jax. In caso contrario verrà generato un errore javascript.

Spero che questo possa essere d'aiuto.

Modifica: Scusa, non ho capito che tu renda parte della forma e non il tutto. Ma la tua convalida non funzionerà esattamente con lo stesso problema. Perché lo script jQuery('#$id').yiiactiveform($options); non è stato creato per il campo.

+0

Spiacenti, non ho capito dove mettere "$ script = Yii :: app() -> script client-> [CClientScript :: POS_READY] ['CActiveForm # team-form'];" .. Ho chiamato il mio renderPartial nel controller, quindi $ script non sarà visibile in _member view. – coppettim

0

Beh, impostando processOutput al vero in renderPartial (al fine di rendere convalida del client funziona su campi aggiunti) non aiuterà in questo caso dal momento che funziona solo per CActiveForm forma e non si dispone di alcuna forma nel vostro _member visualizza (solo campi di input).

Un semplice modo per affrontare questo tipo di problema potrebbe essere quella di utilizzare solo convalida ajax, e utilizzare CActiveForm::validateTabular() nel vostro controller per convalidare i membri del team.

+0

L'ho fatto e _membro carichi con campi convalidati. Ma loro non cambiano il loro stato quando inserisco i dati all'interno degli input, continuando a dire "questo campo è obbligatorio" e così via .. – coppettim

+0

Hai impostato 'enableAjaxValidation' su true e' enableClientValidation' su false? – soju

+0

sì, ajax true e client false. Stesso problema ... – coppettim

1

Il problema reale è che ActiveForm salva i propri attributi per essere convalidato nell'attributo dei dati "impostazioni".Vedo che stai già utilizzando gli indici, quindi devi aggiungere i nuovi elementi a questo oggetto impostazioni affinché la convalida funzioni. Dopo la risposta Ajax questo è ciò che deve essere fatto:

//Get the settings object from the form 
var settings = $("#form").data('settings'); 
//Get all the newly inserted elements via jquery 
$("[name^='YourModel']", data).each(function(k, v) { 
    //base attribute skeleton 
    var base = { 
     model : 'YourModel', 
     enableAjaxValidation : true, 
     errorCssClass : 'error', 
     status : 1, 
     hideErrorMessage : false, 
    }; 

    var newRow = $.extend({ 
     id : $(v).attr('id'), 
     inputID : $(v).attr('id'), 
     errorID : $(v).attr('id') + '_em_', 
     name : $(v).attr('name'), 
    }, base); 
    //push it to the settings.attribute object 
    settings.attributes.push(newRow); 
}); 
//update the form 
$("#form").data('settings', settings); 

`` `

In questo modo l'ActiveForm sarà a conoscenza dei nuovi campi e li convaliderà.

+0

Bel lavoro! Questo aiuta a risolvere il problema. Prova tutto il giorno per risolvere questo problema. Con la tua soluzione la correzione è stata fatta in pochi minuti. Grazie per la condivisione – funktioneer

Problemi correlati