如何在 ActiveRecord 自动化记录时间戳 [ 1.1 版本 ]
有很多方法可以自动化设置在ActiveRecord模型中yii时间戳。下面介绍两种方法:
- 通过rules()
- 通过beforeSave()
我们需要开始建立数据库表。
CREATE TABLE IF NOT EXISTS `Nodes` (
`id` bigint(20) NOT NULL auto_increment,
`title` varchar(255) NOT NULL,
`created` datetime NOT NULL,
`modified` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
按照下面的方法我们会Yii shell工具建立模型:
model Node Nodes
创造crud功能我们需要这样:
crud Node
第一种方法是通过你的模型的rules做到的。这里有个例子。
/**
* @return array validation rules for model attributes.
*/
public function rules()
{
return array(
array('title','length','max'=>255),
array('title, created, modified', 'required'),
array('modified','default',
'value'=>new CDbExpression('NOW()'),
'setOnEmpty'=>false,'on'=>'update'),
array('created,modified','default',
'value'=>new CDbExpression('NOW()'),
'setOnEmpty'=>false,'on'=>'insert')
);
}
你在最后看到两个规则,一个规则是在更新记录的时候改变属性值,另外一个规则是在创建记录的时候改变属性值。你也可以看到“new CDbExpression("NOW()")”声明。这通过“NOW()”的MySQL服务器,它不会被避开。MySQL可以翻译它作为一个声明,并不是作为一个字符串。这意味着字段类型可以是其他日期/时间类型(时间戳、等等),它还可以工作。
另一个解决方案是通过beforeSave()方法,使用如下:
public function beforeSave() {
if ($this->isNewRecord)
$this->created = new CDbExpression('NOW()');
else
$this->modified = new CDbExpression('NOW()');
return parent::beforeSave();
}
这些都是简单和优雅解决这个问题的方法。
╃巡洋艦㊣ 北京
注册时间:2010-11-21
最后登录:2天前
在线时长:1685小时48分
最后登录:2天前
在线时长:1685小时48分
- 粉丝1370
- 金钱77583
- 威望845
- 积分102883
共 26 条评论
收藏起来~
感谢巡洋舰站长的无私奉献!
谢谢我们v5的舰长 翻译分享~
大家都可以在这里分享,希望大家积极参与进来!
希望更给力哈。
请问handler.js文件在哪里?
这样看着有点头晕,能说的详细点吗
我没看懂啊,详细说明下好吗,还有handler.js是什么
controller是怎么接收值的啊,是这个吗:
$filedata=$_FILES['Filedata'];
@move_uploaded_file($filedata['tmp_name'],'path/to/folder');
可是怎么没传上去啊,'path/to/folder'这个路径我也改了啊
把舰长顶起来
好东西啊~
稍后会把上传功能做好!
更好更简单的方法:
http://www.yiichina.com/topic/2026
看见很多人都没上传文件成功!我发表下我的看法!
比如我有个webapp:blog,那么我在blog下面新建文件夹uploads用来放上传的图片,这样写就可以上传成功,
在controller里面要那么写:
//设定允许被访问的方法,别忘记设置允许访问的方法,否则上传不了
public function accessRules() { return array( array('allow', // allow all users to perform 'index' and 'view' actions 'actions'=>array('index','view','updateajax','uploads'), 'users'=>array('*'), ), ); } public function actionUploads() { $year=date('Y'); $month=date('m'); $path='uploads/'.$year.'/'.$month.'/'; //如果目录不存在就创建目录 if(!file_exists('uploads/'.$year.'/')){ mkdir('uploads/'.$year.'/','0777'); } if(!file_exists($path)){ mkdir($path,'0777'); } $filedata=$_FILES['Filedata']; @move_uploaded_file($filedata['tmp_name'],$path.uniqid().'.gif'); }
view部分这么写:
//主要是这两个地址的配置:例如在webapp下面的assets文件夹下建立path/to/文件夹并将handlers.js放在该目录下
'jsHandlerUrl'=>Yii::app()->assetManager->getBaseUrl().'/path/to/handlers.js', //Relative path 'postParams'=>array(), 'config'=>array( 'use_query_string'=>true, //上传的controllers地址 'upload_url'=> $this->createUrl('helloworld/uploads'), //Use $this->createUrl method or define yourself
挺简单实用的
等用了之后再看有没有问题。
没有调查就没有发言权啊。。。
在哪里下载这个扩展啊
“ http://www.yiiframework.com/extension/swfupload ” 这里面Downloads 下面的两个都要下载后,再看下'yeyongyong'提供的方法就可以实现上传了。
Handlers and Style Example.zip [这里面有 handler.js]
swfupload-1.0.zip
'upload_success_handler'=>'js:uploadSuccessListView' TO 'upload_success_handler'=>'js:uploadSuccess'.Requirements
这个的意思是 把‘config’里面的
'upload_success_handler'=>'js:uploadSuccessListView'
改成
'upload_success_handler'=>'js:uploadSuccess'
吧?为什么我按照这上面的配置,但是页面里面什么都没有?希望大家帮帮忙。
我的view里面这么写的:
<?php $this->widget('application.extensions.swfupload.CSwfUpload', array( 'jsHandlerUrl'=>Yii::app()->getBaseUrl().'/resource/js/handler.js', //Relative path 'postParams'=>array(), 'config'=>array( 'use_query_string'=>true, 'upload_url'=>$this->createUrl('s/up'), //Use $this->createUrl method or define yourself 'file_size_limit'=>'2 MB', 'file_types'=>'*.jpg;*.png;*.gif', 'file_types_description'=>'Image Files', 'file_upload_limit'=>01, 'file_queue_error_handler'=>'js:fileQueueError', 'file_dialog_complete_handler'=>'js:fileDialogComplete', 'upload_progress_handler'=>'js:uploadProgress', 'upload_error_handler'=>'js:uploadError', 'upload_success_handler'=>'js:uploadSuccess', 'upload_complete_handler'=>'js:uploadComplete', 'custom_settings'=>array('upload_target'=>'divFileProgressContainer'), 'button_placeholder_id'=>'swfupload', 'button_width'=>170, 'button_height'=>20, 'button_text'=>'<span class="button">'.Yii::t('messageFile', 'ButtonLabel').' (Max 2 MB)</span>', 'button_text_style'=>'.button { font-family: "Lucida Sans Unicode", "Lucida Grande", sans-serif; font-size: 11pt; text-align: center; }', 'button_text_top_padding'=>0, 'button_text_left_padding'=>0, 'button_window_mode'=>'js:SWFUpload.WINDOW_MODE.TRANSPARENT', 'button_cursor'=>'js:SWFUpload.CURSOR.HAND', ), ) ); ?>
<?php echo CHtml::beginForm(); ?> <div class="form"> <div class="row"> <div id="divFileProgressContainer"></div> <div class="swfupload"><span id="swfupload"></span></div> </div> </div> <?php echo CHtml::endForm(); ?>