yii 验证电话号码的输入数组

Posted

技术标签:

【中文标题】yii 验证电话号码的输入数组【英文标题】:yii validate an input array of phone numbers 【发布时间】:2015-03-24 17:23:15 【问题描述】:

我正在 Yii 1.1.16 中处理多个联系人表单。用户可以在其中添加多个电话号码。

问题是,我将如何使用 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>

我试过用这个,但不起作用

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'=&gt;true, 进行验证。此外,当添加更多字段时,它会复制输入的id。并且没有完成任何ajax帖子onblur/onfocus

【问题讨论】:

如何将它们保存在数据库中?它们是在另一个表中单独记录吗? 会将它们保存在不同的表中。只是不确定如何在 Yii 中验证它们。 @user3535256 它必须是一个int,并且是必需的 【参考方案1】:

使用自定义验证。

在您的规则中声明一个自定义验证器,并在验证器方法中定义您需要的验证。

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/

【讨论】:

是的,但是如何让它在客户端工作呢? 我更新了我的答案。您不清楚是否需要客户端的详细信息。 对此感到抱歉。验证客户端的 js 在哪里?【参考方案2】:

您应该通过自己的验证使其成为一个单独的模型。 然后在您的控制器中,您必须分别验证主要模型和相关模型。

以下是此类设置的良好指南: http://www.yiiframework.com/wiki/384/creating-and-updating-model-and-its-related-models-in-one-form-inc-image/

【讨论】:

但是如何验证我的 CActiveRecord 的 public function rules() 中的输入数组? 您不再需要,您可以遍历数组并验证它的各个成员。 这种方式是否也允许客户端验证? 我不确定,我猜如果你使用 activeTextfield 会这样【参考方案3】:

我认为对于电话号码的最佳验证,您应该使用 libphonenumber php 库,这里有一个关于 yii 框架的扩展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

【讨论】:

【参考方案4】:

假设您有一个名为 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);
        

现在让我们去查看。显然视图是index.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

希望这对您有所帮助,或者至少可以为您提供一个实现目标的想法。

【讨论】:

以上是关于yii 验证电话号码的输入数组的主要内容,如果未能解决你的问题,请参考以下文章

利用c语言数组验证?

AngularJS - 三输入字段电话号码验证

仅在输入掩码 jquery 中从某个号码开始验证电话号码

Vue.js BootstrapVue:Veevalidate 不显示电话号码输入的验证错误消息

当用户点击第 11 个号码时,如何验证输入文本(在 html 中)是不是是有效的电话号码?

Yii框架:规则是设置唯一的,在修改用户资料时该怎么保证除了自己的存在于数据库之外的数据的唯一性。