rules() для CheckBox

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
launchpro
Сообщения: 212
Зарегистрирован: 2011.08.10, 17:54

rules() для CheckBox

Сообщение launchpro »

Здравствуйте,

Как сделать обязательным к заполнению поле CheckBox с помощью правил в моделе rules() ?

Т.е. нужно сделать обязательным простановку галочки в CheckBox.
launchpro
Сообщения: 212
Зарегистрирован: 2011.08.10, 17:54

Re: rules() для CheckBox

Сообщение launchpro »

Спасибо, но не могли бы еще немного помочь.
Куда здесь условие ставить:

array('show_license_agreement', 'required', 'on'=>'LicenseAgreement')

?

P.S.: В идеале, нужно чтобы пользователю выводилось сообщение Галочка должна быть нажата
masson
Сообщения: 545
Зарегистрирован: 2012.07.03, 15:59

Re: rules() для CheckBox

Сообщение masson »

Условие тут уже поставлено, сообщение должно выводиться
Если нужно свое сообщение, то

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

array('show_license_agreement', 'required', 'on'=>'LicenseAgreement', 'message'=>'bla-bla-bla') 
launchpro
Сообщения: 212
Зарегистрирован: 2011.08.10, 17:54

Re: rules() для CheckBox

Сообщение launchpro »

Если оставить только array('show_license_agreement', 'required', 'on'=>'LicenseAgreement'),

то даже если пользователь галочку не нажал, то все равно данные проходят проверку, а мне нужно чтобы галочку пользователь нажал.
masson
Сообщения: 545
Зарегистрирован: 2012.07.03, 15:59

Re: rules() для CheckBox

Сообщение masson »

значит у вас не работает условие 'on'=>'LicenseAgreement'. Если вам точно нужен сценарий - задавайте его $model->scenario = 'LicenseAgreement' перед валидацией. Если не нужен - удаляйте условие on

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

array('show_license_agreement', 'required') 
launchpro
Сообщения: 212
Зарегистрирован: 2011.08.10, 17:54

Re: rules() для CheckBox

Сообщение launchpro »

Так тоже пробовал: array('show_license_agreement', 'required')

Не помогло.

Думаете косяк в коде?
masson
Сообщения: 545
Зарегистрирован: 2012.07.03, 15:59

Re: rules() для CheckBox

Сообщение masson »

показывайте весь код rules
launchpro
Сообщения: 212
Зарегистрирован: 2011.08.10, 17:54

Re: rules() для CheckBox

Сообщение launchpro »

Ок. Но там много всего:

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

