YII视图整合kindeditor扩展的方法
本文实例讲述了YII视图整合kindeditor扩展的方法。分享给大家供大家参考,具体如下:
比较喜欢用kindeditor,YII上的版本比较旧,所以自己重新整了个扩展
先在protected\extensions下创建KEditor文件夹用来放文件,keSource里放kindeditor的源文件,然后建三个类KEditor、KEditorManage和KEditorUpload,KEditor是扩展的主文件,KEditorManage是用来浏览服务器文件的,KEditorUpload是用来示例接收上传文件的,
KEditor代码
<?php classKEditorextendsCWidget{ /* *TEXTAREA输入框的属性,保证js调用KE失败时,文本框的样式。 */ public$textareaOptions=array(); /* *编辑器属性集。 */ public$properties=array(); /* *TEXTAREA输入框的name,必须设置。 *数据类型:String */ public$name; /* *TEXTAREA的id,可为空 */ public$id; public$model; public$baseUrl; publicstaticfunctiongetUploadPath(){ $dir=dirname(__FILE__).DIRECTORY_SEPARATOR.'keSource'; if(isset(Yii::app()->params->uploadPath)){ returnYii::getPathOfAlias('webroot').str_replace( '/',DIRECTORY_SEPARATOR, Yii::app()->params-> uploadPath); } returnYii::app()->getAssetmanager() ->getPublishedPath($dir).DIRECTORY_SEPARATOR.'upload'; } publicstaticfunctiongetUploadUrl(){ $dir=dirname(__FILE__).DIRECTORY_SEPARATOR.'keSource'; if(isset(Yii::app()->params->uploadPath)){ returnYii::app()->baseUrl.Yii::app()->params->uploadPath; } returnYii::app()->getAssetManager()->publish($dir).'/upload'; } publicfunctioninit(){ if($this->name===null) thrownewCException(Yii::t('zii','Theidpropertycannotbeempty.')); $dir=dirname(__FILE__).DIRECTORY_SEPARATOR.'keSource'; $this->baseUrl=Yii::app()->getAssetManager()->publish($dir); $cs=Yii::app()->getClientScript(); $cs->registerCssFile($this->baseUrl.'/themes/default/default.css'); if(YII_DEBUG)$cs->registerScriptFile($this->baseUrl.'/kindeditor.js'); else$cs->registerScriptFile($this->baseUrl.'/kindeditor-min.js'); } publicfunctionrun(){ $cs=Yii::app()->getClientScript(); $textAreaOptions=$this->gettextareaOptions(); $textAreaOptions['name']=CHtml::resolveName($this->model,$this->name); $this->id=$textAreaOptions['id']=CHtml::getIdByName($textAreaOptions['name']); echoCHtml::activeTextArea($this->model,$this->name,$textAreaOptions); $properties_string=CJavaScript::encode($this->getKeProperties()); $js=<<<EOF KindEditor.ready(function(K){ vareditor_$this->id=K.create('#$this->id', $properties_string ); }); EOF; $cs->registerScript('KE'.$this->name,$js,CClientScript::POS_HEAD); } publicfunctiongettextareaOptions(){ //允许获取的属性 $allowParams=array('rows','cols','style'); //准备返回的属性数组 $params=array(); foreach($allowParamsas$key){ if(isset($this->textareaOptions[$key])) $params[$key]=$this->textareaOptions[$key]; } $params['name']=$params['id']=$this->name; return$params; } publicfunctiongetKeProperties(){ $properties_key=array( 'width', 'height', 'minWidth', 'minHeight', 'items', 'noDisableItems', 'filterMode', 'htmlTags', 'wellFormatMode', 'resizeType', 'themeType', 'langType', 'designMode', 'fullscreenMode', 'basePath', 'themesPath', 'pluginsPath', 'langPath', 'minChangeSize', 'urlType', 'newlineTag', 'pasteType', 'dialogAlignType', 'shadowMode', 'useContextmenu', 'syncType', 'indentChar', 'cssPath', 'cssData', 'bodyClass', 'colorTable', 'afterCreate', 'afterChange', 'afterTab', 'afterFocus', 'afterBlur', 'afterUpload', 'uploadJson', 'fileManagerJson', 'allowPreviewEmoticons', 'allowImageUpload', 'allowFlashUpload', 'allowMediaUpload', 'allowFileUpload', 'allowFileManager', 'fontSizeTable', 'imageTabIndex', 'formatUploadUrl', 'fullscreenShortcut', 'extraFileUploadParams', ); //准备返回的属性数组 $params=array(); foreach($properties_keyas$key){ if(isset($this->properties[$key])) $params[$key]=$this->properties[$key]; } return$params; } }
KEditorManage代码
<?php classKEditorManageextendsCAction{ publicfunctionrun(){ Yii::import('ext.KEditor.KEditor'); $root_path=KEditor::getUploadPath().'/'; $root_url=KEditor::getUploadUrl().'/'; //图片扩展名 $ext_arr=array('gif','jpg','jpeg','png','bmp'); //目录名 $dir_name=empty($_GET['dir'])?'':trim($_GET['dir']); if(!in_array($dir_name,array('','image','flash','media','file'))){ echo"InvalidDirectoryname."; exit; } if($dir_name!==''){ $root_path.=$dir_name."/"; $root_url.=$dir_name."/"; if(!file_exists($root_path)){ mkdir($root_path); } } //根据path参数,设置各路径和URL if(empty($_GET['path'])){ $current_path=realpath($root_path).'/'; $current_url=$root_url; $current_dir_path=''; $moveup_dir_path=''; }else{ $current_path=realpath($root_path).'/'.$_GET['path']; $current_url=$root_url.$_GET['path']; $current_dir_path=$_GET['path']; $moveup_dir_path=preg_replace('/(.*?)[^\/]+\/$/','$1',$current_dir_path); } echorealpath($root_path); //排序形式,nameorsizeortype $order=empty($_GET['order'])?'name':strtolower($_GET['order']); //不允许使用..移动到上一级目录 if(preg_match('/\.\./',$current_path)){ echo'Accessisnotallowed.'; exit; } //最后一个字符不是/ if(!preg_match('/\/$/',$current_path)){ echo'Parameterisnotvalid.'; exit; } //目录不存在或不是目录 if(!file_exists($current_path)||!is_dir($current_path)){ echo'Directorydoesnotexist.'; exit; } //遍历目录取得文件信息 $file_list=array(); $handle=newDirectoryIterator($current_path); $i=0; foreach($handleas$file){ if($file->isDot())continue; if($file->isDir()){ $file_list[$i]['is_dir']=true;//是否文件夹 $file_list[$i]['has_file']=(count(scandir($file->getPath()))>2);//文件夹是否包含文件 $file_list[$i]['filesize']=0;//文件大小 $file_list[$i]['is_photo']=false;//是否图片 $file_list[$i]['filetype']='';//文件类别,用扩展名判断 }else{ $file_list[$i]['is_dir']=false; $file_list[$i]['has_file']=false; $file_list[$i]['filesize']=$file->getSize(); $file_list[$i]['dir_path']=''; $file_ext=$file->getExtension(); $file_list[$i]['is_photo']=in_array($file_ext,$ext_arr); $file_list[$i]['filetype']=$file_ext; } $file_list[$i]['filename']=$file->getFilename();//文件名,包含扩展名 $file_list[$i]['datetime']=date('Y-m-dH:i:s',$file->getMTime()); $i++; } usort($file_list,array($this,'cmp_func')); $result=array(); //相对于根目录的上一级目录 $result['moveup_dir_path']=$moveup_dir_path; //相对于根目录的当前目录 $result['current_dir_path']=$current_dir_path; //当前目录的URL $result['current_url']=$current_url; //文件数 $result['total_count']=count($file_list); //文件列表数组 $result['file_list']=$file_list; //输出JSON字符串 header('Content-type:application/json;charset=UTF-8'); echoCJSON::encode($result); exit; } //排序 publicfunctioncmp_func($a,$b){ global$order; if($a['is_dir']&&!$b['is_dir']){ return-1; }elseif(!$a['is_dir']&&$b['is_dir']){ return1; }else{ if($order=='size'){ if($a['filesize']>$b['filesize']){ return1; }elseif($a['filesize']<$b['filesize']){ return-1; }else{ return0; } }elseif($order=='type'){ returnstrcmp($a['filetype'],$b['filetype']); }else{ returnstrcmp($a['filename'],$b['filename']); } } } } ?>
KEditorUpload代码
<?php classKEditorUploadextendsCAction{ publicfunctionrun(){ $dir=isset($_GET['dir'])?trim($_GET['dir']):'file'; $ext_arr=array( 'image'=>array('gif','jpg','jpeg','png','bmp'), 'flash'=>array('swf','flv'), 'media'=>array('swf','flv','mp3','wav','wma','wmv','mid','avi','mpg','asf','rm','rmvb'), 'file'=>array('doc','docx','xls','xlsx','ppt','htm','html','txt','zip','rar','gz','bz2'), ); if(empty($ext_arr[$dir])){ echoCJSON::encode(array('error'=>1,'message'=>'目录名不正确。')); exit; } $originalurl=''; $filename=''; $date=date('Ymd'); $id=0; $max_size=2097152;//2MBs $upload_image=CUploadedFile::getInstanceByName('imgFile'); Yii::import('ext.KEditor.KEditor'); $upload_dir=KEditor::getUploadPath().'/'.$dir; if(!file_exists($upload_dir))mkdir($upload_dir); $upload_dir=$upload_dir.'/'.$date; if(!file_exists($upload_dir))mkdir($upload_dir); $upload_url=KEditor::getUploadUrl().'/'.$dir.'/'.$date; if(is_object($upload_image)&&get_class($upload_image)==='CUploadedFile'){ if($upload_image->size>$max_size){ echoCJSON::encode(array('error'=>1,'message'=>'上传文件大小超过限制。')); exit; } //新文件名 $filename=date("YmdHis").'_'.rand(10000,99999); $ext=$upload_image->extensionName; if(in_array($ext,$ext_arr[$dir])===false){ echoCJSON::encode(array('error'=>1,'message'=>"上传文件扩展名是不允许的扩展名。\n只允许".implode(',',$ext_arr[$dir]).'格式。')); exit; } $uploadfile=$upload_dir.'/'.$filename.'.'.$ext; $originalurl=$upload_url.'/'.$filename.'.'.$ext; $upload_image->saveAs($uploadfile); echoCJSON::encode(array('error'=>0,'url'=>$originalurl)); }else{ echoCJSON::encode(array('error'=>1,'message'=>'未知错误')); } } }
配置config/main.php文件,设置上传文件存放位置
'params'=>array( //thisisusedincontactpage 'adminEmail'=>'webmaster@example.com', 'uploadPath'=>'/upload',//添加这句,upload为存放文件文件夹的名字,自己定义,这里是放在根目录的upload文件夹
设置接收文件和浏览服务器文件的action
publicfunctionactions() { returnarray( //在actions下的returnarray添加下面两句,没有actions的话自己添加 'upload'=>array('class'=>'application.extensions.KEditor.KEditorUpload'), 'manageJson'=>array('class'=>'application.extensions.KEditor.KEditorManage'), ); }
在视图里面使用
<?php$this->widget('ext.KEditor.KEditor',array( 'model'=>$model,//传入formmodel 'name'=>'content',//设置name 'properties'=>array( //设置接收文件上传的action 'uploadJson'=>'/admin/default/upload', //设置浏览服务器文件的action,这两个就是上面配置在/admin/default的 'fileManagerJson'=>'/admin/default/manageJson', 'newlineTag'=>'br', 'allowFileManager'=>true, //传值前加js:来标记这些是js代码 'afterCreate'=>"js:function(){ K('#ChapterForm_all_len').val(this.count()); K('#ChapterForm_word_len').val(this.count('text')); }", 'afterChange'=>"js:function(){ K('#ChapterForm_all_len').val(this.count()); K('#ChapterForm_word_len').val(this.count('text')); }", ), 'textareaOptions'=>array( 'style'=>'width:98%;height:400px;', ) )); ?>
textareaOptions用来设置textarea的大小和样式,仅支持rows、cols和style
properties的各项跟js设置kindeditor的是一样的,上面的设置与下面用js设置的是一致,kindeditor原来有的项都可以设置
vareditor1=K.create('#editor_modelname_name',{ uploadJson:"/admin/default/upload", fileManagerJson:"/admin/default/manageJson", newlineTag:"br", allowFileManager:true, afterCreate:function(){ K('#ChapterForm_all_len').html(this.count()); K('#ChapterForm_word_len').html(this.count('text')); }, afterChange:function(){ K('#ChapterForm_all_len').html(this.count()); K('#ChapterForm_word_len').html(this.count('text')); } });
更多关于Yii相关内容感兴趣的读者可查看本站专题:《Yii框架入门及常用技巧总结》、《php优秀开发框架总结》、《smarty模板入门基础教程》、《php操作office文档技巧总结(包括word,excel,access,ppt)》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。