PHP:Yii:如果未满足前提条件,则忽略ActiveForm中的表单验证器

时间:2012-02-15 15:00:36

标签: php javascript validation yii

如果未检查表单中的其他字段,我想禁用某些验证器。例如:

$fe = new FormElement(FormElement::FIELD_checkBox, 'alternative_billing_address', $this);
$fe->setLabel(Yii::t('checkout','Pick a different billing address'));
$this->addElement($fe);

$fe = new FormElement(FormElement::FIELD_textField, 'billing_first_name', $this);
$fe->setLabel(Yii::t('checkout','First name'))->addValidator('required');
$this->addElement($fe);

在这种情况下,如果未检查第一个元素(复选框),我想禁用第二个表单元素的验证器。

不幸的是,这不能与Javascript-Yii-ActiveForm功能一起使用,这会阻止提交表单,因为它表示必须填写文本字段。

有没有可能在不禁用客户端验证的情况下解决这个问题?谢谢!

1 个答案:

答案 0 :(得分:1)

我发现了这个问题并且我遇到了同样的问题,所以我想我会发布我的解决方案。

当使用Yii选中/取消选中复选框时,我需要在特定字段上禁用clientSide验证。

注意我的解决方案使用$ form CActiveForm小部件。

所以表单代码:

<?php 
$form=$this->beginWidget('CActiveForm', array(
'id'=>'my-form',
'enableAjaxValidation'=>false,
)); 
?>

<input type="checkbox" name="YourCheckbox" id="Your-Checkbox" value="1" />

<?php
echo $form->labelEx($yourModel,'FirstName'); 
echo $form->textField($yourModel,'FirstName');
echo $form->error($yourModel,'FirstName'); 

echo $form->labelEx($yourModel,'LastName'); 
echo $form->textField($yourModel,'LastName');
echo $form->error($yourModel,'LastName'); 
?>

现在我们显示javascript函数,这些函数将禁用您指定的每个字段的验证:

function enableFieldsValidation(form, model, fieldName) {

    // Restore validation for model attributes
    $.each(form.data('settings').attributes, function (i, attribute) {

        if (attribute.model == model && attribute.id == (model + '_' + fieldName))
        {
            if (attribute.hasOwnProperty('disabledClientValidation')) {

                // Restore validation function
                attribute.clientValidation = attribute.disabledClientValidation;
                delete attribute.disabledClientValidation;

                // Restore sucess css class
                attribute.successCssClass = attribute.disabledSuccessCssClass;
                delete attribute.disabledSuccessCssClass;
            }
        }
    });
}

function disableFieldsValidation(form, model, fieldName) {

    $.each(form.data('settings').attributes, function (i, attribute) {

        if (attribute.model == model && attribute.id == (model + '_' + fieldName))
        {
            if (!attribute.hasOwnProperty('disabledClientValidation')) {

                // Remove validation function
                attribute.disabledClientValidation = attribute.clientValidation;
                delete attribute.clientValidation;

                // Reset style of elements
                $.fn.yiiactiveform.getInputContainer(attribute, form).removeClass(
                    attribute.validatingCssClass + ' ' +
                    attribute.errorCssClass + ' ' +
                    attribute.successCssClass
                );

                // Reset validation status
                attribute.status = 2;

                // Hide error messages
                form.find('#' + attribute.errorID).toggle(false);

                // Dont make it 'green' when validation is called
                attribute.disabledSuccessCssClass = attribute.successCssClass;
                attribute.successCssClass = '';
            }
        }
    });
}

在JS文件中使用这些函数后,您可以使用jQuery检查是否已选中该复选框。如果已经检查过它将启用验证,如果没有,它将禁用它。

$('#YourCheckbox').click(function() {

    if ($(this).is(':checked'))
    {
        enableFieldsValidation($('#my-form'), 'YourModel', 'FirstName');
        //enableFieldsValidation($('#my-form'), 'YourModel', 'LastName');
    }
    else
    {
        disableFieldsValidation($('#my-form'), 'YourModel', 'FirstName');
        //disableFieldsValidation($('#my-form'), 'YourModel', 'LastName');
    }
});