我正在使用Yii构建一个web应用程序。我的一个输入表单有一个日期的CJuiDatePicker。我有两个下拉列表,一个用于小时,另一个用于分钟。
我的问题出在数据模型中,我试图将表单中的日期、小时和分钟转换为MySQL日期时间字符串。我必须生成一个类似于- 2011-02-27 20:11:56的datetime字符串,这样Yii就可以将该字符串转换为MySQL datetime并将值插入到行中。
在模型中,我有一个规则,看起来像这样:
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的值。
我的问题是,如何在createDateTime验证器函数中获取event_date_from的值?
如果我忽略了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)响应页面。
我认为我想要做的事情很简单。我希望获取日期、小时和分钟字符串,并将连接转换为日期时间字符串。我遗漏了什么?
发布于 2011-02-28 12:34:39
我所做的是,在控制器中的POST操作(分配POST变量的地方)中,使用date()和mktime()函数将发布的日期和时间值转换为MySQL日期时间,然后验证/保存。因此,下面是post操作的一个示例:
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
}
}(假设有一个名为“模型”的模型,小时、分钟和秒变量分别称为my- POSTed -var、my-my var和my- second -var,并且您将日期部分设置为今天。)
下面是使用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!'),
}我希望这能帮到你!
发布于 2011-03-02 01:02:32
我强烈建议您查看这个扩展:http://www.yiiframework.com/extension/i18n-datetime-behavior/
它会自动执行其中的一些行为。你可能需要更新它,这取决于你期望你的未来日期看起来是什么样子。一种方法是始终通过strtotime() (内置在php日期解析函数中)运行属性,而不是通过扩展中特定的日期解析器运行。
发布于 2011-02-28 20:44:30
我终于将我的日期、小时和分钟字符串转换为日期时间字符串。
下面是我放入CalendarEventController的actionCreate方法和actionUpdate方法中的代码
$model->attributes=$_POST['CalendarEvent'];
// new code
$timeString = $_POST['CalendarEvent']['event_date_from'].' '.
$_POST['CalendarEvent']['event_hour_from'].':'.
$_POST['CalendarEvent']['event_minute_from'];
$model->event_datetime_from =
date('Y-m-d H:i:s', strtotime($timeString));
if (trim($_POST['CalendarEvent']['event_date_to']) === '') {
$model->event_datetime_to = null;
} else {
$timeString = $_POST['CalendarEvent']['event_date_to'].' '.
$_POST['CalendarEvent']['event_hour_to'].':'.
$_POST['CalendarEvent']['event_minute_to'];
$model->event_datetime_to =
date('Y-m-d H:i:s', strtotime($timeString));
}我在这个模型中有两个日期时间字段,第二个字段是可选的。当我把它放在一个函数中时,这段代码不起作用。只有当我将代码内联到两个操作方法中时,它才能起作用。
我想我不理解PHP函数调用。但是,如果其他人遇到这个问题,这里有一个有效的答案。
https://stackoverflow.com/questions/5137988
复制相似问题