Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

yii validate an input array of phone numbers

I'm working on a multiple contact form in Yii 1.1.16. Where the user can add multiple phone numbers.

Problem is, how would i validate this using 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>

i tried using this, but doesn't work

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

Here is a sample Fiddle on how the jQuery side works. I want it to be able to validate with 'enableAjaxValidation'=>true,. Also, when more fields are added, it duplicates the id of the input. and no ajax post is done onblur/onfocus

like image 676
user2636556 Avatar asked Sep 28 '22 22:09

user2636556


1 Answers

Use custom validation.

Declare a custom validator in your rules, and define the validation you require in the validator method.

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

}

In your controller, assign the contacts array to the Model field and call the model's validation method. If there are any errors it will display through the line

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

in the view.

The controller contains the code to invoke the validation.

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

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

If you want the validation to happen through Ajax, you need to specify so when creating your form:

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

In this case your controller can check for ajax forms.

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

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

like image 112
crafter Avatar answered Oct 03 '22 01:10

crafter