2015-01-26 3 views
5

Я работаю над несколькими контактными формами в Yii 1.1.16. Если пользователь может добавить несколько телефонных номеров.yii проверить входной массив телефонных номеров

Проблема в том, как я могу проверить это с помощью Yii's 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> 

я попытался использовать это, но не работает

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

Вот пример Fiddle от того, как боковые работы Jquery. Я хочу, чтобы он смог проверить с помощью 'enableAjaxValidation'=>true,. Кроме того, когда добавляется больше полей, он дублирует входной сигнал id. и никакой пост ajax не сделан onblur/onfocus

+0

Как вы их сохраняете в своей базе данных? Являются ли они отдельными записями в другом столе? –

+0

сохранит их в другой таблице. просто не уверен, как проверить их в Yii. – user2636556

+0

@ user3535256 он должен быть int, и требуется – user2636556

ответ

0

Вы должны сделать его отдельной моделью с собственной проверкой. Затем в вашем контроллере вы должны отдельно проверить основные модели и связанные модели.

Вот хороший гид для такой установки: http://www.yiiframework.com/wiki/384/creating-and-updating-model-and-its-related-models-in-one-form-inc-image/

+0

, но как вы можете проверить входной массив в 'public function rules()' CActiveRecord'? – user2636556

+0

вам больше не нужно, вы проходите через массив и проверяете его отдельные члены. –

+0

будет ли это позволять проверку на стороне клиента тоже? – user2636556

4

Использование пользовательских проверки.

Объявите пользовательский валидатор в своих правилах и определите требуемую проверку в методе валидатора.

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) { 
     // ... 
    } 

} 

В контроллере назначьте массив контактов полю модели и вызовите метод проверки модели. Если возникнут какие-либо ошибки, он отобразится по линии

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

на вид.

Контроллер содержит код для вызова проверки.

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

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

Если вы хотите проверку случиться через Ajax, вам необходимо указать поэтому при создании формы:

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

В этом случае контроллер может проверить для Ajax форм.

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

ссылки: http://www.yiiframework.com/wiki/168/create-your-own-validation-rule/

+0

, да, но как заставить его работать на стороне клиента? – user2636556

+0

Я обновил свой ответ. Вы не совсем поняли, что хотите получить информацию на стороне клиента. – crafter

+0

извините за это. где js для подтверждения клиента? – user2636556

0

Рассмотрим вас есть модель под названием ContactNo, и это выглядит как

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

Контроллер, как SiteController и имя действия, как actionIndex

Тогда ваш контроллер должен выглядеть как этот

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

Теперь давайте Go для просмотра. Очевидно, что вид индекс.PHP и это будет что-то вроде

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

Надеюсь, что это помогает вам или может дать вам идею по крайней мере, чтобы достичь своей цели.

0

На мой взгляд, для лучшей проверки в отношении номера телефонов вы должны использовать libphonenumber библиотеки PHP и есть расширение для него в отношении фреймворка здесь http://www.yiiframework.com/extension/libphonenumber/

Основное использование:

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

для получения более подробной информации относительно использования и возможности библиотеки libphonenumber php вы можете найти здесь: https://github.com/davideme/libphonenumber-for-PHP

Смежные вопросы