PHPcms与百度编辑器UEditor深度结合

记忆力是严重衰退了,关于百度编辑器还有个地方没提,那就是把PHP文件夹里的config.json文件得拷贝出来。我是放在了根目录下,然后为了系统好管理,需要打开这个文件修改编辑器上传后的目录。

“imagePathFormat”:"/ueditor/php/upload/..."

改成了:

“imagePathFormat”:"upload/image/..."

关于这里还有个小细节,就是分三种文件夹需要改三个地方,分别为图片image、视频video、文件file,注意分开别漏了就好。剩下的就是系统的存储目录修改了,打开/phpcms/libs/classes/attachment.class.php文件,在47行左右做如下改动:

$this->savepath = $this->upload_root.$this->upload_dir.date('Y/m/d');
$this->savepath = 'uploadfile/image/'.$this->upload_dir.date('Y/m/d');

把109行注释掉,第118行做如下改动:

$uploadedfile = array('filename'=>$file['name'],'filepath‘=>$filepath,....
$uploadedfile = array('filename'=>$file['name'],'filepath‘=>$savefile,....

这个文件最后把区分用户上传和管理员上传的字段补上,在add方法里,208行和220行之间随便哪个地方加上一句:

$uploadedfile['isuser'] = $_SESSION['roleid'] ? 0 : 1;

在这里我是用1表示为是注册用户0表示为管理员,做完这些就用phpMyAdmin或者Navicat之类的工具,在数据库附件表里手工加上这个字段。

再接着就是改系统的表单类了,文件是在/phpcms/libs/classes/form.class.php,改的代码很多,直接替换editor方法,代码如下:

public static function editor($textareaid = 'content',$module = '', $catid = '', $allowbrowser = 1,$alowuploadexts = '',$disabled_page = 0, $allowuploadnum = '10',$setting) {
		$editor = $setting['editor'] ? $setting['editor'] : 'ueditor' ;
		$str ='';
		if($editor == 'ueditor'){
			if(!defined('EDITOR_INIT')) {
			$str = '<script type="text/javascript" src="'.JS_PATH.'ueditor.full.1.4.3.2/ueditor.config.js"></script>';
			$str .= '<script type="text/javascript" src="'.JS_PATH.'ueditor.full.1.4.3.2/ueditor.all.min.js"></script>';
			define('EDITOR_INIT', 1);
			}
			if($setting['toolbar'] == 'basic') {
				$admin = defined('IN_ADMIN') ? "'Source'," : '';
				$toolbar = ",toolbars:[[".$admin."'FullScreen', 'Undo', 'Redo','Bold','italic','underline','strikethrough','superscript','subscript','formatmatch','removeformat','justifyleft','justifyright','justifycenter','justifyjustify','pasteplain','date','selectall','forecolor','insertorderedlist','insertunorderedlist','fontsize']]";
			} elseif($setting['toolbar'] == 'full') {
				if(defined('IN_ADMIN')) {
					$admin = "'Source',";
				} else {
					$admin = '';
				}
				$toolbar = ", toolbars: [[
				'fullscreen', ".$admin." '|', 'undo', 'redo', '|',
				'bold', 'italic', 'underline', 'fontborder', 'strikethrough', 'superscript', 'subscript', 'removeformat', 'formatmatch', 'autotypeset', 'blockquote', 'pasteplain', '|', 'forecolor', 'backcolor', 'insertorderedlist', 'insertunorderedlist', 'selectall', 'cleardoc', '|',
				'rowspacingtop', 'rowspacingbottom', 'lineheight', '|',
				'customstyle', 'paragraph', 'fontfamily', 'fontsize', '|',
				'directionalityltr', 'directionalityrtl', 'indent', '|',
				'justifyleft', 'justifycenter', 'justifyright', 'justifyjustify', '|', 'touppercase', 'tolowercase', '|',
				'link', 'unlink', 'anchor', '|', 'imagenone', 'imageleft', 'imageright', 'imagecenter', '|',
				'simpleupload', 'insertimage', 'emotion', 'scrawl', 'insertvideo', 'music', 'attachment', 'map', 'gmap', 'insertframe', 'insertcode', 'webapp', 'pagebreak', 'template', 'background', '|',
				'horizontal', 'date', 'time', 'spechars', 'snapscreen', 'wordimage', '|',
				'inserttable', 'deletetable', 'insertparagraphbeforetable', 'insertrow', 'deleterow', 'insertcol', 'deletecol', 'mergecells', 'mergeright', 'mergedown', 'splittocells', 'splittorows', 'splittocols', 'charts', '|',
				'print', 'preview', 'searchreplace', 'help', 'drafts'
			]]";
			}
			$str .= "<script type=\"text/javascript\">\r\n";
			$str .= "UE.getEditor('$textareaid',{";
			$str .= "serverUrl: '".APP_PATH."index.php?m=attachment&c=ueditupload&a=upload'";
			if($setting['height']) $str .= ',initialFrameHeight:'.$setting['height'];
			$str .= $toolbar;
			$str .= '})';
			$str .= '</script>';
		}else if($editor == 'ckeditor'){
			if(!defined('EDITOR_INIT')) {
				$str = '<script type="text/javascript" src="'.JS_PATH.'ckeditor4.5.9/ckeditor.js"></script>';
				define('EDITOR_INIT', 1);
			}
			if($setting['toolbar'] == 'basic') {
				$toolbar = defined('IN_ADMIN') ? "['Source']," : '';
				$toolbar .= "['Bold', 'Italic', '-', 'NumberedList', 'BulletedList', '-', 'Link', 'Unlink' ],['Maximize'],\r\n";
			} elseif($setting['toolbar'] == 'full') {
				if(defined('IN_ADMIN')) {
					$toolbar = "['Source',";
				} else {
					$toolbar = '[';
				}
				$toolbar .= "'-','Templates'],
				['Cut','Copy','Paste','PasteText','PasteFromWord','-','Print'],
				['Undo','Redo','-','Find','Replace','-','SelectAll','RemoveFormat'],['ShowBlocks'],['Image','Capture','Flash','flashplayer','MyVideo'],['Maximize'],
				'/',
				['Bold','Italic','Underline','Strike','-'],
				['Subscript','Superscript','-'],
				['NumberedList','BulletedList','-','Outdent','Indent','Blockquote'],
				['JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock'],
				['Link','Unlink','Anchor'],
				['Table','HorizontalRule','Smiley','SpecialChar','PageBreak'],
				'/',
				['Styles','Format','Font','FontSize'],
				['TextColor','BGColor'],
				['attachment'],\r\n";
			} elseif($setting['toolbar'] == 'desc') {
				$toolbar = "['Bold', 'Italic', '-', 'NumberedList', 'BulletedList', '-', 'Link', 'Unlink', '-', 'Image', '-','Source'],['Maximize'],\r\n";
			} else {
				$toolbar = '';
			}
			$str .= "<script type=\"text/javascript\">\r\n";
			$str .= "CKEDITOR.replace( '$textareaid',{";
			$str .= "height:{$setting['height']},";
		
			$show_page = ($module == 'content' && !$disabled_page) ? 'true' : 'false';
			$str .="pages:$show_page,subtitle:$show_page,textareaid:'".$textareaid."',module:'".$module."',catid:'".$catid."',\r\n";
			if($setting['allowupload']) {
				$authkey = upload_key("$allowuploadnum,$alowuploadexts,$allowbrowser");
				$str .="flashupload:true,alowuploadexts:'".$alowuploadexts."',allowbrowser:'".$allowbrowser."',allowuploadnum:'".$allowuploadnum."',authkey:'".$authkey."',\r\n";
			}
			if($setting['allowupload']) $str .= "filebrowserUploadUrl : 'index.php?m=attachment&c=attachments&a=upload&module=".$module."&catid=".$catid."&dosubmit=1',\r\n";
			if($color) {
				$str .= "extraPlugins : 'uicolor',uiColor: '$color',";
			}
			$str .= "toolbar :\r\n";
			$str .= "[\r\n";
			$str .= $toolbar;
			$str .= "]\r\n";
			$str .= "});\r\n";
			$str .= '</script>';
			$ext_str = "<div class='editor_bottom'>";
			if(!defined('IMAGES_INIT')) {
				$ext_str .= '<script type="text/javascript" src="'.JS_PATH.'swfupload/swf2ckeditor.js"></script>';
				define('IMAGES_INIT', 1);
			}
			$ext_str .= "<div id='page_title_div'>
			<table cellpadding='0' cellspacing='1' border='0'><tr><td class='title'>".L('subtitle')."<span id='msg_page_title_value'></span></td><td>
			<a class='close' href='javascript:;' onclick='javascript:$(\"#page_title_div\").hide();'><span>×</span></a></td>
			<tr><td colspan='2'><input name='page_title_value' id='page_title_value' class='input-text' value='' size='30'>&nbsp;<input type='button' class='button' value='".L('submit')."' onclick=insert_page_title(\"$textareaid\",1)></td></tr>
			</table></div>";
			$ext_str .= "</div>";
			if(is_ie()) $ext_str .= "<div style='display:none'><OBJECT id='PC_Capture' classid='clsid:021E8C6F-52D4-42F2-9B36-BCFBAD3A0DE4'><PARAM NAME='_Version' VALUE='0'><PARAM NAME='_ExtentX' VALUE='0'><PARAM NAME='_ExtentY' VALUE='0'><PARAM NAME='_StockProps' VALUE='0'></OBJECT></div>";
			$str .= $ext_str;
		}
		
		
		return $str;
	}

最后一步了,在模型管理里字段编辑时添加上编辑器选择项,文件在/phpcms/modules/content/fields/editor/目录下面,一共有field_add_form.inc.php、field_edit_form.inc.php、form.inc.php三个文件,头两个文件在第二行加入:

<tr> 
      <td width="100">编辑器选择:</td>
      <td><input type="radio" name="setting[editor]" value="ueditor" checked> 百度编辑器 <input type="radio" name="setting[editor]" value="ckeditor"> CK编辑器 </td>
</tr>

第三个文件在第6行后加入:

$setting = string2array($setting);

把倒数第二行的return内容改成如下:

return "<div id='{$field}_tip'></div>".'<textarea name="info['.$field.']" id="'.$field.'" boxid="'.$field.'">'.$value.'</textarea>'.form::editor($field,'content',$this->catid,1,'',$disabled_page,$allowuploadnum,$setting);

好了,至此大功告成,百度编辑器就算完美的和PHPcms结合了,整个过程步骤很多,需要细心调整,这样的结果是还可以往里面添加各类的编辑器,在管理员后台随时的更换。回顾整个过程最麻烦的主要在修改上传设置方面,为了和系统统一改了太多东西,如果不需要这功能的情况下,那就只要改form表单类和content目录下的字段设置文件这两地方就可以实现自由切换编辑器了。

PHPcms添加UEditor百度编辑器

其实对于修改百度编辑器的文章,在网路上一搜一大把,在没有深入读PHPcms代码的时候也照着这些文章改过,但来来去去这些文章都仿佛是一个人写的,连截图都是一模一样,这也是现在网络文章的一大现状,搜到很多的资料都是一样的。重要的是改得并不彻底,存在很多问题,基本上都仅仅只是解决了文字编辑而已。

去年的时候在基于PHPcms的框架上深入的DIY了一个网站,应该可以说是很完美的把两者结合了吧,系统可以在管理员的后台自由的切换管理员使用的编辑器和用户使用的编辑器,在UEditor和原本CKEditor之间方便的切换,依照这个方式也可以继续添加更多的编辑器,在你愿意的情况下。另外根据百度编辑器的上传功能,完善了附件的功能,使之每个用户只能看到自己上传的图片或者文件。当然,这在单一用户的网站上是毫无意义的。所以,我是为了记录下这个流程而已,免得下次再来又要研究一下,而各位就挑着看吧。

我下载的版本是ueditor.full.1.4.3.2,下载地址是http://ueditor.baidu.com/build/build_down.php?n=ueditor&v=1_4_3_2-src,现在最新版本已经是http://ueditor.baidu.com/build/build_down.php?n=ueditor&v=1_4_3_3-utf8-php,各位也可以试试最新版,我没对比过,相信应该变动不大。

下载之后解压放在./statics/js/下,系统的JS扩展包都在这里了;另外把config.json文件放在网站的根目录下,这个文件标注的是上传浏览之类动作后台的具体操作动作。

首先修改它的URL地址,打开ueditor.config.js文件,添加一句:

var URL = window.UEDITOR_HOME_URL || getUEBasePath();

在window.UEDITOR_CONFIG里添加一句:

UEDITOR_HOME_URL: URL

再接着修改上传后台接收地址:

serverUrl: '?m=attachment&c=ueditupload&a=upload'

注:attachment是系统附件管理的模块,ueditupload和upload都是我自建的,各位可以按照自己的喜好来

然后当然是在./phpcms/modules/attachment/目录下建立ueditupload.php文件了,代码如下:

<?
defined('IN_PHPCMS') or exit('No permission resources.'); 
$session_storage = 'session_'.pc_base::load_config('system','session_storage');
pc_base::load_sys_class($session_storage);


class ueditupload {
    private $userid,$isuser,$isadmin;
    function __construct(){
        $this->userid = $_SESSION['userid'] ? $_SESSION['userid'] : (param::get_cookie('_userid') ? param::get_cookie('_userid') : sys_auth($_POST['userid_flash'],'DECODE'));
        $this->isuser = $_SESSION['roleid'] ? 0 : 1;
        $this->isadmin =  $_SESSION['roleid'] ? 1 : 0;
        $this->att_db = pc_base::load_model('attachment_model');
    }
    private function updata($fileinfo){
        if($fileinfo['state'] == 'SUCCESS'){
            $data['module'] = 'content';
            $data['catid'] = 0;
            $data['filename'] = $fileinfo['original'];
            $data['filepath'] = $fileinfo['url'];
            $data['filesize'] = $fileinfo['size'];
            $data['fileext'] = substr($fileinfo['type'],1);
            $data['isimage'] = in_array($fileinfo['type'],array(".png", ".jpg", ".jpeg", ".gif", ".bmp")) ? 1 : 0;
            $data['isthumb'] = 0;
            $data['downloads'] = 0;
            $data['userid'] = $this->userid;
            $data['uploadtime'] = time();
            $data['uploadip'] = ip();
            $data['status'] = 0;
            $data['authcode'] = md5($fileinfo['url']);
            $data['siteid'] = 1;
            $data['isuser'] = $this->isuser;
            $this->att_db->insert($data);
        }
    }

    public function upload(){
        error_reporting(E_ERROR);
        header("Content-Type: text/html; charset=utf-8");
        $CONFIG = json_decode(preg_replace("/\/\*[\s\S]+?\*\//", "", file_get_contents("config.json")), true);
        $action = htmlspecialchars($_GET['action']);
        $base64 = 'upload';
        $uploader = pc_base::load_app_class('uploader');
        
        switch ($action) {
            case 'config':
                $result =  json_encode($CONFIG);
                break;
            /* 上传图片 */
            case 'uploadimage':
                $config = array(
                    "pathFormat" => $CONFIG['imagePathFormat'],
                    "maxSize" => $CONFIG['imageMaxSize'],
                    "allowFiles" => $CONFIG['imageAllowFiles']
                );
                $fieldName = $CONFIG['imageFieldName'];
                $uploader->upload($fieldName, $config, $base64);
                $result = json_encode($uploader->getFileInfo());
                $this -> updata($uploader->getFileInfo());
                break;
            /* 上传涂鸦 */
            case 'uploadscrawl':
                $config = array(
                    "pathFormat" => $CONFIG['scrawlPathFormat'],
                    "maxSize" => $CONFIG['scrawlMaxSize'],
                    "allowFiles" => $CONFIG['scrawlAllowFiles'],
                    "oriName" => "scrawl.png"
                );
                $fieldName = $CONFIG['scrawlFieldName'];
                $base64 = "base64";
                $uploader->upload($fieldName, $config, $base64);
                $result = json_encode($uploader->getFileInfo());
                $this -> updata($uploader->getFileInfo());
                break;
            /* 上传视频 */
            case 'uploadvideo':
                $config = array(
                    "pathFormat" => $CONFIG['videoPathFormat'],
                    "maxSize" => $CONFIG['videoMaxSize'],
                    "allowFiles" => $CONFIG['videoAllowFiles']
                );
                $fieldName = $CONFIG['videoFieldName'];
                $uploader->upload($fieldName, $config, $base64);
                $result = json_encode($uploader->getFileInfo());
                $this -> updata($uploader->getFileInfo());
                break;
            /* 上传文件 */
            case 'uploadfile':
                $config = array(
                    "pathFormat" => $CONFIG['filePathFormat'],
                    "maxSize" => $CONFIG['fileMaxSize'],
                    "allowFiles" => $CONFIG['fileAllowFiles']
                );
                $fieldName = $CONFIG['fileFieldName'];
                $uploader->upload($fieldName, $config, $base64);
                $result = json_encode($uploader->getFileInfo());
                $this -> updata($uploader->getFileInfo());
                break;

            /* 列出图片 */
            case 'listimage':
                $pagesize = isset($_GET['size']) ? htmlspecialchars($_GET['size']) : 20;
                $startpage = isset($_GET['start']) ? intval(htmlspecialchars($_GET['start'])) / $pagesize + 1 : 0;
                if($this->isadmin == 1){
                    //如果是管理员
                    $countwhere = 'isimage = 1';
                    $listwhere = 'isimage = 1';             
                }else{
                    $countwhere = 'isimage = 1 AND isuser = 1 AND userid = '.$this->userid;
                    $listwhere = 'isimage = 1 AND isuser = 1 AND userid = '.$this->userid;
                }
                $count = $this->att_db->count($countwhere);
                $row = $this->att_db->listinfo($listwhere,'uploadtime DESC',$startpage,$pagesize);
                $list = array();
                foreach($row as $key => $val){
                    $list[$key]['url'] = APP_PATH.$row[$key]['filepath'];
                    $list[$key]['mtime'] = $row[$key]['uploadtime'];
                }
                $result = json_encode(array(
                    "state" => "SUCCESS",
                    "list" => $list,
                    "start" => $_GET['start'] == 0 ? 0 : $pagesize * ($startpage - 1),
                    "total" => $count
                ));
                break;
            /* 列出文件 */
            case 'listfile':
                $pagesize = isset($_GET['size']) ? htmlspecialchars($_GET['size']) : 20;
                $startpage = isset($_GET['start']) ? intval(htmlspecialchars($_GET['start'])) / $pagesize + 1 : 0;
                if($this->isadmin == 1){
                    //如果是管理员
                    $countwhere = 'isimage = 1';
                    $listwhere = 'isimage = 1';             
                }else{
                    $countwhere = 'isimage = 0 AND isuser = 1 AND userid = '.$this->userid;
                    $listwhere = 'isimage = 0 AND isuser = 1 AND userid = '.$this->userid;
                }
                $count = $this->att_db->count($countwhere);
                $row = $this->att_db->listinfo($listwhere,'uploadtime DESC',$startpage,$pagesize);
                $list = array();
                foreach($row as $key => $val){
                    $list[$key]['url'] = $row[$key]['filepath'];
                    $list[$key]['mtime'] = $row[$key]['uploadtime'];
                }
                $result = json_encode(array(
                    "state" => "SUCCESS",
                    "list" => $list,
                    "start" => $_GET['start'] == 0 ? 0 : $pagesize * ($startpage - 1),
                    "total" => $count
                ));
                break;

            /* 抓取远程文件 */
            case 'catchimage':
                $config = array(
                    "pathFormat" => $CONFIG['catcherPathFormat'],
                    "maxSize" => $CONFIG['catcherMaxSize'],
                    "allowFiles" => $CONFIG['catcherAllowFiles'],
                    "oriName" => "remote_".time().".png"
                );
                $fieldName = $CONFIG['catcherFieldName'];
                /* 抓取远程图片 */
                $list = array();
                if (isset($_POST[$fieldName])) {
                    $source = $_POST[$fieldName];
                } else {
                    $source = $_GET[$fieldName];
                }
                foreach ($source as $imgUrl) {
                    $uploader->upload($imgUrl, $config, 'remote');
                    $info = $uploader->getFileInfo();
                    $this -> updata($uploader->getFileInfo());
                    array_push($list, array(
                        "state" => $info["state"],
                        "url" => APP_PATH.$info["url"],
                        "size" => $info["size"],
                        "title" => htmlspecialchars($info["title"]),
                        "original" => htmlspecialchars($info["original"]),
                        "source" => htmlspecialchars($imgUrl)
                    ));
                }
                /* 返回抓取数据 */
                $result = json_encode(array(
                    'state'=> count($list) ? 'SUCCESS':'ERROR',
                    'list'=> $list
                ));
                break;
            default:
                $result = json_encode(array(
                    'state'=> '请求地址出错'
                ));
                break;
        }       
        /* 输出结果 */
        if (isset($_GET["callback"])) {
            if (preg_match("/^[\w_]+$/", $_GET["callback"])) {
                echo htmlspecialchars($_GET["callback"]) . '(' . $result . ')';
            } else {
                echo json_encode(array(
                    'state'=> 'callback参数不合法'
                ));
            }
        } else {
            echo $result;
        }
        //print_r($_POST);
    }
}
?>

晕,貌似提示说字数超出最大值了,只好分篇了吧,在完成上述的步骤后,上传已经分用户存入数据库了,获取也会按照会员分别列出。