2015-01-26 20 views
5

Sto lavorando su un modulo di contatto multiplo in Yii 1.1.16. Dove l'utente può aggiungere più numeri di telefono.yii convalida un array di input dei numeri di telefono

Il problema è, come potrei convalidarlo usando Yii rules()?

<div class="form-group"> 
       <?php 
       echo $form->labelEx($model,'contacts', array('class'=>'col-md-3 control-label')); 
       ?> 
        <div class="col-md-9"> 
        <div class="multiple-contact multiple-form-group input-group padding-bottom-10px" data-max="5"> 
          <div class="input-group-btn input-group-select"> 
           <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown"> 
            <span class="concept">Phone</span> <i class="fa fa-caret-down"></i> 
           </button> 
           <ul class="dropdown-menu" role="menu"> 
            <li><a href="#phone">Phone</a></li> 
            <li><a href="#fax">Fax</a></li> 
            <li><a href="#mobile">Mobile</a></li> 
           </ul> 
           <?php echo $form->textField($model,'contacts',array('type'=>'text', 'class'=>'input-group-select-val', 'name'=>'contacts[type][]','value'=>'phone')); ?> 
          </div> 

          <?php echo $form->textField($model,'contacts',array('size'=>60,'maxlength'=>255, 'name'=>'contacts[value][]','class'=>'form-control')); ?> 
          <?php echo $form->error($model,'contacts'); ?> 
          <span class="input-group-btn"> 
           <button type="button" class="btn btn-success btn-add"><i class="fa fa-plus"></i></button> 
          </span> 
        </div> 
       </div> 
      </div> 

Ho provato ad utilizzare questo, ma non funziona

public function rules() 
{ 
     return array(
    array('contacts[value][]', 'required'), 
    array('contacts[value][]', 'integerOnly'=>true), 
    array('contacts[value][]','type','type'=>'array','allowEmpty'=>false) 
    ); 
} 

Ecco un esempio Fiddle su come funziona laterali jQuery. Voglio che sia in grado di convalidare con 'enableAjaxValidation'=>true,. Inoltre, quando vengono aggiunti più campi, viene duplicato id dell'input. e nessun post Ajax è fatto onblur/onfocus

+0

Come li stai salvando nel tuo database? Sono record separati in un altro tavolo? –

+0

li salverà in una tabella diversa. non so come convalidarli in Yii. – user2636556

+0

@ user3535256 deve essere int e richiesto – user2636556

risposta

0

Si dovrebbe fare un modello separato con la propria convalida. Quindi nel controller è necessario convalidare separatamente i modelli principali e i relativi modelli.

Ecco una buona guida per una tale impostazione: http://www.yiiframework.com/wiki/384/creating-and-updating-model-and-its-related-models-in-one-form-inc-image/

+0

ma come convalidare un array di input in 'public function rules()' di CActiveRecord? – user2636556

+0

non è più necessario, si cammina attraverso l'array e si convalidano i singoli membri. –

+0

consentirà in tal modo la validazione lato client? – user2636556

4

Usa convalida personalizzata.

Dichiarare un validatore personalizzato nelle regole e definire la convalida richiesta nel metodo del validatore.

public function rules() 
{ 
    return array(
     array('contacts', validateContacts), 
    ); 
} 

public function validateContacts($attribute,$params) 
{ 
    if (length($this->contacts) == 0) { 
     $this->addError($attribute, 'You must add at least one contact!'); 
    } 
    foreach($this->contacts as $contact) { 
     // ... 
    } 

} 

Nel controller, assegnare l'array di contatti al campo Modello e chiamare il metodo di convalida del modello. Se ci sono errori verrà visualizzato tramite la linea

<?php echo $form->error($model,'contacts'); ?> 

nella vista.

Il controller contiene il codice per richiamare la convalida.

