PHP: Yii: игнорировать валидаторы форм в ActiveForm, если не выполнено предварительное условие - PullRequest
1 голос
/ 15 февраля 2012

Я хочу отключить определенные валидаторы, если другое поле в форме не отмечено. Пример:

$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 Ответ

1 голос
/ 25 июля 2013

Я нашел этот вопрос, и у меня возникла та же проблема, поэтому я решил опубликовать свое решение.

Мне нужно было отключить проверку clientSide для определенных полей, когда флажок был отмечен / снят с помощью Yii.

Обратите внимание, что мое решение использует виджет $ form CActiveForm.

Итак, формаcode:

<?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');
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...