2015-03-17 2 views
0

Просто хотелось узнать, что является лучшим способом рассчитать возраст от 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.

+0

Почему вы включаете скрытый ввод с возрастом в вашу форму? И такие вычисления должны выполняться в модели вместо представления. – arogachev

+0

Вы можете сделать этот расчет в методе beforeSave. Он вызывается перед событием вставки. Для подробностей здесь ссылка: http://www.yiiframework.com/doc-2.0/yii-db-baseactiverecord.html#beforeSave%28%29-detail – Chinmay

+0

Как сказал @arogachev, вы должны рассчитать возраст в функции как «getAge()». Нецелесообразно хранить калькулируемый. –

ответ

1

В модели пользователя, добавьте:

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(), где вам это нужно. (Если модель $ является вашей моделью пользователя.)

Смежные вопросы