Просто хотелось узнать, что является лучшим способом рассчитать возраст от DOB на лету, используя структуру Yii.Данные поля с ActiveForm
У меня есть модель со следующими полями.
'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(); ?>
Конечно есть проблема здесь, чтобы получить $ модели- > dob, форма сначала должна быть представлена, поэтому, когда вычисление возраста выполняется, dob непосвящен.
Что я хочу знать, где-то я могу сначала прочитать поле доба, чтобы возраст можно было вычислить правильно?
Или это лучше всего сделано чем-то вроде триггера в базе данных?
Ожидает ответа на вопросы.
Cheers.
Почему вы включаете скрытый ввод с возрастом в вашу форму? И такие вычисления должны выполняться в модели вместо представления. – arogachev
Вы можете сделать этот расчет в методе beforeSave. Он вызывается перед событием вставки. Для подробностей здесь ссылка: http://www.yiiframework.com/doc-2.0/yii-db-baseactiverecord.html#beforeSave%28%29-detail – Chinmay
Как сказал @arogachev, вы должны рассчитать возраст в функции как «getAge()». Нецелесообразно хранить калькулируемый. –