我疯狂地尝试在一个相当简单的问题的网络上尝试不同的解决方案
我的字面我的应用程序存储了数百个日期,而我客户的源数据有一个不同格式的日期的坏习惯。
例如,我的一个模型有遵循的规则(完成所有列出的特定模型)
public function rules() {
return array(
array('function, junior, ces,agreement_expected,start_date', 'required'),
array('start_budget', 'numerical'),
array('visa_received,training_days', 'numerical', 'integerOnly' => true),
array('function, junior, ces,currency', 'length', 'max' => 10),
array('agreement_received, status, stop_date_original, stop_date_extended', 'safe'),
array('agreement_received, visa_received, stop_date_original, stop_date_extended', 'default', 'setOnEmpty' => true, 'value' => null),
array('agreement_received,agreement_expected,start_date,stop_date_original,stop_date_extended', 'date', 'format' => 'Y-m-d', 'allowEmpty' => true),
array('id, Sname,PFces, PFdomain,PDkeyword, PFstatus, PRname,PRcountry,PRscore,PRcomment,PRngo,TRname,TRpic, TFfunction, TFx, TRdateofbirth,TRedufields,TRcoach,TRlocation,TRtask,TRcontract,TRproject,TRcontact,TFdateofbirth,TFedufields,TFcoach,TFlocation,TFtask,TFcontract,TFproject,TFcontact,
date1,date2,idate, ddomains,dkeywords,country,agreement, function,ngo, status,group, junior, junior_lastname, junior_firstname,search_all,search_interrupt, ces, agreement_expected, agreement_received, visa_received, start_date, stop_date_original, stop_date_extended,currency, start_budget, training_days', 'safe', 'on' => 'search'),
);
}
我希望实现的目标由以下规则描述
array('agreement_received, visa_received, stop_date_original, stop_date_extended', 'default', 'setOnEmpty' => true, 'value' => null),
array('agreement_received,agreement_expected,start_date,stop_date_original,stop_date_extended', 'date', 'format' => 'Y-m-d', 'allowEmpty' => true),
当我有一个表单时,我在说stop_date_extended上提交一个空值,它不会设置为NULL而是一个空字符串..
我做错了什么? 当然,必须有一个简单的解决方法,因为不使用日期验证工具peachy。
答案 0 :(得分:1)
Yii Default Validator类处理空值,如下所示:
/framework/validators/CDefaultValueValidator.php
protected function validateAttribute($object,$attribute)
{
if(!$this->setOnEmpty)
$object->$attribute=$this->value;
else
{
$value=$object->$attribute;
if($value===null || $value==='')
$object->$attribute=$this->value;
}
}
鉴于上述功能,您唯一的问题可能是,按表单发布的值[即$ value]可能不是空字符串,可能是it might have spaces
。在将值分配给模型属性之前,您可以尝试修剪()值。或者扩展默认值验证器,例如
class CMyDefaultValueValidator extends CDefaultValueValidator
{
protected function validateAttribute($object,$attribute)
{
if(!$this->setOnEmpty)
$object->$attribute=$this->value;
else
{
$value=trim($object->$attribute);
if($value===null || $value==='')
$object->$attribute=$this->value;
}
}
}
请注意以下一行: $ value = trim($ object-> $ attribute);
虽然,我没有测试过上面的代码,但我不知道这是否可以做得更好一些,
答案 1 :(得分:0)
如果要为空字符串插入null,则可以在验证后在模型中执行此操作:
public function afterValidate()
{
if(empty(trim($this->yourField))) // put whatever logic that you need
$this->yourField = null;
return parent::afterValidation();
}