使用Yii自动存储日期时间

3
我正在使用Yii来学习php,我有个大问题,希望你能帮助我。我正在使用表单创建用户。我想将表单中输入的用户数据存储到数据库(MySQL)中,并在datetime字段中存储日期和时间。我看到了一些扩展,如CJUIDATEPICKER可以选择日期,但我不知道是否有选择datetime的扩展。我认为更好的方法是在创建新用户时自动存储datetime。现在,我在表单中有一个文本框,需要以yyyy-mmmm-dddd hh:mm:ss的格式输入datetime,但我认为这并不实用。
请问有谁能帮助我并解释一下如何存储创建注册信息时的datetime?
非常感谢。
编辑:
现在我在actionCreate()控制器中使用"$model->reg_date = new CDbExpression('NOW()');",它有效地解决了问题,但我认为最好在写入任何内容之前在用户创建表单的字段中显示此datetime,并在单击提交时存储表单的所有字段。我尝试过这样做,但如您所料,该字段只显示"NOW()"。
这是_form.php中我的代码的一部分:
<div class="row">
<?php $model->reg_date=new CDbExpression('NOW()');?>
<?php echo $form->labelEx($model,'reg_date'); ?>
<?php echo $form->textField($model,'reg_date'); ?>
<?php echo $form->error($model,'reg_date'); ?>
</div>

有人能帮我吗?

再次感谢!

5个回答

6
如果您选择在创建新用户时自动存储日期时间,我建议使用CDbExpression
$model->created = new CDbExpression('NOW()'); // "YYYY-MM-DD HH:MM:SS"

使用UNIX_TIMESTAMP(NOW())函数能够获取当前时间的Unix时间戳,需要注意这些函数是MySQL特有的。

我还想指出,CJuiDatePicker是Yii中捆绑的一个小部件。抱歉我有点吹毛求疵。


更新的答案使用php的日期函数而不是MySQL的NOW()函数:

// UserController.php
public function actionCreate()
{
    $model=new User;
    $model->created = date("Y-m-d H:i");  // Added this.
    if(isset($_POST['User']))
    {
        $model->attributes=$_POST['User'];
        if($model->save())
        {
            $this->redirect(array('view','id'=>$model->id));
        }
    }
    $this->render('create',array(
        'model'=>$model,
    ));
}

// _form.php  inside your Active Form
echo $form->labelEx($model,'created');   // Display it anyway you'd like. A label perhaps?
echo $form->hiddenField($model, 'created'); // Send back value to the controller on submit

这应该就是全部了!

如果您使用Bootstrap,请注意一点。不要在表单中首先放置隐藏字段,因为引导程序的first-child css选择器会破坏顶部边距。


谢谢,我在控制器的actionCreate()中编写了CDbExpression('NOW()'),但我认为在用户创建表单中写入任何内容之前,在该字段中显示此日期时间会更好,并在单击提交时存储此日期时间字段。你能帮我吗? - JK_galera
好的,我已经更新了答案。不过我没有尝试过,但应该可以工作。 - ippi
谢谢ippi,您的解决方案非常有用,现在我只有一个小问题。我如何设置创建注册表的人所在国家的时间?我的意思是,我希望时间取决于该国家的时区。 - JK_galera

2

不需要在表单中添加日期时间字段 *只需从表单中删除日期时间字段*。

并在您的模型规则中添加 CDbExpression('NOW()'),请参见示例

public function rules()
    {
        return array(
//date_modified and date_created is my database field names..
               array('date_modified','default',
                    'value'=>new CDbExpression('NOW()'),//automatically add the current date in mysql feild
                     'setOnEmpty'=>false,'on'=>'update'),
                   array('date_created,date_modified','default',
                'value'=>new CDbExpression('NOW()'),
              'setOnEmpty'=>false,'on'=>'insert'),
);
}

1
在用户或注册控制器中,只需在actionCreate()方法中编写即可。
public function actionCreate()
{
       if(isset($_POST['user']
       {
             $model->attributes=$_POST['user'];
             $model->created_date=new CDbExpression('NOW()'); //inserting created time

             // ...
       }
}

它将自动插入您创建的用户时间。

谢谢你的帮助,它运行良好,但是,在编写任何内容之前是否可以自动在表单中显示此日期时间?我的意思是,不要在控制器actionCreate中创建注册日期时间,而是在表单中完整显示日期时间字段,并在单击提交时存储它。 - JK_galera

0

如果你只想修改你的视图,请尝试使用 -> kartiks TimePicker widget

例如:

<?= $form->field($model, 'time')->widget(TimePicker::classname(),[
'pluginOptions' => ['defaultTime' => 'current'] ]);?>

0
如果要自动设置datetime字段,您可以将其更改为timestamp,并将CURRENT_TIMESTAMP设置为其默认值,如this answer所示。
如果您坚持使用datetime,则可以使用触发器,如this answer中所述。

谢谢,Topher。但我更喜欢使用 $model->reg_date=new CDbExpression('NOW()'),因为这更容易呢。另外,我必须使用日期时间。 - JK_galera

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接