Welcome 微信登录

首页 / 网页编程 / PHP / YII视图整合kindeditor扩展的方法

本文实例讲述了YII视图整合kindeditor扩展的方法。分享给大家供大家参考,具体如下:
比较喜欢用kindeditor,YII上的版本比较旧,所以自己重新整了个扩展
先在protectedextensions下创建KEditor文件夹用来放文件,keSource里放kindeditor的源文件,然后建三个类KEditor、KEditorManage和KEditorUpload,KEditor是扩展的主文件,KEditorManage是用来浏览服务器文件的,KEditorUpload是用来示例接收上传文件的,
KEditor代码
<?phpclass KEditor extends CWidget{/* * TEXTAREA输入框的属性,保证js调用KE失败时,文本框的样式。 */public $textareaOptions=array();/* * 编辑器属性集。 */public $properties=array();/* * TEXTAREA输入框的name,必须设置。 * 数据类型:String */public $name;/* * TEXTAREA的id,可为空 */public $id;public $model;public $baseUrl;public static function getUploadPath(){$dir = dirname(__FILE__).DIRECTORY_SEPARATOR."keSource";if(isset(Yii::app()->params->uploadPath)){return Yii::getPathOfAlias("webroot").str_replace("/",DIRECTORY_SEPARATOR,Yii::app()->params->uploadPath);}return Yii::app()->getAssetmanager()->getPublishedPath($dir).DIRECTORY_SEPARATOR."upload";}public static function getUploadUrl(){$dir = dirname(__FILE__).DIRECTORY_SEPARATOR."keSource";if(isset(Yii::app()->params->uploadPath)){return Yii::app()->baseUrl.Yii::app()->params->uploadPath;}return Yii::app()->getAssetManager()->publish($dir)."/upload";}public function init(){if($this->name===null)throw new CException(Yii::t("zii","The id property cannot be empty."));$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");}public function run(){$cs=Yii::app()->getClientScript();$textAreaOptions=$this->gettextareaOptions();$textAreaOptions["name"]=CHtml::resolveName($this->model,$this->name);$this->id=$textAreaOptions["id"]=CHtml::getIdByName($textAreaOptions["name"]);echo CHtml::activeTextArea($this->model,$this->name,$textAreaOptions);$properties_string = CJavaScript::encode($this->getKeProperties());$js=<<<EOFKindEditor.ready(function(K) {var editor_$this->id = K.create("#$this->id",$properties_string);});EOF;$cs->registerScript("KE".$this->name,$js,CClientScript::POS_HEAD);}public function gettextareaOptions(){//允许获取的属性$allowParams=array("rows","cols","style");//准备返回的属性数组$params=array();foreach($allowParams as $key){if(isset($this->textareaOptions[$key]))$params[$key]=$this->textareaOptions[$key];}$params["name"]=$params["id"]=$this->name;return $params;}public function getKeProperties(){$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_key as $key){if(isset($this->properties[$key]))$params[$key]=$this->properties[$key];}return $params;}}
KEditorManage代码
<?phpclass KEditorManage extends CAction{public function run(){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 "Invalid Directory name.";exit;}if ($dir_name !== "") {$root_path .= $dir_name . "/";$root_url .= $dir_name . "/";if (!file_exists($root_path)) {mkdir($root_path);}}//根据path参数,设置各路径和URLif (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);}echo realpath($root_path);//排序形式,name or size or type$order = empty($_GET["order"]) ? "name" : strtolower($_GET["order"]);//不允许使用..移动到上一级目录if (preg_match("/../", $current_path)) {echo "Access is not allowed.";exit;}//最后一个字符不是/if (!preg_match("//$/", $current_path)) {echo "Parameter is not valid.";exit;}//目录不存在或不是目录if (!file_exists($current_path) || !is_dir($current_path)) {echo "Directory does not exist.";exit;}//遍历目录取得文件信息$file_list = array();$handle = new DirectoryIterator($current_path);$i=0;foreach($handle as $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-d H: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");echo CJSON::encode($result);exit;}//排序public function cmp_func($a, $b) {global $order;if ($a["is_dir"] && !$b["is_dir"]) {return -1;} else if (!$a["is_dir"] && $b["is_dir"]) {return 1;} else {if ($order == "size") {if ($a["filesize"] > $b["filesize"]) {return 1;} else if ($a["filesize"] < $b["filesize"]) {return -1;} else {return 0;}} else if ($order == "type") {return strcmp($a["filetype"], $b["filetype"]);} else {return strcmp($a["filename"], $b["filename"]);}}}}?>
KEditorUpload代码
<?phpclass KEditorUpload extends CAction{public function run(){$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])){echo CJSON::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){echo CJSON::encode(array("error"=>1,"message"=>"上传文件大小超过限制。"));exit;}//新文件名$filename=date("YmdHis")."_".rand(10000, 99999);$ext=$upload_image->extensionName;if(in_array($ext, $ext_arr[$dir]) === false){echo CJSON::encode(array("error"=>1,"message"=>"上传文件扩展名是不允许的扩展名。
只允许".implode(",",$ext_arr[$dir])."格式。"));exit;}$uploadfile=$upload_dir."/".$filename.".".$ext;$originalurl=$upload_url."/".$filename.".".$ext;$upload_image->saveAs($uploadfile);echo CJSON::encode(array("error"=>0,"url"=>$originalurl));}else{echo CJSON::encode(array("error"=>1,"message"=>"未知错误"));}}}
配置config/main.php文件,设置上传文件存放位置
"params"=>array(// this is used in contact page"adminEmail"=>"webmaster@example.com","uploadPath"=>"/upload", //添加这句,upload为存放文件文件夹的名字,自己定义,这里是放在根目录的upload文件夹
设置接收文件和浏览服务器文件的action
public function actions(){return array(//在actions下的return array添加下面两句,没有actions的话自己添加"upload"=>array("class"=>"application.extensions.KEditor.KEditorUpload"),"manageJson"=>array("class"=>"application.extensions.KEditor.KEditorManage"),);}
在视图里面使用
<?php $this->widget("ext.KEditor.KEditor",array("model"=>$model, //传入form model"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原来有的项都可以设置
var editor1 = 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程序设计有所帮助。