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 相关文章推荐
5.PHP的其他功能
Oct 09 PHP
php 用checkbox一次性删除多条记录的方法
Feb 23 PHP
二招解决php乱码问题
Mar 25 PHP
php数组去重复数据示例
Feb 25 PHP
php之Smarty模板使用方法示例详解
Jul 08 PHP
PHP验证信用卡卡号是否正确函数
May 27 PHP
如何把php5.3版本升级到php5.4或者php5.5
Jul 31 PHP
php实现Session存储到Redis
Nov 11 PHP
PHP可变函数学习小结
Nov 29 PHP
PHP常用技巧汇总
Mar 04 PHP
PHP 序列化和反序列化函数实例详解
Jul 18 PHP
PHP PDO数据库操作预处理与注意事项
Mar 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
PHP学习笔记 (1) 环境配置与代码调试
2011/06/19 PHP
PHP数组函数知识汇总
2016/05/12 PHP
php利用ffmpeg提取视频中音频与视频画面的方法详解
2017/06/07 PHP
PHP简单实现模拟登陆功能示例
2017/09/15 PHP
PHP数组式访问接口ArrayAccess用法分析
2017/12/28 PHP
thinkphp5.1 文件引入路径问题及注意事项
2018/06/13 PHP
javaScript 数值型和字符串型之间的转换
2009/07/25 Javascript
用Jquery实现多级下拉框无刷新的联动
2010/12/22 Javascript
表单JS弹出填写提示效果代码
2011/04/16 Javascript
JavaScript获得表单target属性的方法
2015/04/02 Javascript
浅谈JavaScript字符串与数组
2015/06/03 Javascript
JavaScript中的原始值和复杂值
2016/01/07 Javascript
js绘制购物车抛物线动画
2020/11/18 Javascript
Bootstrap框架实现广告轮播效果
2016/11/28 Javascript
Bootstrap栅格系统简单实现代码
2017/03/06 Javascript
jquery dataTable 获取某行数据
2017/05/05 jQuery
使用vue-router为每个路由配置各自的title
2018/07/30 Javascript
详解JavaScript作用域和作用域链
2019/03/19 Javascript
JavaScript实现轮播图特效
2020/04/10 Javascript
[02:16]完美世界DOTA2联赛PWL S3 集锦第三期
2020/12/21 DOTA
MAC中PyCharm设置python3解释器
2017/12/15 Python
python 非线性规划方式(scipy.optimize.minimize)
2020/02/11 Python
keras实现图像预处理并生成一个generator的案例
2020/06/17 Python
香港钟表珠宝首饰商城:OneMallTime网摩间
2016/10/14 全球购物
澳大利亚Rockwear官网:女子瑜伽、健身和运动服
2021/01/26 全球购物
测试工程师岗位职责
2013/11/28 职场文书
自我评价的范文
2014/02/02 职场文书
教师个人自我鉴定
2014/02/08 职场文书
数字化校园建设方案
2014/05/03 职场文书
电子信息工程专业求职信
2014/06/28 职场文书
国企干部对照检查材料
2014/08/22 职场文书
员工培训协议书
2014/09/15 职场文书
乐山大佛导游词
2015/02/02 职场文书
总账会计岗位职责
2015/04/02 职场文书
从事会计工作年限证明
2015/06/23 职场文书
JavaScript中的宏任务和微任务详情
2021/11/27 Javascript