将验证错误添加到不属于模型的动态字段

时间:2016-02-23 10:58:55

标签: php yii

我目前正在使用允许用户创建新表单字段的代码,然后根据需要或不需要将其设置为。我遇到的问题是,由于这是一个组件,而不是在模型中,如果db中的验证等于1,我就无法将其添加到规则中。

如何动态地为规则添加值?或者至少在这些字段中添加错误。 IE浏览器。将验证器添加到具有必填字段1

值的所有attr
class DynamicForm extends CWidget {


    public $attributes = array();
    public $id = null;
    public $enctype = null;
    public $target = null;
    public $action = null;
    public $model_name = '';
    public $method = 'post';

    public function init() {
        parent::init();
    }

 public function run() {
 foreach ($this->attributes as $attr) {
  $attr['formname'] = $this->model_name . '_' . $attr['name'];
            $attr['htmlOptions'] = array('class' => 'span5', 'placeholder' => $attr['name']);
            $attr['htmlOptions']['class'] .= ' form-control';

            if ($attr['required'] === 1){
                $attr['requiredfields'] = array('required' => true);
            }else{
                $attr['requiredfields'] = '';
            }
  if ($attr['type'] == 'text') {
                echo '<div class="form-group">';
                echo CHtml::label($attr['name'], $attr['formname'],$attr['requiredfields']);
                echo CHtml::textField($attr['formname'], $attr['value'], $attr['htmlOptions']);
                echo '</div>';
            } 
            elseif ($attr['type'] == 'radio') {
                echo '<div class="form-group">';
                echo CHtml::label($attr['name'], $attr['formname'],$attr['requiredfields']);
                echo CHtml::radioButton($attr['formname'],$attr['requiredfields']);
                echo '</div>';
            } 
            elseif ($attr['type'] == 'textarea') {
                echo '<div class="form-group">';
                echo CHtml::label($attr['name'], $attr['formname'],$attr['requiredfields']);
                echo CHtml::textArea($attr['formname'], $attr['value'], $attr['htmlOptions']);
                echo '</div>';
            } 
            elseif ($attr['type'] == 'select') {
                $items = explode(',', $attr['options']);
 echo CHtml::label($attr['name'], $attr['formname'],$attr['requiredfields']);
                //echo CHtml::dropDownList($attr['formname'], $attr['value'], array($items));
                echo CHtml::dropDownList($attr['formname'], $attr['value'], $items, array('class'=>'form-control','prompt'=>'Please Choose'));
                echo '</div>';
 } 
            elseif ($attr['type'] == 'boolean') {
                echo '<div class="form-group">';
                echo CHtml::label($attr['name'], $attr['formname'],$attr['requiredfields']);
                echo CHtml::radioButtonList($attr['formname'], $attr['value'], array('No' => 0, 'Yes' => 1));
                echo '</div>';
            }
        }
 }

}

编辑 这个问题似乎出现在我的用户模型和这个函数中

public function getDynamicFormConfig() {
        // For each attribute in
        $varibles = array();

        //echo sizeof($this->type->userTypeVariables);

        if (sizeof($this->type->userTypeVariables) > 0) {

            foreach ($this->type->userTypeVariables as $var) {

                //$varibles[] = $var;
                $varibles[] = array(
                    'id' => $var->id,
                    'name' => $var->name,
                    'type' => $var->type,
                    'value' => $this->getDynamicVaribleValue($var->name),
                    'required' => $var->required,
                    'options' => $var->htmlOptions,
                );
               if ($var->required) {
                   $var->validatorList->add(
                           CValidator::createValidator('required',$this->getDynamicVaribleValue($var->name),'')
                   );
               }
            }
        }
        return $varibles;
    }

特别是这些行

 if ($var->required) {
      $var->validatorList->add(
           CValidator::createValidator('required',$this->getDynamicVaribleValue($var->name),'')
                    );
}

我的表格

<div class="clearfix"></div>
<?php
$varform = new DynamicForm();
$varform->attributes = $user->getDynamicFormConfig();
$varform->model_name = 'user';
echo $varform->run();
?>