public function rules()
    {
        // NOTE: you should only define rules for those attributes that
        // will receive user inputs.
        return array(
            array('last_name', 'required', 'on'=>'LastName'), // Обязательные к заполнению поле Фамилия
            array('name', 'required', 'on'=>'Name'), // Обязательные к заполнению поле Имя
            array('middle_name', 'required', 'on'=>'MiddleName'), // Обязательные к заполнению поле Отчество
            array('email', 'required', 'on'=>'Email'), // Обязательные к заполнению поле Email
            array('phone_number', 'required', 'on'=>'PhoneNumber'), // Обязательные к заполнению поле Номер телефона
            array('id_country', 'required', 'on'=>'Country'), //Обязательные к заполнению поле Страна
            array('zip_code', 'required', 'on'=>'Index'), //Обязательные к заполнению поле Индекс
            array('area', 'required', 'on'=>'Area'), //Обязательные к заполнению поле Область
            array('city', 'required', 'on'=>'City'), //Обязательные к заполнению поле Город
            array('delivery_address', 'required', 'on'=>'Addr'), //Обязательные к заполнению поле Адрес
            array('id_country, zip_code, area, city, delivery_address', 'required', 'on'=>'Address'), // Обязательные к заполнению поле Адрес доставки
            array('phone_number', 'required', 'on' => 'Phone'),
                
            array('show_license_agreement', 'required', 'on'=>'LicenseAgreement'), // Обязательные к заполнению поле Лицензионное соглашение
            
            array('id_country, id_payment_system, id_contact, id_organization, id_account_status, account_number, deleted, id_partner, 
                    close_account, not_to_write', 'numerical', 'integerOnly'=>true),
            array('last_name, name, middle_name, email, zip_code, area, city, delivery_address', 'length', 'max'=>255),
            array('ip_client', 'length', 'max'=>45),
            // Проверяет существует ли e-mail
            array('email', 'email_not_exists'),
            // Отвечает за сохранение не обрабатываемых атрибутов
            array('date_of_order, date_of_payment, more_options, phone_number, close_date, account_comment, 
                    id_advertising_channel_page', 'safe'),
            array('account_sum', 'length', 'max'=>13),
            //    phone_number должен соответствовать шаблону
            array('phone_number', 'length', 'min'=>10, 'max'=>12, 'on'=>'PhoneNumber'),
            array('phone_number', 'match', 'pattern'=>'/^[0-9][\w]+$/', 'on'=>'PhoneNumber'),
            // Проверка корректности email адреса
            array('email', 'email'),
            // The following rule is used by search().
            // Please remove those attributes that should not be searched.
            array('account_sum_start, account_sum_end, date_of_payment_start, date_of_payment_end,
                    creation_date_start, creation_date_end, deleted', 'safe'),
            // Должно передаваться через атрибуты
            array('id_account, account_number, account_sum, account_sum, account_comment, id_payment_system
                    id_account_status, id_country, date_of_order, date_of_payment, delivery_address, last_name, name,
                    middle_name, phone_number, prevIdAccountStatus', 'safe'),
            array('id_account, account_number, last_name, name, middle_name, email, phone_number, zip_code, area, city,
                    delivery_address, date_of_order, date_of_payment, ip_client, more_options, id_country, id_payment_system,
                    id_contact, id_organization, id_account_status, deleted, account_sum, id_partner, id_goods_kind, 
                    id_advertising_channel_page, not_to_write, goods', 'safe', 'on'=>'search'),
        );
    }
masson
Сообщения: 545
Зарегистрирован: 2012.07.03, 15:59

Re: rules() для CheckBox

Сообщение masson »

У вас действительно есть необходимость в таком количестве сценариев? Почти для каждого поля свой сценарий .... по-моему вы не ведаете что творите :)
По сабжу - вроде все нормально, надо проверить действительно ли имя атрибута 'show_license_agreement' и совпадает ли это имя с тем, что приходит из ХТМЛ формы.

Если все ОК - попробуйте еще

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

array('show_license_agreement', 'compare', 'compareValue'=>1);
launchpro
Сообщения: 212
Зарегистрирован: 2011.08.10, 17:54

Re: rules() для CheckBox

Сообщение launchpro »

К сожалению или к счастью условий действительно должно быть так много. У меня в скрипте динамически генерится какие поля должны быть обязательными, а какие нет.

Ваше условие: array('show_license_agreement', 'compare', 'compareValue'=>1);

Помогло!

Но сообщение какое-то левое: Лицензионное соглашение должен быть повторен в точности.

Хотелось бы увидеть: Вам необходимо принять условия лицензионного соглашения

Это можно как-то сделать?
masson
Сообщения: 545
Зарегистрирован: 2012.07.03, 15:59

Re: rules() для CheckBox

Сообщение masson »

Уже было ;)

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

array('show_license_agreement', 'compare', 'compareValue'=>1, 'message'=>'bla-bla-bla')
Bloom
Сообщения: 313
Зарегистрирован: 2013.02.25, 12:57

Re: rules() для CheckBox

Сообщение Bloom »

http://www.yiiframework.com/doc/api/1.1 ... Box-detail
Читай внимательно!!!
A special option named 'uncheckValue' is available that can be used to specify the value returned when the checkbox is not checked. By default, this value is '0'. Internally, a hidden field is rendered so that when the checkbox is not checked, we can still obtain the posted uncheck value. If 'uncheckValue' is set as NULL, the hidden field will not be rendered.
Глянь у себя в коде, который получается на странице - там будет hidden field value=0
Вот оно у тебя по умолчанию и отправляется, если чекбокс не нажат, соответственно у тебя и правило "required" срабатывает нормально, т.е. значение кагбэ есть)), но вот то, что оно равно нулю - твои проблемы))
'uncheckValue' => null - твоё лекарство.
Bloom
Сообщения: 313
Зарегистрирован: 2013.02.25, 12:57

