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

Php 向不属于模型的动态字段添加验证错误,php,yii,Php,Yii,我目前使用的代码允许用户创建新的表单字段,然后将它们设置为必需或非必需。我遇到的问题是,由于这是一个组件,而不是在模型中,如果数据库中的validation等于1,我就无法将其添加到规则中 如何向规则动态添加值?或者至少在这些字段中添加错误。即,向所有属性添加一个值为必填字段1的验证器 class DynamicForm extends CWidget { public $attributes = array(); public $id = null; public

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

如何向规则动态添加值?或者至少在这些字段中添加错误。即,向所有属性添加一个值为必填字段1的验证器

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

}
特别是这些线路

 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>

查看此链接,希望它能帮助您

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

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

5天前,我收到一位读者的邮件,他在邮件中写道,“我需要通过类属性[“Class=Required”]循环使用Jquery验证html页面,如果标签属性包含“Required”类,那么我应该验证警告用户“请输入您的值”并将焦点设置回null控件以输入值。请在Jquery编码中建议如何做到这一点”

注意:我没有写博客读者的名字,因为我不确定他是否想要他的名字在这里

他有一个HTML表单,上面有姓名、公司、职位、电话和电子邮件等输入。点击提交,他想验证输入内容,其中包含“class=required”。因此,我为他的问题创建了一个演示页面,并将解决方案发送给他

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
    });
下面是jQuery代码,它解决了他的问题。单击Submit按钮,它将遍历所有具有“.required”类的输入类型。并检查值,如果为空,则显示警报并将焦点设置到文本框

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
    });
请参阅实时演示和代码 第二天,我收到了他的另一封电子邮件,他说“我需要通过JQuery验证来实现,标签有“class.required”属性而不是标签,那些标签标签有“class.required”属性,只有那些在使用过程中需要验证的,点击comman按钮,这个JQuery脚本应该在整个网站上全局使用。"

所以他的问题是标签标签的类是“required”,而不是输入标签。我向他提供的解决方案假设输入标签具有必需的类,因为他在第一封电子邮件中没有提到标签标签具有“.required”类。在他的下一封电子邮件中,他还向我发送了HTML代码。首先看一下HTML代码。(我还没有把全部代码都写出来。)

请参阅实时演示和代码
希望这对您也有帮助

您可以使用jquery验证来执行操作,您的意思是什么?我能/会在模型中声明吗?问题是用户设置这些字段并声明它们是否为必需的,所以我不知道它们的值是什么,或者有多少个字段。cvalidator和添加验证器应该只是将字段值添加到框架javascript验证中。您可以在需要时显示动态表单创建的输入的输出(html)吗?jquery验证插件呢?客户端验证使用任何其他jquery验证插件而不是yii验证…查看两个链接。。。如果你还需要帮助,请告诉我
1
    <div class="formField">
2
       <label for="txtFullName" class="required">Name</label>
3
       <input id="txtFullName"  type="text" name="Full_Name" />  
4
    </div>
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
    });