Intereting Posts
Как внутреннее соединение работает с отношениями «многие ко многим» с помощью Doctrine и Symfony2 Как преобразовать строку в boolean php Как написать регулярное выражение для соответствия бесплатной учетной записи электронной почты? Эффективность и масштабируемость массива PHP PHP-маршрутизация с помощью Codeigniter (заголовки в URL-адресе для SEO) Живой чат с PHP и jQuery. Где хранить информацию? Mysql или файл? Пока цикл не закончится, когда я расскажу об этом в JavaScript PHP автоматически делает urldecode () на $ _POST? Копировать код между несколькими PHP-сайтами Функция MongoDB GROUP (или Map Reduce, если необходимо) с помощью PHP-отличительных клавиш Ошибка file_get_contents () Получить год / месяц / день из даты и времени в php? PHPMailer, отправляющий на несколько адресов, разделенных символом a, Сравните два изображения с ImageMagick Ошибка FPDF: некоторые данные уже были получены с помощью FPDF

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

В моем проектном проекте на основе 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/YH: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/YH:i:s', $this->time); parent::afterFind(); } 

Таким образом, везде, где используется readabletime , он преобразует его в желаемый формат. CActiveRecord afterFind

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/YH:i:s', $this->time); } 

Отформатированное время будет доступно следующим образом: $model->readdabletime

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

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

Затем в CGridView

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