YII视图整合kindeditor扩展的方法


Posted in PHP onJuly 13, 2016

本文实例讲述了YII视图整合kindeditor扩展的方法。分享给大家供大家参考,具体如下:

比较喜欢用kindeditor,YII上的版本比较旧,所以自己重新整了个扩展
先在protected\extensions下创建KEditor文件夹用来放文件,keSource里放kindeditor的源文件,然后建三个类KEditor、KEditorManage和KEditorUpload,KEditor是扩展的主文件,KEditorManage是用来浏览服务器文件的,KEditorUpload是用来示例接收上传文件的,

KEditor代码

<?php
class 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=<<<EOF
KindEditor.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代码

<?php
class 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参数,设置各路径和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);
    }
    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代码

<?php
class 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'=>"上传文件扩展名是不允许的扩展名。\n只允许".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框架的PHP程序设计有所帮助。

PHP 相关文章推荐
模拟OICQ的实现思路和核心程序(一)
Oct 09 PHP
PHP Header用于页面跳转要注意的几个问题总结
Oct 03 PHP
PHP中查询SQL Server或Sybase时TEXT字段被截断的解决方法
Mar 10 PHP
Zend的Registry机制的使用说明
May 02 PHP
解析PHP中的正则表达式以及模式匹配
Jun 19 PHP
修改destoon会员公司的伪静态中的com目录的方法
Aug 21 PHP
php简单实现快速排序的方法
Apr 04 PHP
thinkphp3.x自定义Action、Model及View的简单实现方法
May 19 PHP
php中实现进程锁与多进程的方法
Sep 18 PHP
解决php 处理 form 表单提交多个 name 属性值相同的 input 标签问题
May 11 PHP
详谈symfony window下的安装 安装时候出现的问题以及解决方法
Sep 28 PHP
php解决crontab定时任务不能写入文件问题的方法分析
Sep 16 PHP
Yii+upload实现AJAX上传图片的方法
Jul 13 #PHP
Yii安装与使用Excel扩展的方法
Jul 13 #PHP
Yii配置与使用memcached缓存的方法
Jul 13 #PHP
Yii使用smsto短信接口的函数demo示例
Jul 13 #PHP
PHP实现自动识别原编码并对字符串进行编码转换的方法
Jul 13 #PHP
PHP中类属性与类静态变量的访问方法示例
Jul 13 #PHP
ucenter中词语过滤原理分析
Jul 13 #PHP
You might like
是否存在第一台收音机的说法
2021/03/01 无线电
COM in PHP (winows only)
2006/10/09 PHP
PHP图片处理之使用imagecopyresampled函数实现图片缩放例子
2014/11/19 PHP
php生成图片缩略图的方法
2015/04/07 PHP
php实现判断访问来路是否为搜索引擎机器人的方法
2015/04/15 PHP
php框架知识点的整理和补充
2021/03/01 PHP
jQuery Ajax文件上传(php)
2009/06/16 Javascript
关于javascript DOM事件模型的两件事
2010/07/22 Javascript
JavaScript实现点击按钮切换网页背景色的方法
2015/10/17 Javascript
九种原生js动画效果
2015/11/11 Javascript
轻松学习jQuery插件EasyUI EasyUI创建菜单与按钮
2015/11/30 Javascript
JS给按钮添加跳转功能类似a标签
2017/05/30 Javascript
AngularJS 验证码60秒倒计时功能的实现
2017/06/05 Javascript
微信小程序动态添加分享数据
2017/06/14 Javascript
nodejs构建本地web测试服务器 如何解决访问静态资源问题
2017/07/14 NodeJs
基于VUE移动音乐WEBAPP跨域请求失败的解决方法
2018/01/16 Javascript
Material(包括Material Icon)在Angular2中的使用详解
2018/02/11 Javascript
Vue中v-for的数据分组实例
2018/03/07 Javascript
解决layui动态添加的元素click等事件触发不了的问题
2019/09/20 Javascript
javascript使用链接跨域下载图片
2019/11/01 Javascript
javascript实现文字跑马灯效果
2020/06/18 Javascript
JavaScript实现前端倒计时效果
2021/02/09 Javascript
Python操作SQLite数据库的方法详解【导入,创建,游标,增删改查等】
2017/07/11 Python
Python Learning 列表的更多操作及示例代码
2018/08/22 Python
使用Python实现租车计费系统的两种方法
2018/09/29 Python
python用post访问restful服务接口的方法
2018/12/07 Python
TENSORFLOW变量作用域(VARIABLE SCOPE)
2020/01/10 Python
Python爬虫实现百度翻译功能过程详解
2020/05/29 Python
matplotlib绘制鼠标的十字光标的实现(内置方式)
2021/01/06 Python
团组织关系介绍信
2014/01/12 职场文书
学历公证书范本
2014/04/09 职场文书
《称象》教学反思
2014/04/25 职场文书
节能环保演讲稿
2014/08/28 职场文书
高中生国庆节演讲稿范文2014
2014/09/21 职场文书
Vue接口封装的完整步骤记录
2021/05/14 Vue.js
nginx 配置指令之location使用详解
2022/05/25 Servers