1

我会在表单(视图)中将用户的生日分为 3 个不同的字段:日、月和年。我想知道我是否做得对,是否有更简单的方法可以做到这一点。

性能上有没有更好的方法?对于所有人来说,它会分隔日期,尽管不是必需的。


模型.php:

public $birthday_day;
public $birthday_month;
public $birthday_year;

...

public function afterFind() {
    $this->birthday_day = date('j', strtotime($this->birthday));
    $this->birthday_month = date('n', strtotime($this->birthday));
    $this->birthday_year = date('Y', strtotime($this->birthday));
}


public function beforeValidate() {
    if ($this->birthday_day  AND  $this->birthday_month  AND  $this->birthday_year)
        $this->birthday = new DateTime($birthday_year.'-'$birthday_month'-'.$birthday_day);

}
4

1 回答 1

1

如果您只是为了输入目的将日期分成三部分,例如,另一种选择可能是使用CJuiDatePicker允许用户选择完整日期;

$this->widget('zii.widgets.jui.CJuiDatePicker', array(
    'name'=>'birthday',
    'model'=>$model,
    'attribute'=>'birthday',
    'options'=>array(
        'showAnim'=>'fold',
    ),
    'htmlOptions'=>array(
        'style'=>'height:20px;'
    ),
));

然后,您可以将结果格式化为您想要的格式以插入到您的数据库中,例如;

...
public function actionCreate()
{
    $model=new Model;
    if(isset($_POST['Model']))
    {
        $model->attributes=$_POST['Model'];
        $model->save();
        ...
    }
    ...
}
...

或更新;

...
public function actionUpdate($id)
{
    $model=$this->loadModel($id);
    if(isset($_POST['Model']))
    {
        $model->attributes=$_POST['Model'];
        $model->save();
        ...
    }
    ...
}
...

为了将日期保存为正确的格式(即从用户友好的格式将 CJuiDatePicker dd/mm/yyyy 转换为您的 sql 表格式,很可能类似于 YYYY-mm-dd)然后您可以在保存模型之前进行转换, 像这样;

public function beforeSave() {

    $this->birthday=date('Y-m-d',strtotime($this->birthday); // Or however you want to insert it

    return parent::beforeSave();
}

如果您随后需要特定的日/月/年在应用程序的其他位置显示,您可以像在示例中一样将它们设置为属性(public $birthday_day;等),这完全没有问题。或者,如果您不想在每次调用模型实例时转换日期,您可以为它们设置一个属性,如下所示;

public function getBirthday($part) {
    switch($part)
    {
        case 'day':
            return date('j', strtotime($this->birthday));
            break;
        case 'month':
            return date('n', strtotime($this->birthday));
            break;
        case 'year':
            return date('Y', strtotime($this->birthday));
            break;
        default:
            return date('d/m/Y', strtotime($this->birthday));
            break;
    }
}

如果你想要这一天,只需打电话$model->getBirthday('day');……或者无论如何你想这样做,最后一点更个人喜好!

于 2012-12-19T14:12:02.897 回答