Re: rules() для CheckBox

Сообщение Bloom »

Это тебе на будущее! Но сейчас уже добей то, что есть.
launchpro
Сообщения: 212
Зарегистрирован: 2011.08.10, 17:54

Re: rules() для CheckBox

Сообщение launchpro »

Огромное спасибо masson, за подсказки и участие в решение проблемы. Ваш вариант рабочий.

И отдельное спасибо Bloom, за подсказку.

Решение для потомков:
В rules() добавил условие:

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

array('show_license_agreement', 'required', 'on'=>'LicenseAgreement', 'message'=>Yii::t('Ordering', 'Show License Agreement')),
Где:
'on'=>'LicenseAgreement' - для отработки правила с определенным сценарием
'message'=>Yii::t('Ordering', 'Show License Agreement') - для подмены сообщения с ошибкой на свое

В настройки вывода CheckBox:

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

echo $form->CheckBox($model,'show_license_agreement', array('uncheckValue' => null));
Где:
array('uncheckValue' => null) - Если флажок не нажат, то будет передан null и сработает выше указанное правило.
masson
Сообщения: 545
Зарегистрирован: 2012.07.03, 15:59

Re: rules() для CheckBox

Сообщение masson »

Bloom писал(а):Глянь у себя в коде, который получается на странице - там будет hidden field value=0
Вот оно у тебя по умолчанию и отправляется, если чекбокс не нажат, соответственно у тебя и правило "required" срабатывает нормально, т.е. значение кагбэ есть)), но вот то, что оно равно нулю - твои проблемы))
Надо же, а я почему-то думал что 0 и "0" и NULL приравниваются к пустому значению, ибо - http://php.ru/manual/function.empty.html
Bloom
Сообщения: 313
Зарегистрирован: 2013.02.25, 12:57

Re: rules() для CheckBox

Сообщение Bloom »

А кто тебе сказал, что там проверяется через empty()? Ведь если чекбокс по факту должен вернуть 0 - тогда это был бы баг в фреймворке.
Мне лень лазить в код, но проверка простым empty() явно не лучший вариант для такого валидатора. required должен срабатывать на вообще не переданное значение, т.е. null (как мне кажется).
masson
Сообщения: 545
Зарегистрирован: 2012.07.03, 15:59

Re: rules() для CheckBox

Сообщение masson »

Я тоже в код не смотрел, но в доке сказано - CRequiredValidator validates that the specified attribute does not have null or empty value.
А "empty value" в пхп ... :roll: Было бы логичнее написать "empty string", или перечислить хотя бы.
Bloom писал(а):Ведь если чекбокс по факту должен вернуть 0 - тогда это был бы баг в фреймворке.
Для этого есть compare :)

Впрочем, если оно работает так как работает - то тут уже все понятно 8-)
Bloom
Сообщения: 313
Зарегистрирован: 2013.02.25, 12:57

Re: rules() для CheckBox

Сообщение Bloom »

masson писал(а):
Bloom писал(а):Ведь если чекбокс по факту должен вернуть 0 - тогда это был бы баг в фреймворке.
Для этого есть compare :)
Ну частный случай. У тебя выпадающий список с неопределенным количеством вариантов значений, из которых самое первое идет с (с пометкой -выберите значение-)value='', а второе с пометкой -выбираю все- value=0, который так-же нужно учитывать. Ты, естественно, не сможешь описать правило через compare, тебе понадобится только required. И тут незадача, value=0 не конает)) т.к. empty() вернуло нам false)
masson
Сообщения: 545
Зарегистрирован: 2012.07.03, 15:59

Re: rules() для CheckBox

Сообщение masson »

CNumberValidator
CRegularExpressionValidator
Ответить