我正在使用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)响应页面。
我认为我想做的事情非常简单。我想获取日期,小时和分钟字符串,并将连接转换为日期时间字符串。我错过了什么?
答案 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函数调用。但是,如果有其他人遇到这个问题,这里的答案是有效的。