带有ActiveForm的字段数据


Field Data With ActiveForm

我只是想找出使用Yii框架实时从出生日期计算年龄的最佳方法。

我有一个包含以下字段的模型。

        'id' => 'ID',
        'firstname' => 'Firstname',
        'surname' => 'Surname',
        'dob' => 'Dob',
        'age' => 'Age',

然后在我的_form.php文件中,我试图编辑它,以便实时计算年龄

<?php $form = ActiveForm::begin(); ?>
<?php
    $currentDate=date('Y-m-d');
    $dob=$model->dob; //Careful with initialization???
    $model->age=$currentDate-$dob; 
?>
<?= $form->field($model, 'firstname')->textInput(['maxlength' => 50]) ?>
<?= $form->field($model, 'surname')->textInput(['maxlength' => 50]) ?>
<?= $form->field($model, 'dob')->widget(
    DatePicker::className(), [
    // inline too, not bad
    'inline' => false, 
    // modify template for custom rendering
    'template' => '<div class="well well-sm" style="background-color: #fff; width:250px">{input}</div>',
    'clientOptions' => [
        'autoclose' => true,
        'format' => 'yyyy-mm-dd'
    ]
]);?>
<?php echo Html::activeHiddenInput($model, 'age') ; 
<div class="form-group">
    <?= Html::submitButton($model->isNewRecord ? 'Create' : 'Update', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
</div>
<?php ActiveForm::end(); ?>

当然,这里有一个问题,即要获得$model->dob,必须首先提交表单,所以当年龄计算完成时,dob是不熟悉的。

我想知道的是,有什么方法可以让我先从dob字段中读取,这样可以正确计算年龄?

还是最好通过数据库中的触发器来完成?

期待收到回复。

干杯。

在您的用户模型中,添加:

public $age;
public function getAge()
{
    // age in format yyyy-mm-dd
    if(isset($this->age)) return $this->age;
    else {
        $dob = explode("-", $this->dob);
        $age = (date("md", date("U", mktime(0, 0, 0, $dob[1], $dob[2], $dob[0]))) > date("md")
            ? ((date("Y") - $dob[2]) - 1)
            : (date("Y") - $dob[2]));
        $this->age = $age;
        return $age;
    }
}

然后,您可以在需要的地方调用$model->getAge()。(当然,如果$model是您的用户模型。)