<div class="clearfix"></div>
<div class="form-actions marginTopHalf marginBotHalf">
    <?php
    $this->widget('booster.widgets.TbButton', array(
        'buttonType' => 'submit',
        'context' => 'primary',
        'label' => $user->isNewRecord ? 'Sign Up for this event' : 'Save',
    ));
    ?>
</div>

1 个答案:

答案 0 :(得分:1)

检查此链接,希望它能帮到你......

http://www.jquerybyexample.net/2012/01/jquery-validation-using-class-required.html

我也复制代码并粘贴到下面,如果链接不起作用,那么人们可以从这里阅读并获得帮助..

------从上面链接复制------------------------------------- ---------------

好吧,5天前我收到了我的一位读者的邮件,他写了这封邮件&#34;我需要使用Jquery通过循环Class属性来验证html页面[&#34; Class = Required&# 34;]如果label属性包含&#34; required&#34;然后我应该验证用户的警报&#34;请输入您的值&#34;并将焦点设置为空控制以输入值。请建议如何在Jquery编码&#34;。

中执行此操作

注意:我没有写博客阅读器的名称,因为我不确定他是否想要他的名字。

他有一个HTML表单,其中包含名称,公司,职位,电话和电子邮件等输入。点击“提交”,他想验证具有&#34; class = required&#34;的输入。所以我为他的问题创建了一个演示页面并向他发送解决方案。

下面是jQuery代码,它解决了他的问题。单击“提交”按钮,它将遍历所有具有&#34; .required&#34;的输入类型。类。并检查该值,如果它为空,则显示警报并将焦点设置到文本框。

01
    $(document).ready(function(){
02
        $('#btnSubmit').click(function(){
03
            $("input.required").each(function(){
04
                if($(this).val().length == 0)
05
                {
06
                   alert('Please Enter your value');
07
                   $(this).focus();
08
                   return false;
09
                }
10
            });
11
            //else submit your form.
12
        });
13
    });

查看现场演示和代码 然后第二天我收到了他发来的另一封电子邮件说&#34;我需要通过JQuery Validation实现,&lt; Label&gt; tag有&#34; class.required&#34;属性不是&lt; Input&gt;标签,那些标签有&#34; class.required&#34;属性只有那些需要在使用过程中验证的单击comman按钮,这个JQuery脚本应该在整个网站上全局使用。&#34;

所以他的问题是标签标签是&#34;必需&#34;而不是输入标签。我提供给他的解决方案,假设输入标签具有所需的类,因为他没有提到标签标签具有&#34; .required&#34;他第一封电子邮件中的课程在他的下一封电子邮件中,他还向我发送了HTML代码。首先来看看HTML代码。 (我没有把整个代码。)

1
    <div class="formField">
2
       <label for="txtFullName" class="required">Name</label>
3
       <input id="txtFullName"  type="text" name="Full_Name" />  
4
    </div>

他正在使用课程&#34; .reuqired&#34;带有标签以及属性的HTML。 for属性指定标签绑定到哪个表单元素。所以它让我思考了2分钟,但我找到了解决方案。这一次,我正在遍历所有标签,其中包含了#34; .required&#34;类。并获得属性的值。由于for属性值与textbox id相同。所以基于for属性值,我使用jQuery选择器创建了对象。休息等于以前的解决方案。

01
    $(document).ready(function(){
02
        $('#btnSubmit').click(function(){
03
            var bSubmit = true;
04
            $("label.required").each(function(){
05
                var txtAttrb = $(this).attr('for');
06
                if(txtAttrb.length > 0)
07
                {
08
                    var txtVal = $("input[id=" + txtAttrb + "]");
09
                    if(txtVal.val().length == 0)
10
                    {
11
                       alert('Please Enter your value');
12
                       txtVal.focus();
13
                       bSubmit = false;
14
                       return false;
15
                    }
16
                }
17
            });
18

19
            if(bSubmit == true)
20
            {
21
                //submit the form.
22
            }
23
        });
24
    });

查看现场演示和代码 希望这对你也有帮助