如何在不调用控制器,YII框架的情况下使函数在模型中执行

时间:2015-11-12 17:35:29

标签: php yii

在我基于yii的示例项目中,我有一个名为gateway的模型,此模型有一个来自DB的变量,其名称为 $ time ,这是网关的创建时间 来自php time()函数。

我想将此变量更改为可读形式以在视图中显示(不保存在DB中)为此我编写了一个函数 setTime()并定义了一个变量 $ readabletime

我没有在控制器中调用函数 settime(),而是在模型的 rules()中调用

我写了这一行:

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]))'

                        ),                            ),
                )
            )             
      )        
  );
  ?>

谢谢大家回答

3 个答案:

答案 0 :(得分:0)

1)验证规则及其功能仅在$model->validate()上调用。

2)您刚刚劫持了Yii的原生方法,无需调用父级即可设置数据库属性,这意味着在完成此类操作后将调用setTime()函数:{{1} };意味着永远不会在数据库属性的内部数组上设置$model->time = time();意味着时间值永远不会保存在数据库中。结论:不要这样做。

3)有几种方法可以实现这一目标。

我。覆盖timehttp://www.yiiframework.com/doc/api/1.1/CActiveRecord#afterFind-detail)函数,并将afterFind()设置为格式化的时间版本。这将在从数据库加载模型属性后立即调用(确保在函数底部调用$readdabletime

II。删除行parent::afterFind(),然后将此函数添加到您的代码中:

public $readdabletime;

格式化的时间可以像这样访问:public function getReaddabletime() { return date('m/d/Y H:i:s', $this->time); }

答案 1 :(得分:0)

在您的模型中,只需执行

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

然后,在CGridView

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

答案 2 :(得分: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