【问题标题】:Yii date, hour, minute -> datetime string -> MySQL datetimeYii 日期、小时、分钟 -> 日期时间字符串 -> MySQL 日期时间
【发布时间】:2011-02-28 03:46:24
【问题描述】:

我正在使用 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 问题是,如何在 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)响应页面。

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

【问题讨论】:

    标签: php yii


    【解决方案1】:

    我所做的是,在控制器的 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,并且您将 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!'),
    }
    

    我希望这会有所帮助!

    【讨论】:

    • 是的,您的回答会有所帮助。我现在在控制器中工作。我编写了类似于您的发布操作示例的代码,并且由于创建,我得到了一个空白网页。一旦我弄清楚我做错了什么,我就会接受你的回答。
    • 在我的代码中,$_POST['my-hour-var'] 没有定义。您在哪里定义工作变量以便它们在控制器中可见?
    • 不,你是对的,那是一个虚构的变量。看看你下面的答案应该是 $_POST['CalendarEvent']['event_hour_from'],我只是不知道 JUI 日期小部件是如何发布数据的,对此感到抱歉。
    • 对不起,我在之前的评论中没有说得更清楚。当时,我使用自己的变量名,但没有定义它们,因为我还需要指定 CalendarEvent 键。我怀疑放置此代码的最佳位置是在 afterValidate() 方法中的抽象 ActiveRecord 类中,但我在 PHP 开发方面没有足够的经验来实现它。
    【解决方案2】:

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

    它会自动执行其中的一些行为。您可能需要对其进行一些更新,具体取决于您期望传入日期的外观。一种方法是始终通过 strtotime() (内置 php 日期解析函数)而不是扩展中的特定日期解析器来运行属性。

    【讨论】:

    • 我还建议在 Yii 操场上查看日期时间的东西:yiiplayground.cubedwater.com/…
    • 感谢您的回答。我对 Yii 扩展没有很好的体验,主要是因为我不是 PHP 开发人员。到目前为止,我尝试过的每个 Yii 扩展都需要过多地猜测将各种配置选项放在哪里。
    【解决方案3】:

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

    这是我在actionCreate 方法和CalendarEventControlleractionUpdate 方法中输入的代码:

            $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 函数调用。但是,万一其他人遇到这个问题,这就是有效的答案。

    【讨论】:

    • 如果它在另一个函数中中断,它应该仍然可以工作......只需确保在函数中可能需要的操作中传递所有局部变量,例如 $model。如果你确实传入了 $model,请做我的参考,或者返回它。 POST 全局变量应该在请求中随时随地可用。
    猜你喜欢
    • 2014-02-21
    • 1970-01-01
    • 2016-04-02
    • 1970-01-01
    • 2010-12-21
    • 1970-01-01
    • 2018-02-19
    • 2020-03-16
    • 1970-01-01
    相关资源
    最近更新 更多