php - mvc - cómo hacer que una función se ejecute en el modelo sin llamar al controlador, marco YII
modelo vista controlador php laravel (3)
1) Las reglas de validación y sus funciones solo se $model->validate()
en $model->validate()
.
2) Acabas de secuestrar el método nativo de Yii para establecer las propiedades de la base de datos sin llamar al padre, lo que significa que se setTime()
tu función setTime()
cuando se haga algo como esto: $model->time = time()
; lo que significa que el time
nunca se establecerá en la matriz interna de atributos de la base de datos; lo que significa que nunca se guardará un valor de tiempo en la base de datos. Conclusión: no hagas eso.
3) Hay un par de formas en que puedes lograr esto.
yo. afterFind()
la función afterFind()
( http://www.yiiframework.com/doc/api/1.1/CActiveRecord#afterFind-detail ) y establezca $readdabletime
igual a una versión de tiempo formateada. Esto se llamará justo después de que se carguen las propiedades de su modelo desde la base de datos (asegúrese de llamar a parent::afterFind()
en la parte inferior de su función.
ii. Eliminar la línea, public $readdabletime;
, y agrega esta función a tu código:
public function getReaddabletime() {
return date(''m/d/Y H:i:s'', $this->time);
}
El tiempo formateado será accesible así: $model->readdabletime
En mi proyecto de ejemplo basado en yii, tengo un modelo llamado gateway y este modelo tiene una variable de DB con nombre $ time que es un tiempo de creación para gateway que proviene de la función php time ().
Quiero cambiar esta variable a un formato legible para mostrar a la vista (no para guardar en DB) y para esto escribí una función setTime () y definí una variable $ readabletime
No llamé a la función settime () en el controlador, sino en las reglas () del modelo
Escribí esta línea:
array(''time'',''setTime'')
pero no funciona
¿Cómo puedo hacer que una función funcione en el modelo?
Este es mi modelo
<?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);
}
}
y esta es mi opinión:
<?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]))''
), ),
)
)
)
);
?>
gracias a todos por responder
En tu modelo simplemente hazlo
public function getTime(){
return date(''m/d/Y H:i:s'', $this->time);
}
Luego, en CGridView
''url'',
''ip'',
array(
''name'' => ''Readable time'',
''value'' => $model->getTime()
),
...
Podrías escribir la función afterFind
en tu modelo:
protected function afterFind()
{
// convert to readable time format while viewing
$this->readabletime = date(''m/d/Y H:i:s'', $this->time);
parent::afterFind();
}
De esta forma siempre que se use el tiempo readabletime
, lo convertirá al formato deseado. CActiveRecord afterFind