2015-01-26 16 views
5

Ich arbeite an einem Formular für mehrere Kontakte in Yii 1.1.16. Wo der Benutzer mehrere Telefonnummern hinzufügen kann.yii validiere ein Eingabe-Array von Telefonnummern

Problem ist, wie würde ich dies mit Yii rules() validieren?

<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> 

Ich habe versucht, dies mit, aber nicht

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

Hier ist ein Beispiel ist Fiddle, wie die jQuery Seite funktioniert funktioniert. Ich möchte es mit 'enableAjaxValidation'=>true, validieren können. Wenn mehrere Felder hinzugefügt werden, wird außerdem der id des Eingangs dupliziert. und keine Ajax Post ist fertig onblur/onfocus

+0

Wie speichern Sie sie in Ihrer Datenbank? Sind sie in einer anderen Tabelle getrennt? –

+0

speichert sie in einer anderen Tabelle. nur nicht sicher, wie man sie in Yii validiert. – user2636556

+0

@ user3535256 es muss ein int sein, und erforderlich – user2636556

Antwort

0

Sie sollten es ein separates Modell mit seiner eigenen Validierung machen. Dann müssen Sie in Ihrem Controller die Hauptmodelle und die zugehörigen Modelle separat validieren.

Hier ist eine gute Anleitung für eine solche Einrichtung: http://www.yiiframework.com/wiki/384/creating-and-updating-model-and-its-related-models-in-one-form-inc-image/

+0

, aber wie validiert man ein Eingabearray in meinem CActiveRecord 'public function rules()'? – user2636556

+0

Sie nicht mehr müssen, durchlaufen Sie das Array und validieren Sie die einzelnen Mitglieder. –

+0

wird auf diese Weise auch die clientseitige Validierung möglich sein? – user2636556

4

Verwenden Sie benutzerdefinierte Validierung.

Erklären Sie einen benutzerdefinierten Validierer in Ihren Regeln und definieren Sie die Validierung, die Sie in der Validator-Methode benötigen.

Ordnen Sie in Ihrem Controller das Feld Kontakte dem Feld Modell zu und rufen Sie die Validierungsmethode des Modells auf. Wenn Fehler vorhanden sind, wird dies durch die Zeile

in der Ansicht angezeigt.

Der Controller enthält den Code zum Aufrufen der Validierung.

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

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

Wenn Sie die Validierung passieren durch Ajax möchten, müssen Sie dies angeben, wenn Ihr Formular zu erstellen:

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

In diesem Fall wird Ihr Controller für Ajax-Formulare überprüfen können.

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

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

+0

ja, aber wie man es auch auf Client-Seite zu arbeiten? – user2636556

+0

Ich habe meine Antwort aktualisiert. Sie waren nicht klar, dass Sie die Details auf der Clientseite wollten. – crafter

+0

Entschuldigung dafür. wo ist die js für validieren clientseitig tho? – user2636556

0

Sie sich von uns ein Modell ContactNo und es sieht aus wie

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', 
      ); 
     } 
    } 

Der Controller als SiteController und den Namen der Aktion als actionIndex genannt Lassen Sie berücksichtigen müssen

Dann sollten Sie Ihre Controller in etwa so aussehen

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); 
     } 

lässt gehen jetzt sehen. Offensichtlich ist die Ansicht Index.php und es wird so etwas wie

// 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 

hoffe das hilft dir sein oder könnte Ihnen eine Idee geben atleast Ihr Ziel zu erreichen.

0

Meiner Meinung nach bester Validierung in Bezug auf Telefonnummern Sie libphonenumber PHP-Bibliothek verwenden sollen, und es ist eine Erweiterung für sie in Bezug auf yii Rahmen hier http://www.yiiframework.com/extension/libphonenumber/

Grund Nutzung:

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

, um weitere Informationen in Bezug auf Nutzung und Fähigkeiten von libphonenumber php Bibliothek finden Sie hier: https://github.com/davideme/libphonenumber-for-PHP