$contactModel = new Contact; 
// assign the array of contacts to the model 
$contactModel->contacts = $POST['myForm]['contacts'] 
$contactsModel->validate(); 

$this->render('myform', contactModel); 

Se si desidera che la convalida per avvenire attraverso l'Ajax, è necessario specificare in modo che quando la creazione del modulo:

$form=$this->beginWidget('CActiveForm', array(
    'id'=>'top-websites-cr-form', 
    'enableAjaxValidation'=>true, 
    'clientOptions' => array(
     'validateOnSubmit'=>true, 
     'validateOnChange'=>true), 
)); 

In questo caso il controller può verificare la presenza di forme Ajax.

if(isset($_POST['ajax']) && $_POST['ajax']==='branch-form') 
{ 
    echo CActiveForm::validate($model); 
    Yii::app()->end(); 
} 

riferimenti: http://www.yiiframework.com/wiki/168/create-your-own-validation-rule/

+0

sì, ma come farlo funzionare anche sul lato client? – user2636556

+0

Ho aggiornato la mia risposta. Non eri chiaro che volevi i dettagli sul lato client. – crafter

+0

mi dispiace per quello. dov'è il js per validare la parte client così? – user2636556

0

Consideriamo si dispone di un modello chiamato ContactNo e sembra come

class ContactNo extends CFormModel 
    { 
     public $contact; 

     public function rules() 
     { 
      return array(
// your rules 
       array('contact', 'required'), 
       array('contact','length','min'=>2) 
      ); 
     } 

     /** 
     * Declares attribute labels. 
     */ 
     public function attributeLabels() 
     { 
      return array(
       'contact'=>'Contact No', 
      ); 
     } 
    } 

Il controller come SiteController e l'azione nome come actionIndex

Poi il controller dovrebbe essere simile a questo

public function actionIndex() 
     { 
// set how many contact fields you want here 
       $contactCount = 3; 

       $models = array(); 

       if(isset($_POST['ContactNo'])) 
       { 
        $successModels = 0; 
        foreach($_POST['ContactNo'] as $key=>$value) 
        { 
         $model = new ContactNo; 
         $model->attributes = $value; 

         if($model->validate()) // this validates your model 
          $successModels++; // it tells how many contact No.s have been validated 

         $models[$key]=$model; 
        } 

// if all the contact nos are validated, then perform your task here 
        if($successModels === $contactCount) 
        { 
         // save your models 
         echo 'models saved'; 
         Yii::app()->end(); 
        } 
       } 
       else 
       { 
        for($index = 0;$index < $contactCount; $index++) 
        $models[] = new ContactNo; 
       } 

       $params = array(); 

       $params['contactCount']=$contactCount; 
       $params['models']= $models; 

       $this->render('index',$params); 
     } 

Ora lascia andare a vedere. Ovviamente la vista è l'indice .php e sarà qualcosa di simile a

// Include all the initial part required for activeforms 

    <?php echo $form->errorSummary($models); ?> 

      <?php foreach ($models as $index=>$model): ?> 
     <div class="row"> 
      <?php echo $form->labelEx($model,"[{$index}]contact"); ?> 
      <?php echo $form->textField($model,"[{$index}]contact",array('size'=>60,'maxlength'=>128)); ?> 
      <?php echo $form->error($model,"[{$index}]contact"); ?> 
     </div> 
      <?php endforeach; ?> 

// Include the submit button 

Spero che questo ti aiuta o potrebbe dare un'idea atleast per raggiungere il tuo obiettivo.

0

A mio parere per la migliore convalida per quanto riguarda Numeri di telefono è necessario utilizzare libphonenumber libreria PHP e non v'è un'estensione per esso per quanto riguarda quadro Yii qui http://www.yiiframework.com/extension/libphonenumber/

uso di base:

Yii::setPathOfAlias('libphonenumber',Yii::getPathOfAlias('application.vendors.libphonenumber')); 
$phonenumber=new libphonenumber\LibPhone($your_phone_number); 
$phonenumber->validate(); 

per maggiori dettagli per quanto riguarda l'uso e funzionalità della libreria php libphonenumber che puoi trovare qui: https://github.com/davideme/libphonenumber-for-PHP

Problemi correlati