как заставить функцию выполняться в модели без вызова контроллера, рамки YII

1

В моем проектном проекте на основе 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]))'

                        ),                            ),
                )
            )             
      )        
  );
  ?>

спасибо всем за ответ

Теги:
yii

3 ответа

0
Лучший ответ

Вы можете просто написать функцию 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

  • 0
    strtotime () в этом случае неверен
  • 0
    @ MR.masoud обновлен.
0

В вашей модели просто сделайте

public function getTime(){
     return date('m/d/Y H:i:s', $this->time);
}

Затем в CGridView

'url',
'ip',
array(
    'name' => 'Readable time',
    'value' => $model->getTime()
),
...
0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню