CActiveForm: clientValidation. Помогите разобраться

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Аватара пользователя
cbone
Сообщения: 41
Зарегистрирован: 2013.09.23, 15:14
Откуда: Челябинск
Контактная информация:

CActiveForm: clientValidation. Помогите разобраться

Сообщение cbone »

Ребят, разъясните пожалуйста. Хочу валидировать формочку на стороне клиента (причем при валидации только добавлять класс .error корявому инпуту, не выводя сообщения об ошибках, поэтому $form->errorSummary и т.п. не добавляю в вид). Судя по документации понял, что необходимо передать TRUE параметру enableClientValidation примерно так:

Код: Выделить всё

$checkOrderForm = $this->beginWidget('CActiveForm', array(
                    'id' => 'check-order-form',
                    'stateful' => true,
                    'enableClientValidation' => TRUE,
                )); 
Но ничего не работает и JS-код валидации на странице нигде не появляется. Как вообще он должен появляться и в каком именно месте?
Последний раз редактировалось cbone 2014.02.25, 13:35, всего редактировалось 1 раз.
Faster
Сообщения: 139
Зарегистрирован: 2013.09.19, 14:23

Re: CActiveForm: не работает clientValidation

Сообщение Faster »

там может быть много чего. например в лейауте не подключается JS от yii
Аватара пользователя
cbone
Сообщения: 41
Зарегистрирован: 2013.09.23, 15:14
Откуда: Челябинск
Контактная информация:

Re: CActiveForm: не работает clientValidation

Сообщение cbone »

Faster писал(а):там может быть много чего. например в лейауте не подключается JS от yii
Видимо в этом и причина. А как это подключается? ClientScript? Я думал скрипт подключается после создания формы. Можно пример или ткнуть меня носом на документацию? Искал не смог найти.
Аватара пользователя
cbone
Сообщения: 41
Зарегистрирован: 2013.09.23, 15:14
Откуда: Челябинск
Контактная информация:

Re: CActiveForm: не работает clientValidation

Сообщение cbone »

Подскажите кто-нибудь, какие именно скрипты нужно подключить и что вызвать в виде, чтобы появился js-код валидации на клиенте в макете сайта? Чувствую что всё просто, но туплю уже который день.
Аватара пользователя
cbone
Сообщения: 41
Зарегистрирован: 2013.09.23, 15:14
Откуда: Челябинск
Контактная информация:

Re: CActiveForm: не работает clientValidation

Сообщение cbone »

Никто не знает? Скажите, вообще при добавлении параметра 'enableClientValidation' => TRUE, на страницу должен добавляться какой-то код или нет?
esche
Сообщения: 1054
Зарегистрирован: 2010.11.24, 03:39

Re: CActiveForm: clientValidation. Помогите разобраться

Сообщение esche »

Но ничего не работает и JS-код валидации на странице нигде не появляется. Как вообще он должен появляться и в каком именно месте?
А в форме ещё что-нибудь есть? Где-нибудь ниже по коду (до endWidget) используется $checkOrderForm? Если да, то проверить - есть ли правила у модели, для которой должны "появляться" правила валидации.
...
Аватара пользователя
cbone
Сообщения: 41
Зарегистрирован: 2013.09.23, 15:14
Откуда: Челябинск
Контактная информация:

Re: CActiveForm: clientValidation. Помогите разобраться

Сообщение cbone »

esche писал(а):А в форме ещё что-нибудь есть? Где-нибудь ниже по коду (до endWidget) используется $checkOrderForm? Если да, то проверить - есть ли правила у модели, для которой должны "появляться" правила валидации.
Да, есть. Вот код формы:

Код: Выделить всё

<?php
$checkOrderForm = $this->beginWidget('CActiveForm', array(
    'id' => 'check-order-form',
    'stateful' => true,

    'enableClientValidation'=>true,
));
?>

<div class="input-group">
    <span class="input-group-addon">№</span>
    <?=
    $checkOrderForm->textField($checkOrderModel, 'id', array(
        'class' => 'form-control',
        'placeholder' => '43245',
    ))
    ?>
    <span class="input-group-btn">
        <?=
        CHtml::htmlButton('Проверить', array(
            'class' => 'btn btn-red text-bold',
            'name' => 'scenario',
            'value' => $checkOrderModel->getScenario(),
            'type' => 'submit',
        ));
        ?>
    </span>
</div>

<?php $this->endWidget(); ?>
В модели в методе rules() тоже есть правила валидации, так как на стороне сервера всё прекрасно валидируется (с перезагрузкой страницы):

Код: Выделить всё

public function rules() {
        return array(
            // типы полей
            array('id, order_start_time, order_finish_time, order_status_id, boiler_id, price_boiler, price_delivery', 'numerical', 'integerOnly' => true),
            array('name, email, address_delivery', 'length', 'max' => 255),
            array('name', 'length', 'min' => 2),
            array('phone', 'length', 'max' => 25),
            array('phone', 'length', 'min' => 5),
            array('email', 'email'),
            // сценарий оставления заявки
            array('name, phone, email, boiler_id', 'required', 'on' => 'add'),
            // сценарий подтверждения заявки (через админку)
            array('name, phone, email, address_delivery, order_status_id, boiler_id, price_boiler, price_delivery', 'required', 'on' => 'confirm'),
            // сценарий проверки статуса заявки
            array('id', 'required', 'on' => 'check'),
        );
    } 
для этой формы используем сценарий check
Аватара пользователя
cbone
Сообщения: 41
Зарегистрирован: 2013.09.23, 15:14
Откуда: Челябинск
Контактная информация:

Re: CActiveForm: clientValidation. Помогите разобраться

Сообщение cbone »

Решение нашлось, спасибо Хабру.
Нужно было просто добавить в форму

Код: Выделить всё

<?php echo $checkOrderForm->error($checkOrderModel,'id'); ?>
В форме обязательно должны быть вызовы CActiveForm::error() для всех полей, по которым нужна валидация, причем вне зависимости от того, нужно ли визуально отображать ошибки или нет.
Ответить