Yii添加富文本编辑器

来源:互联网 发布:怎么打开淘宝网址链接 编辑:程序博客网 时间:2024/05/13 09:52
本文转载自[打开链接](http://blog.csdn.net/u012063507/article/details/56840072)

1. 下载Ueditor (http://ueditor.baidu.com/website/)

2. 解压后,放到新建的widget/ueditor目录下;

3. 可以看到ueditor下新建了Ueditor.php文件,作为widget的运行程序:

<?php/** * YiifCMS Ueditor Widget * * @author        Sim <326196998@qq.com> * @copyright     Copyright (c) 2007-2013 bagesoft. All rights reserved. * @link          http://www.yiifcms.com * @package       YiiCMS.Widget * @license       http://www.yiifcms.com/license * @version       v1.0.0 * @example       $this->widget('application.widget.ueditor.Ueditor', *                      array('htmlOptions'=> *                            array( *                              'id'=>'Post_content',//页面中输入框(或其他初始化容器)的ID *                              'name'=>'editor',//指定ueditor实例的名称,个页面有多个ueditor实例时使用 *                            'config'=> array( *                                'initialFrameHeight'=>'400', *                                'initialFrameWidth'=>'80%',             *                            ), *                         ) *                   ) *                   ); */class Ueditor extends CInputWidget{    public $language = 'zh-cn';    /**     * 获取资源文件路径     *     * @return [type] [description]     */    public function getAssetsPath() {        $baseDir = dirname( __FILE__ );        return Yii::app()->getAssetManager()->publish( $baseDir.DIRECTORY_SEPARATOR.'assets' );    }    /**     * 生成编辑器     *     * @return [type] [description]     */    public function makeOptions() {                $id = $this->htmlOptions['id'];        $name = $this->htmlOptions['name'];        $config = $this->htmlOptions['config'];        $systemDefault = $this->combineParams( $config );        $script = "            var {$name} = UE.getEditor('&quot;.$id."',                 {                    'serverUrl': '".Yii::app()->createUrl('/admin/ueditor')."',                                        $systemDefault                }            );";        return $script;    }    /**     * 组合参数     *     * @param [type]  $items [description]     * @return [type]        [description]     */    protected function combineParams( $items ) {        $script = '';        foreach ( (array)$items as $key => $item ) {            if ( is_array( $item ) ) {                if ( self::_checkType( $item ) == 'arr' ) {                    $script .= $dot .self::_arr( $key, $item );                }else {                    $script .= $dot .self::_obj($key, $item);                }            } else {                $script .=  $dot ."'$key':'$item' ";            }            $dot = ",\n";        }        return $script;    }    /**     * 检测类型     */    protected function _checkType( $var ) {        if ( gettype( $var ) == 'array' )            return 'arr';        else            return 'obj';    }    /**     * 对象     */    protected function _obj( $key, $item) {        $script .=  $dot ."'$key':{";        $subDot = '';        foreach ( $item as $keys=>$value ) {                        $arrkeys = array_keys($value);            foreach($arrkeys as $row){                $script .= $subDot. "'$row':'{$value[$row]}'";            }            $subDot = ",";        }        $script .="}";        return $script;    }    /**     * 数组     */    protected function _arr( $key, $item ) {        $script .=  $dot ."'$key':[";        $subDot = '';        foreach ( $item as $value ) {            $script .= $subDot. "'$value' ";            $subDot = ",";        }        $script .="]";        return $script;    }    /**     * 运行     */    public function run() {        parent::run();                $assets = $this->getAssetsPath();                    $clientScript = Yii::app()->getClientScript();            $clientScript-&gt;registerScriptFile( $assets.'/ueditor.config.js', CClientScript::POS_END );                $clientScript-&gt;registerScriptFile( $assets.'/ueditor.all.min.js', CClientScript::POS_END );        $clientScript-&gt;registerScriptFile( $assets.'/lang/'.$this-&gt;language.'/'.$this->language.'.js', CClientScript::POS_END );        $clientScript-&gt;registerScript( 'content', $this->makeOptions(), CClientScript::POS_END );    }}?>

4. 增加extensions/ueditor, 目录结构如下:


UeditorUploader.class.php文件:

<?php/** * Created by JetBrains PhpStorm. * User: taoqili * Date: 12-7-18 * Time: 上午11: 32 * UEditor编辑器通用上传类 */class UeditorUploader{    private $fileField; //文件域名    private $file; //文件上传对象    private $base64; //文件上传对象    private $config; //配置信息    private $oriName; //原始文件名    private $fileName; //新文件名    private $fullName; //完整文件名,即从当前配置目录开始的URL    private $filePath; //完整文件名,即从当前配置目录开始的URL    private $fileSize; //文件大小    private $fileType; //文件类型    private $stateInfo; //上传状态信息,    private $stateMap = array( //上传状态映射表,国际化用户需考虑此处数据的国际化        "SUCCESS", //上传成功标记,在UEditor中内不可改变,否则flash判断会出错        "文件大小超出 upload_max_filesize 限制",        "文件大小超出 MAX_FILE_SIZE 限制",        "文件未被完整上传",        "没有文件被上传",        "上传文件为空",        "ERROR_TMP_FILE" => "临时文件错误",        "ERROR_TMP_FILE_NOT_FOUND" => "找不到临时文件",        "ERROR_SIZE_EXCEED" => "文件大小超出网站限制",        "ERROR_TYPE_NOT_ALLOWED" => "文件类型不允许",        "ERROR_CREATE_DIR" => "目录创建失败",        "ERROR_DIR_NOT_WRITEABLE" => "目录没有写权限",        "ERROR_FILE_MOVE" => "文件保存时出错",        "ERROR_FILE_NOT_FOUND" => "找不到上传文件",        "ERROR_WRITE_CONTENT" => "写入文件内容错误",        "ERROR_UNKNOWN" => "未知错误",        "ERROR_DEAD_LINK" => "链接不可用",        "ERROR_HTTP_LINK" => "链接不是http链接",        "ERROR_HTTP_CONTENTTYPE" => "链接contentType不正确"    );    /**     * 构造函数     * @param string $fileField 表单名称     * @param array $config 配置项     * @param bool $base64 是否解析base64编码,可省略。若开启,则$fileField代表的是base64编码的字符串表单名     */    public function __construct($fileField, $config, $type = "upload")    {        $this-&gt;fileField = $fileField;        $this-&gt;config = $config;        $this-&gt;type = $type;        if ($type == "remote") {            $this->saveRemote();        } else if($type == "base64") {            $this->upBase64();        } else {            $this->upFile();        }        $this-&gt;stateMap['ERROR_TYPE_NOT_ALLOWED'] = iconv('unicode', 'utf-8', $this->stateMap['ERROR_TYPE_NOT_ALLOWED']);    }    /**     * 上传文件的主处理方法     * @return mixed     */    private function upFile()    {        $file = $this->file = $_FILES[$this->fileField];        if (!$file) {            $this-&gt;stateInfo = $this->getStateInfo("ERROR_FILE_NOT_FOUND");            return;        }        if ($this->file['error']) {            $this-&gt;stateInfo = $this->getStateInfo($file['error']);            return;        } else if (!file_exists($file['tmp_name'])) {            $this-&gt;stateInfo = $this->getStateInfo("ERROR_TMP_FILE_NOT_FOUND");            return;        } else if (!is_uploaded_file($file['tmp_name'])) {            $this-&gt;stateInfo = $this->getStateInfo("ERROR_TMPFILE");            return;        }        $this-&gt;oriName = $file['name'];        $this-&gt;fileSize = $file['size'];        $this-&gt;fileType = $this->getFileExt();        $this-&gt;fullName = $this->getFullName();        $this-&gt;filePath = $this->getFilePath();        $this-&gt;fileName = $this->getFileName();        $dirname = dirname($this->filePath);        //检查文件大小是否超出限制        if (!$this->checkSize()) {            $this-&gt;stateInfo = $this->getStateInfo("ERROR_SIZE_EXCEED");            return;        }        //检查是否不允许的文件格式        if (!$this->checkType()) {            $this-&gt;stateInfo = $this->getStateInfo("ERROR_TYPE_NOT_ALLOWED");            return;        }        //创建目录失败        if (!file_exists($dirname) &amp;&amp; !mkdir($dirname, 0777, true)) {            $this-&gt;stateInfo = $this->getStateInfo("ERROR_CREATE_DIR");            return;        } else if (!is_writeable($dirname)) {            $this-&gt;stateInfo = $this->getStateInfo("ERROR_DIR_NOT_WRITEABLE");            return;        }        //移动文件        if (!(move_uploaded_file($file[&quot;tmp_name&quot;], $this->filePath) && file_exists($this->filePath))) { //移动失败            $this-&gt;stateInfo = $this->getStateInfo("ERROR_FILE_MOVE");        } else { //移动成功            $this-&gt;stateInfo = $this->stateMap[0];        }    }    /**     * 处理base64编码的图片上传     * @return mixed     */    private function upBase64()    {        $base64Data = $_POST[$this->fileField];        $img = base64_decode($base64Data);        $this-&gt;oriName = $this->config['oriName'];        $this-&gt;fileSize = strlen($img);        $this-&gt;fileType = $this->getFileExt();        $this-&gt;fullName = $this->getFullName();        $this-&gt;filePath = $this->getFilePath();        $this-&gt;fileName = $this->getFileName();        $dirname = dirname($this->filePath);        //检查文件大小是否超出限制        if (!$this->checkSize()) {            $this-&gt;stateInfo = $this->getStateInfo("ERROR_SIZE_EXCEED");            return;        }        //创建目录失败        if (!file_exists($dirname) &amp;&amp; !mkdir($dirname, 0777, true)) {            $this-&gt;stateInfo = $this->getStateInfo("ERROR_CREATE_DIR");            return;        } else if (!is_writeable($dirname)) {            $this-&gt;stateInfo = $this->getStateInfo("ERROR_DIR_NOT_WRITEABLE");            return;        }        //移动文件        if (!(file_put_contents($this-&gt;filePath, $img) && file_exists($this->filePath))) { //移动失败            $this-&gt;stateInfo = $this->getStateInfo("ERROR_WRITE_CONTENT");        } else { //移动成功            $this-&gt;stateInfo = $this->stateMap[0];        }    }    /**     * 拉取远程图片     * @return mixed     */    private function saveRemote()    {        $imgUrl = htmlspecialchars($this->fileField);        $imgUrl = str_replace(&quot;&amp;&quot;, &quot;&amp;&quot;, $imgUrl);        //http开头验证        if (strpos($imgUrl, "http") !== 0) {            $this-&gt;stateInfo = $this->getStateInfo("ERROR_HTTP_LINK");            return;        }        //获取请求头并检测死链        $heads = get_headers($imgUrl);        if (!(stristr($heads[0], &quot;200&quot;) &amp;&amp; stristr($heads[0], "OK"))) {            $this-&gt;stateInfo = $this->getStateInfo("ERROR_DEAD_LINK");            return;        }        //格式验证(扩展名验证和Content-Type验证)        $fileType = strtolower(strrchr($imgUrl, '.'));        if (!in_array($fileType, $this->config['allowFiles']) || stristr($heads['Content-Type'], "image")) {            $this-&gt;stateInfo = $this->getStateInfo("ERROR_HTTP_CONTENTTYPE");            return;        }        //打开输出缓冲区并获取远程图片        ob_start();        $context = stream_context_create(            array('http' => array(                'follow_location' => false // don't follow redirects            ))        );        readfile($imgUrl, false, $context);        $img = ob_get_contents();        ob_end_clean();        preg_match("/[\/]([^\/]*)[\.]?[^\.\/]*$/&quot;, $imgUrl, $m);        $this-&gt;oriName = $m ? $m[1]:"";        $this-&gt;fileSize = strlen($img);        $this-&gt;fileType = $this->getFileExt();        $this-&gt;fullName = $this->getFullName();        $this-&gt;filePath = $this->getFilePath();        $this-&gt;fileName = $this->getFileName();        $dirname = dirname($this->filePath);        //检查文件大小是否超出限制        if (!$this->checkSize()) {            $this-&gt;stateInfo = $this->getStateInfo("ERROR_SIZE_EXCEED");            return;        }        //创建目录失败        if (!file_exists($dirname) &amp;&amp; !mkdir($dirname, 0777, true)) {            $this-&gt;stateInfo = $this->getStateInfo("ERROR_CREATE_DIR");            return;        } else if (!Helper::is_writeable($dirname)) {            $this-&gt;stateInfo = $this->getStateInfo("ERROR_DIR_NOT_WRITEABLE");            return;        }        //移动文件        if (!(file_put_contents($this-&gt;filePath, $img) && file_exists($this->filePath))) { //移动失败            $this-&gt;stateInfo = $this->getStateInfo("ERROR_WRITE_CONTENT");        } else { //移动成功            $this-&gt;stateInfo = $this->stateMap[0];        }    }    /**     * 上传错误检查     * @param $errCode     * @return string     */    private function getStateInfo($errCode)    {        return !$this-&gt;stateMap[$errCode] ? $this-&gt;stateMap[&quot;ERROR_UNKNOWN&quot;] : $this->stateMap[$errCode];    }    /**     * 获取文件扩展名     * @return string     */    private function getFileExt()    {        return strtolower(strrchr($this->oriName, '.'));    }    /**     * 重命名文件     * @return string     */    private function getFullName()    {        //替换日期事件        $t = time();        $d = explode('-', date("Y-y-m-d-H-i-s"));        $format = $this->config["pathFormat"];        $format = str_replace(&quot;{yyyy}&quot;, $d[0], $format);        $format = str_replace(&quot;{yy}&quot;, $d[1], $format);        $format = str_replace(&quot;{mm}&quot;, $d[2], $format);        $format = str_replace(&quot;{dd}&quot;, $d[3], $format);        $format = str_replace(&quot;{hh}&quot;, $d[4], $format);        $format = str_replace(&quot;{ii}&quot;, $d[5], $format);        $format = str_replace(&quot;{ss}&quot;, $d[6], $format);        $format = str_replace(&quot;{time}&quot;, $t, $format);        //过滤文件名的非法自负,并替换文件名        $oriName = substr($this->oriName, 0, strrpos($this->oriName, '.'));        $oriName = preg_replace(&quot;/[\|\?\&amp;amp;amp;amp;amp;amp;quot;\&amp;amp;amp;amp;amp;amp;lt;\&amp;amp;amp;amp;amp;amp;gt;\/\*\\\\]+/&quot;, '', $oriName);        $format = str_replace(&quot;{filename}&quot;, $oriName, $format);        //替换随机字符串        $randNum = rand(1, 10000000000) . rand(1, 10000000000);        if (preg_match("/\{rand\:([\d]*)\}/i", $format, $matches)) {            $format = preg_replace(&quot;/\{rand\:[\d]*\}/i&quot;, substr($randNum, 0, $matches[1]), $format);        }        $ext = $this->getFileExt();        return $format . $ext;    }    /**     * 获取文件名     * @return string     */    private function getFileName () {        return substr($this-&gt;filePath, strrpos($this->filePath, '/') + 1);    }    /**     * 获取文件完整路径     * @return string     */    private function getFilePath()    {        $fullname = $this->fullName;        $rootPath = $_SERVER['DOCUMENT_ROOT'];        if (substr($fullname, 0, 1) != '/') {            $fullname = '/' . $fullname;        }        return $rootPath . $fullname;    }    /**     * 文件类型检测     * @return bool     */    private function checkType()    {        return in_array($this-&gt;getFileExt(), $this->config["allowFiles"]);    }    /**     * 文件大小检测     * @return bool     */    private function  checkSize()    {        return $this-&gt;fileSize &lt;= ($this->config["maxSize"]);    }    /**     * 获取当前上传成功文件的各项信息     * @return array     */    public function getFileInfo()    {        return array(            "state" => $this->stateInfo,            "url" => $this->fullName,            "title" => $this->fileName,            "original" => $this->oriName,            "type" => $this->fileType,            "size" => $this->fileSize        );    }}
  然后在模板页调用,

 <?php                        $this->widget('ext.ueditor.Ueditor',                                array(                                    'getId'=>'UpHoleInfos_solutions', //输入框的ID号                                    'UEDITOR_HOME_URL'=>"/",                                    'options'=>'toolbars:[["fontfamily","fontsize","forecolor","bold","italic","strikethrough","|",                    "insertunorderedlist","insertorderedlist","blockquote","|",                    "link","unlink","highlightcode","|","undo","redo","source"]],                                        wordCount:false,                                        elementPathEnabled:false,                                        imagePath:"/attachment/ueditor/",                                        ',                                ));                    ?>



其中options的toolbars属性设置工具栏上的功能和下拉框,该属性在editor_config.js文件中中可以查看:


若采用如下代码,则默认会展示全部的富文本编辑属性:

<?php        $this->widget('application.widget.ueditor.Ueditor',                 array(
         ‘getId’=>'UpHoleInfos_solutions',          'htmlOptions'=>                      array(                                'name'=>'editor',//指定ueditor实例的名称,个页面有多个ueditor实例时使用                               'config'=> array(                                 'initialFrameHeight'=>'400',                                 'initialFrameWidth'=>'80%',                                         ),                          )                    )          );    ?>
0 0
原创粉丝点击