rules() для CheckBox
rules() для CheckBox
Здравствуйте,
Как сделать обязательным к заполнению поле CheckBox с помощью правил в моделе rules() ?
Т.е. нужно сделать обязательным простановку галочки в CheckBox.
Как сделать обязательным к заполнению поле CheckBox с помощью правил в моделе rules() ?
Т.е. нужно сделать обязательным простановку галочки в CheckBox.
Re: rules() для CheckBox
Спасибо, но не могли бы еще немного помочь.
Куда здесь условие ставить:
array('show_license_agreement', 'required', 'on'=>'LicenseAgreement')
?
P.S.: В идеале, нужно чтобы пользователю выводилось сообщение Галочка должна быть нажата
Куда здесь условие ставить:
array('show_license_agreement', 'required', 'on'=>'LicenseAgreement')
?
P.S.: В идеале, нужно чтобы пользователю выводилось сообщение Галочка должна быть нажата
Re: rules() для CheckBox
Условие тут уже поставлено, сообщение должно выводиться
Если нужно свое сообщение, то
Если нужно свое сообщение, то
Код: Выделить всё
array('show_license_agreement', 'required', 'on'=>'LicenseAgreement', 'message'=>'bla-bla-bla')
Re: rules() для CheckBox
Если оставить только array('show_license_agreement', 'required', 'on'=>'LicenseAgreement'),
то даже если пользователь галочку не нажал, то все равно данные проходят проверку, а мне нужно чтобы галочку пользователь нажал.
то даже если пользователь галочку не нажал, то все равно данные проходят проверку, а мне нужно чтобы галочку пользователь нажал.
Re: rules() для CheckBox
значит у вас не работает условие 'on'=>'LicenseAgreement'. Если вам точно нужен сценарий - задавайте его $model->scenario = 'LicenseAgreement' перед валидацией. Если не нужен - удаляйте условие on
Код: Выделить всё
array('show_license_agreement', 'required')
Re: rules() для CheckBox
Так тоже пробовал: array('show_license_agreement', 'required')
Не помогло.
Думаете косяк в коде?
Не помогло.
Думаете косяк в коде?
Re: rules() для CheckBox
показывайте весь код rules
Re: rules() для CheckBox
Ок. Но там много всего:
Код: Выделить всё
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'),
);
}
Re: rules() для CheckBox
У вас действительно есть необходимость в таком количестве сценариев? Почти для каждого поля свой сценарий .... по-моему вы не ведаете что творите
По сабжу - вроде все нормально, надо проверить действительно ли имя атрибута 'show_license_agreement' и совпадает ли это имя с тем, что приходит из ХТМЛ формы.
Если все ОК - попробуйте еще
По сабжу - вроде все нормально, надо проверить действительно ли имя атрибута 'show_license_agreement' и совпадает ли это имя с тем, что приходит из ХТМЛ формы.
Если все ОК - попробуйте еще
Код: Выделить всё
array('show_license_agreement', 'compare', 'compareValue'=>1);
Re: rules() для CheckBox
К сожалению или к счастью условий действительно должно быть так много. У меня в скрипте динамически генерится какие поля должны быть обязательными, а какие нет.
Ваше условие: array('show_license_agreement', 'compare', 'compareValue'=>1);
Помогло!
Но сообщение какое-то левое: Лицензионное соглашение должен быть повторен в точности.
Хотелось бы увидеть: Вам необходимо принять условия лицензионного соглашения
Это можно как-то сделать?
Ваше условие: array('show_license_agreement', 'compare', 'compareValue'=>1);
Помогло!
Но сообщение какое-то левое: Лицензионное соглашение должен быть повторен в точности.
Хотелось бы увидеть: Вам необходимо принять условия лицензионного соглашения
Это можно как-то сделать?
Re: rules() для CheckBox
Уже было
Код: Выделить всё
array('show_license_agreement', 'compare', 'compareValue'=>1, 'message'=>'bla-bla-bla')
Re: rules() для CheckBox
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 - твоё лекарство.
Читай внимательно!!!
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 - твоё лекарство.
Re: rules() для CheckBox
Это тебе на будущее! Но сейчас уже добей то, что есть.
Re: rules() для CheckBox
Огромное спасибо masson, за подсказки и участие в решение проблемы. Ваш вариант рабочий.
И отдельное спасибо Bloom, за подсказку.
Решение для потомков:
В rules() добавил условие:
Где:
'on'=>'LicenseAgreement' - для отработки правила с определенным сценарием
'message'=>Yii::t('Ordering', 'Show License Agreement') - для подмены сообщения с ошибкой на свое
В настройки вывода CheckBox:
Где:
array('uncheckValue' => null) - Если флажок не нажат, то будет передан null и сработает выше указанное правило.
И отдельное спасибо 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 и сработает выше указанное правило.
Re: rules() для CheckBox
Надо же, а я почему-то думал что 0 и "0" и NULL приравниваются к пустому значению, ибо - http://php.ru/manual/function.empty.htmlBloom писал(а):Глянь у себя в коде, который получается на странице - там будет hidden field value=0
Вот оно у тебя по умолчанию и отправляется, если чекбокс не нажат, соответственно у тебя и правило "required" срабатывает нормально, т.е. значение кагбэ есть)), но вот то, что оно равно нулю - твои проблемы))
Re: rules() для CheckBox
А кто тебе сказал, что там проверяется через empty()? Ведь если чекбокс по факту должен вернуть 0 - тогда это был бы баг в фреймворке.
Мне лень лазить в код, но проверка простым empty() явно не лучший вариант для такого валидатора. required должен срабатывать на вообще не переданное значение, т.е. null (как мне кажется).
Мне лень лазить в код, но проверка простым empty() явно не лучший вариант для такого валидатора. required должен срабатывать на вообще не переданное значение, т.е. null (как мне кажется).
Re: rules() для CheckBox
Я тоже в код не смотрел, но в доке сказано - CRequiredValidator validates that the specified attribute does not have null or empty value.
А "empty value" в пхп ... Было бы логичнее написать "empty string", или перечислить хотя бы.
Впрочем, если оно работает так как работает - то тут уже все понятно
А "empty value" в пхп ... Было бы логичнее написать "empty string", или перечислить хотя бы.
Для этого есть compareBloom писал(а):Ведь если чекбокс по факту должен вернуть 0 - тогда это был бы баг в фреймворке.
Впрочем, если оно работает так как работает - то тут уже все понятно
Re: rules() для CheckBox
Ну частный случай. У тебя выпадающий список с неопределенным количеством вариантов значений, из которых самое первое идет с (с пометкой -выберите значение-)value='', а второе с пометкой -выбираю все- value=0, который так-же нужно учитывать. Ты, естественно, не сможешь описать правило через compare, тебе понадобится только required. И тут незадача, value=0 не конает)) т.к. empty() вернуло нам false)masson писал(а):Для этого есть compareBloom писал(а):Ведь если чекбокс по факту должен вернуть 0 - тогда это был бы баг в фреймворке.
Re: rules() для CheckBox
CNumberValidator
CRegularExpressionValidator
CRegularExpressionValidator