使用 ActiveForm 的字段数据
Field Data With ActiveForm
只是想找出使用 Yii 框架从 DOB 即时计算年龄的最佳方法。
我有一个包含以下字段的模型。
'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 是您的用户模型。)
只是想找出使用 Yii 框架从 DOB 即时计算年龄的最佳方法。
我有一个包含以下字段的模型。
'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 是您的用户模型。)