Reputation: 1980
I have model with rules
public function rules() {
return array(
array('user_id, name, start_date, timezones, start_hours, return_date, return_hours, location_start, location_end, trip_activity, trip_mean, status', 'required'),
array('user_id, return_hours, sign_off, saved, advise, time_notification, status', 'numerical', 'integerOnly'=>true),
array('name, going_with, start_hours, location_start, location_end, location_return, trip_activity, trip_mean', 'length', 'max'=>255),
array('created, modified, advise, notify_best_friend, notify_now, notify_returning, send_notification, sign_off', 'safe'),
array('going_with, location_return, time_notification, created, modified', 'default', 'setOnEmpty' => true, 'value' => null),
array('id, user_id, name, going_with, start_date, start_hours, return_date, return_hours, location_start, location_end, location_return, trip_activity, trip_mean, saved, advise, time_notification, status, created, modified', 'safe', 'on'=>'search'),
array(
'return_date',
'compare',
'compareAttribute'=>'start_date',
'operator'=>'>=',
'allowEmpty'=>false ,
'message'=>'{attribute} must be greater than "{compareValue}".'
),
array(
'return_hours',
'compare',
'compareAttribute'=>'start_hours',
'operator'=>'>',
'allowEmpty'=>false ,
'message'=>'{attribute} must be greater than "{compareValue}".'
),
);
}
I want to compare date and time...
In case: 'return_date' >= 'start_date'... it's ok.
In case 'return_date' == 'start_date', so 'return_hours > 'start_hours' but with rules above I can't compare them.
What's solution? thanks!
Upvotes: 1
Views: 5238
Reputation: 4114
You can achieve this using a custom validator.
public function comparedates($attribute,$params)
{
$message=Yii::t('yii','{attribute} must be greater than "{compareValue}".');
if(CDateTimeParser::parse($this->return_date, "yyyy-MM-dd") < CDateTimeParser::parse($this->start_date, "yyyy-MM-dd"))
{
$params=array('{attribute}'=>$this->getAttributeLabel('return_date'),'{compareValue}'=>$this->getAttributeLabel('start_date'));
$this->addError($attribute,strtr($message,$params));
}
else if(CDateTimeParser::parse($this->return_date, "yyyy-MM-dd") === CDateTimeParser::parse($this->start_date, "yyyy-MM-dd"))
{
if(CDateTimeParser::parse($this->return_hours, "hh") < CDateTimeParser::parse($this->start_hours, "hh")//change hh according to the format of return_hours and start_hours
{
$params=array('{attribute}'=>$this->getAttributeLabel('return_hours'),'{compareValue}'=>$this->getAttributeLabel('start_hours'));
$this->addError('return_hours',strtr($message,$params));
}
}
}
And in your rules
public function rules() {
return array(
//your previous rules
array('return_date','comparedates'),
);
}
Remember change the the pattern
parameter of CDateTimeParser::parse()
from hh
according to the format of your return_hours
and start_hours
Upvotes: 4