Yii日期,小时,分钟 - >日期时间字符串 - > MySQL datetime

时间:2011-02-28 03:46:24

标签: php yii

我正在使用Yii构建一个Web应用程序。我的一个输入表单有一个日期的CJuiDatePicker。我有两个下拉列表,一个用于小时,一个用于分钟。

我的问题出在数据模型中,我试图将表单中的日期,小时和分钟转换为MySQL日期时间字符串。我必须生成一个类似于此的日期时间字符串 - 2011-02-27 20:11:56,因此Yii可以将字符串转换为MySQL日期时间并将值插入到行中。

在模型中,我有一个如下规则:

array('event_datetime_from', 'createDatetime', 
    'date'=>'event_date_from', 'hour'=>'event_hour_from',
    'minute'=>'event_minute_from'),

createDateTime验证程序函数如下所示:

public function createDatetime($attribute, $params) {
    if (!$this->hasErrors()) {      
        $date = $this->$params['date'];
        $hour = $this->$params['hour'];
        $minute = $this->$params['minute'];

        if (trim($date) === '') {
            $this->$attribute = null;
        } else {
            $parse = CDateTimeParser::parse(
                $date.' '.$hour.':'.$minute,
                'MM/dd/yyyy hh:mm');
            $this->$attribute = date('Y-m-d H:i:s', $parse);
        }
    }
}

现在,我不是PHP开发人员。但是,在我看来$params['date']正在返回字符串值event_date_from,而不是event_date_from的值。

我的PHP问题是,如何在event_date_from验证程序函数中获取createDateTime的值?

如果我在Yii文档的某个地方忽略了答案,我表示歉意。我找不到很多验证器函数的例子。 Yii验证器类具有与验证器函数不同的参数签名。

根据thaddeusmt的回答编辑:

我尝试扩展CActiveRecord并编写了一个afterValidate方法,但我找不到一个位置来定义我的工作日期,小时和分钟变量。我在扩展方法中定义了它们,而afterValidate方法无法看到它们。我在afterValidate方法中得到了一个PHP未定义的变量错误。

在控制器中,我编写了以下函数:

protected function createDateTime($dateString, $hour, $minute) {
    if (trim($dateString) == '') {
        return null;
    } else {
        $timeString = $dateString.' '.$hour.':'.$minute;
        return date('Y-m-d H:i:s', strtotime($timeString));
    }
}

在PHP中调用函数应该很简单,对吧?

我在actionCreate()函数中尝试了这两个调用:

$model->event_datetime_from = 
            createDateTime($_POST['event_date_from'],
            $_POST['event_hour_from'],
            $_POST['event_minute_from']
            );

$model->event_datetime_from = 
            createDateTime($model->event_date_from,
            $model->event_hour_from,
            $model->event_minute_from
            );

我的控制器代码因这些调用而死,我得到一个空白(无HTML)响应页面。

我认为我想做的事情非常简单。我想获取日期,小时和分钟字符串,并将连接转换为日期时间字符串。我错过了什么?

3 个答案:

答案 0 :(得分:3)

我所做的是,在Controller中的POST操作中(分配了POST变量),我将发布的日期和时间值转换为带有date()和mktime()函数的MySQL日期时间,然后验证/保存。所以,这是一个后期行动的例子:

public function actionUpdate() {
  $model=$this->loadModel();
  if(isset($_POST['Model'])) {
    $model->attributes = $_POST['Model']; // assign the rest of the POST vars here
    $model->event_datetime_from = date(
      'Y-m-d H:i:s', // convert the timestamp to the mySQL format
      mktime(        // create the timestamp from the posted date and time vars
        $_POST['my-hour-var'], // set the hour
        $_POST['my-minute-var'], // set the min
        $_POST['my-second-var'], // set the sec
        date("m"), // set the month
        date("d"), // set the day
        date("Y") // set the year
      )
    ); // create a MySQL Y-m-d H:i:s format date from the POST vars
    $model->save(); // this run the validation rules, naturally
  }
}

(这假定一个名为“Model”的模型,分别称为my-hour-var,my-minute-var和my-second-var的POST小时,分钟和秒变量,并且您将DATE部分设置为今天。)

以下是使用CTypeValidator

的模型模型中验证规则的示例
public function rules() {
  return array(
    array('event_datetime_from', 'type', 'type'=>'datetime', 'datetimeFormat'=>'yyyy-MM-dd hh:mm:ss', 'message' => '{attribute} is not a date and time!'),
}

我希望这有帮助!

答案 1 :(得分:2)

我强烈建议您查看此扩展程序: http://www.yiiframework.com/extension/i18n-datetime-behavior/

它会自动执行此操作。您可能需要稍微更新一下,具体取决于您对传入日期的预期。一种方法是始终通过strtotime()(内置在php日期解析函数中)而不是扩展中的特定日期解析器来运行属性。

答案 2 :(得分:0)

我终于将我的日期,小时和分钟字符串转换为日期时间字符串。

以下是我在actionCreate方法中添加的代码以及actionUpdate的{​​{1}}方法:

CalendarEventController

我在这个模型中有两个日期时间字段,第二个字段是可选的。当我把它放在一个函数中时,这段代码不起作用。它只在我将代码内联到两个动作方法中时才起作用。

我想我不懂PHP函数调用。但是,如果有其他人遇到这个问题,这里的答案是有效的。