- General Information
- Syntax
- Examples
- Validation using related data
- Installation
- Requirements, Help and Reference
- Changelog and ToDo
General Information ¶
Note: This extension is no more being maintained. Be free to fork it on github.
YiiConditionalValidator (YCV) validates some attributes depending on certains conditions (rules). You can use any core validator as you usually would do or any other class based or inline validator. An interesting feature is that you can use dot.notation
in your rules to achieve data in related models and you can even use the own YiiConditionalValidator inside itself to perform more complex conditions;
Basically, YCV executes the rules set in the param if
and if there are no errors executes the rules set in the param then
.
Syntax ¶
array('safeAttribsList', 'path.to.YiiConditionalValidator',
'if' => array(
//rule1: array('attrX, attrY', 'required', ...)
//ruleN: ...
)
'then' => array(
//rule1: array('attrZ, attrG', 'required', ...)
//ruleN: ...
)
)
safeAttribsList
: The name of the attributes that should be turned safe (since Yii has no way to make dinamic validators to turn attributes safe);path.to.YiiConditionalValidator
: In the most of cases will beext.YiiConditionalValidator
;if
: (bidimensional array) The conditional rules to be validated. Only if they are all valid (i.e., have no errors) then the rules inthen
will be validated;then
: (bidimensional array) The rules that will be validated only if there are no errors in rules ofif
param;
Note: Errors in the rules set in the param
if
are discarded after checking. Only errors in the rules set in paramthen
are really kept.
Examples ¶
If
customer_type is "active" then
birthdate and city are required
:
public function rules()
{
return array(
array('customer_type', 'ext.YiiConditionalValidator',
'if' => array(
array('customer_type', 'compare', 'compareValue'=>"active"),
),
'then' => array(
array('birthdate, city', 'required'),
),
),
);
}
If
customer_type is "inactive" then
birthdate and city are required
and city must be "sao_paulo", "sumare" or "jacarezinho":
public function rules()
{
return array(
array('customer_type', 'ext.YiiConditionalValidator',
'if' => array(
array('customer_type', 'compare', 'compareValue'=>"active"),
),
'then' => array(
array('birthdate, city', 'required'),
array('city', 'in', 'range' => array("sao_paulo", "sumare", "jacarezinho")),
),
),
);
}
If
information starts with 'http://' and has at least 24 chars length then
the own information must be a valid url:
public function rules()
{
return array(
array('information', 'ext.YiiConditionalValidator',
'if' => array(
array('information', 'match', 'pattern'=>'/^http:\/\//'),
array('information', 'length', 'min'=>24, 'allowEmpty'=>false),
),
'then' => array(
array('information', 'url'),
),
),
);
}
Validation using related data ¶
Note: This feature may not fit into situations too much complex.
You can use dot.notation
in attribute name to fetch data from a related model in your rules.
Example:
Assuming that Customer has a relation 'profile', you could check (in customer rules) if
the profile.username
is not empty before validate something:
//Customer Model
public function rules()
{
return array(
array('information', 'ext.YiiConditionalValidator',
'if' => array(
//would only return true if profile.username is not empty
array('profile.username', 'required'),
),
'then' => array(
array('someAttrib', 'someValidation', ...),
),
),
);
}
Installation ¶
- Put YiiConditionalValidator.php in your application.extensions folder;
Requirements, Help and Reference ¶
- Tested in Yii 1.1.10. Should work in others 1.1.* versions;
- Forum
- Fast Validators Reference
Changelog and ToDo ¶
[Version 1.0.0]
- Usage made yet more easier, simplyfied and objective;
- New
if
/then
operators replacevalidations
/dependentValidations
making the use more natural; - Code completely refactored and (almost) commented;
- Allows to use multiple attributes and/or validator combinations in the same set of YCV rule;
[Version 0.2.0]
- Usage made easier, more simplyfied and more objective;
- New 'dot.notation' usage on attributes name (will be improoved on next versions);
- Some bug fixes;
[ToDo]
- Please, check and help here;
Very Good Work
Very good work, and thank you to developer for precious support!!
error while validating multi-model form
Thanks sidtj for the great extension...It seems exactly what am looking for. I can however not seem to have it work when using it in a form capturing related data.
Here are my rules
array('user_id', 'numerical', 'integerOnly'=>true), array('event_id, campaign_id', 'length', 'max'=>7), array('q1, q2, q3, q4, q5, q6, q7, q8, q9, q10', 'length', 'max'=>100), array('q1', 'ext.YiiConditionalValidator', 'if' => array( array('event.code_id', 'compare', 'compareValue'=>"303"), ), 'then' => array( array('q1', 'required'), ), ),...
and here are the relations
public function relations() { // NOTE: you may need to adjust the relation name and the related // class name for the relations automatically generated below. return array( 'user' => array(self::BELONGS_TO, 'Users', 'user_id'), 'event' => array(self::BELONGS_TO, 'EventsAll', 'event_id'), ); }
When I try to save I get the following error though...
AdhocVoc has not a relation named "event". Check the YiiConditionalValidator rule that is using the attribute name "event.code_id".
Where am i going wrong?
use Scenario of rule maybe better
I thinks can be used Scenario of rule (+ , +) easily, instead use this extension and If/Then.
order of rules
If I add the rule as the first one everything is ok
If I add the rule as the last one then applied only this, bypassing over the others, except if this sufficer and then the orher rules applied properly
Am I missing something ?
clientside validation does not work with this extensiton
clientside validation does not work for attributes validated using this extension..
Not Maintained Anymore
Hi Folks,
This extension is not being maintained anymore but you can fork it on github and make anything you want.
Sorry but I have no time for this task.
Hope you enjoy this extension as it is now.
Sidney Lins
If you have any questions, please ask in the forum instead.
Signup or Login in order to comment.