В моем проектном проекте на основе yii у меня есть модель с именем gateway, и у этой модели есть переменная из БД с именем $ time, которое является временем создания шлюза, которое исходит из функции php time().
Я хочу изменить эту переменную на читаемую форму, чтобы показать ее (не сохранять в БД), и для этого я написал функцию setTime() и определил переменную $ readabletime
Я не вызывал функцию settime() в контроллере, а в правилах() модели
Я написал эту строку:
array('time','setTime')
но это не работает
Как я могу заставить функцию работать в модели?
Это моя модель
<?php
class UserGateway extends CActiveRecord
{
public $readabletime;
/**
* @return string the associated database table name
*/
public function tableName()
{
return 'user_gateway';
}
public function rules()
{
// NOTE: you should only define rules for those attributes that
// will receive user inputs.
return array(
array('name, url, ip, time, userid, gatewaycategoryid', 'required'),
array('time, status, userid, gatewaycategoryid, defaultgateway', 'numerical', 'integerOnly'=>true),
array('name, url', 'length', 'max'=>120),
array('ip', 'length', 'max'=>18),
// The following rule is used by search().
// @todo Please remove those attributes that should not be searched.
array('id, name, url, ip, time, status, userid, gatewaycategoryid, defaultgateway', 'safe', 'on'=>'search'),
array('time','setTime')
);
}
public function setTime()
{
$this->readabletime=date('m/d/Y H:i:s', $this->time);
}
}
и это мое мнение:
<?php echo CHtml::link('Advanced Search','#',array('class'=>'search- button')); ?>
<div class="search-form" style="display:none">
</div><!-- search-form -->
<?php $this->widget('zii.widgets.grid.CGridView', array(
'id'=>'UserAccountnumber-grid',
'dataProvider'=>$model->search(),
'filter'=>$model,
'columns'=>array(
'name',
'url',
'ip',
'readabletime',
array(
'class'=>'CButtonColumn',
'buttons'=>array(
'update' => array(
'url'=>'Yii::app()->createUrl(\'User/UpdateGateway\',array(\'id\'=>$data[id]))'),
'delete' => array(
'url'=>'Yii::app()->createUrl(\'User/DeleteGateway\',array(\'id\'=>$data[id]))'
), ),
)
)
)
);
?>
спасибо всем за ответ
Вы можете просто написать функцию afterFind
в своей модели:
protected function afterFind()
{
// convert to readable time format while viewing
$this->readabletime = date('m/d/Y H:i:s', $this->time);
parent::afterFind();
}
Таким образом, везде, где используется readabletime
, он преобразует его в желаемый формат. CActiveRecord afterFind
В вашей модели просто сделайте
public function getTime(){
return date('m/d/Y H:i:s', $this->time);
}
Затем в CGridView
'url',
'ip',
array(
'name' => 'Readable time',
'value' => $model->getTime()
),
...
1) Правила проверки и их функции вызываются только на $model->validate()
.
2) Вы только что захватили собственный метод Yii для настройки свойств базы данных без вызова родителя, что означает, что ваша setTime()
будет вызываться, когда что-то подобное делается: $model->time = time()
; значение time
никогда не будет установлено во внутреннем массиве атрибутов базы данных; что значение времени никогда не будет сохранено в базе данных. Вывод: не делайте этого.
3) Есть несколько способов, которыми вы можете это выполнить.
я. Переопределите afterFind()
(http://www.yiiframework.com/doc/api/1.1/CActiveRecord#afterFind-detail) и установите значение $readdabletime
равным форматированной версии времени. Это будет вызываться сразу после загрузки свойств модели из базы данных (не забудьте вызвать parent::afterFind()
в нижней части вашей функции.
II. Удалите строку, public $readdabletime;
, и вместо этого добавьте эту функцию в свой код:
public function getReaddabletime() {
return date('m/d/Y H:i:s', $this->time);
}
Отформатированное время будет доступно следующим образом: $model->readdabletime