2013-02-21 120 views
0

使用$model->save();后,它取消了现有的行为DateTimeI18NBehavior。任何人都知道如何解决?行为和保存()冲突

行为DateTimeI18NBehavior:http://www.yiiframework.com/extension/i18n-datetime-behavior/


Users.php(模型):

... 
public function behaviors() 
{ 
    return array(
     'datetimeI18NBehavior'=>array(
      'class' => 'ext.DateTimeI18NBehavior', 
     ), 
    ); 
} 
... 

代码:

$criteria = new CDbCriteria; 
$model = Users::model()->findByPk('1'); 
echo $model->birthday; 
// Response: 15/10/1900 (right) 

代码2:

$criteria = new CDbCriteria; 
$model = Users::model()->findByPk('1'); 

$model->ip = Yii::app()->request->userHostAddress; 
$model->save(); 

echo $model->birthday; 
// Response: 1990-10-15 (wrong) 
+4

那是在'DateTimeI18NBehavior'的错误行为添加afterSave()事件处理程序。它在保存数据之前将日期时间格式设置为“Y-m-d”,并保持原样。一个快速解决的办法是在行为 – dInGd0nG 2013-02-21 06:45:02

+0

@ dInGd0nG添加'afterSave()'事件处理程序谢谢,我解决了!你可以将你的'Comment'作为'Answer'发布,所以我可以接受它。 – 2013-02-21 07:18:13

+0

答复补充:) – dInGd0nG 2013-02-21 10:02:07

回答

3

这是一个在DateTimeI18NBehavior中的错误。它在保存数据之前将日期时间格式设置为Y-m-d,并保持原样。一个快速的解决办法是在其逻辑是一样的,即afterFind()

public function afterSave($event){ 

     foreach($event->sender->tableSchema->columns as $columnName => $column){ 

      if (($column->dbType != 'date') and ($column->dbType != 'datetime')) continue; 

      if (!strlen($event->sender->$columnName)){ 
       $event->sender->$columnName = null; 
       continue; 
      } 

      if ($column->dbType == 'date'){    
       $event->sender->$columnName = Yii::app()->dateFormatter->formatDateTime(
           CDateTimeParser::parse($event->sender->$columnName, $this->dateIncomeFormat),'medium',null); 
      }else{    
       $event->sender->$columnName = 
        Yii::app()->dateFormatter->formatDateTime(
          CDateTimeParser::parse($event->sender->$columnName, $this->dateTimeIncomeFormat), 
          'medium', 'medium'); 
      } 
     } 
     return true; 
    }