UEditor1.4.3-for-Yii1-扩展

这篇日志发布时间已经超过一年,许多内容可能已经失效,请读者酌情参考。


2015.2.2 update:

更新了一个版本,github地址:https://github.com/xbzbing/yii1-ueditor 。

新版本配置更为方便、直观,但与之前版本不兼容。

推荐更新,参考 [更新]UEditor1.4.3-for-Yii1-扩展


大概五月初UEditor升级了新版本,不过直到五月底我才知道这事,赶紧看了看新版本的Demo,发现做了好多改变。

从前端上看,我最讨厌的swfuploader终于消失了,取而代之的是百度团队开发的webuploader插件。虽然在低版本浏览器会自动切换成swf上传,但是我也没打算支持低版本,所以挺好~多了图片和附件文件在线查看还不错,这些新特性我都很喜欢,看来值得升级。

也得庆幸我是月底才知道,从正式发布1.4.0到月底发布了1.4.3,中间产生了无数bug,代码的结构也在不断的变化, 我看到的时候是1.4.2,开发的时候各种蛋疼,一天后就更新了1.4.3,百度前端团队还是很给力的。

较之1.3.x版本,前端除了上传组件外其余改变不大,而后端则是做了较大的调整,可以说是与之前完全不兼容。新版本的后端采用了统一后端入口,动态加载上传配置(即config接口,其实从上次的1.3.6的fetch方法就能看出来他们想这么做),并支持回调,可以说UEditor真的在朝着大而全的宇宙第一编辑器的目标去了。。。。。

总而言之,值得升级, 于是写成了新的UEditor1.4.3-for-Yii1-扩展。

github地址:https://github.com/xbzbing/yii1-ueditor

参考:http://www.crazydb.com/archive/百度编辑器UEditor的Yii扩展

ueditor1.4.3

一点说明

  • 支持上传图片自动生成缩略图,默认开启该功能,默认缩略图大小200×200。这里使用了ThinkPHP的图片处理类。生成的缩略图名字是「原图片.thumbnail.扩展名」的形式。在线图片管理部分仅显示缩略图,但是点击插入的时候插入原图。

  • 支持水印,默认关闭该功能。开启只要配置controller的watermark为水印图片的「相对路径」即可。缩略图不带水印。

  • 扩展中包含了UEditor的源码,在resources目录,使用Yii的asset机制来发布。因此不必单独引入UEditor的文件,扩展会自动处理路径关系。

  • 支持同一个页面多个UEditor实例,请在使用widget时配置name属性来指定生成的ueditor对象。

  • 当前使用的UEditor版本是1.4.3,支持的Yii版本的是1.1.14。「理论上」支持UEditor升级,可以直接把升级文件覆盖到resources目录。支持单独引入patch,配置widget的jsFiles属性即可。

使用方法

1、将ueditor放在项目的/protected/extensions/目录下。

2、在config.php中配置controllerMap,来指定ueditor的访问路径。

'controllerMap'=>array(
    'ueditor'=>array(
        'class'=>'ext.ueditor.UeditorController',
    ),
),

可选配置

'controllerMap'=>array(
    'ueditor'=>array(
        'class'=>'ext.ueditor.UeditorController',
        'config'=>array(),//参考config.json的配置,此处的配置具备最高优先级
        'thumbnail'=>true,//是否开启缩略图,默认为true
        'watermark'=>'',//水印图片的地址,使用相对路径
        'locate'=>9,//水印位置,1-9,默认为9在右下角
    ),
),

其中config配置优先使用main.php中的配置,没有配置的部分使用默认的default配置,最后使用ueditor的php/config.json文件中的配置。

3、在view中使用widget。 在原有的view中添加即可,注意id填写为原有的textarea的id。 注意,使用这个widget时,不要删除原有的代码,只要添加此处的代码即可。

$this->widget('ext.ueditor.UeditorWidget',
        array(
                'id'=>'Post_content',//页面中输入框(或其他初始化容器)的ID
                'name'=>'editor',//指定ueditor实例的名称,个页面有多个ueditor实例时使用
        )
);

如果同一个页面要使用多个UEditor,必须设置name参数来指定生成的ueditor对象的名称。

4、错误排查

  • 出现错误请查看上传目录的权限问题。

  • 默认上传到「应用」根目录(不是网站根目录)的upload/目录。

  • 不要开启Yii的调试,因为UEditor的返回都是json格式,开启调试会导致返回格式不识别。

  • 如果出现后端配置不正确的提示,请使用浏览器调试工具查看具体返回值,或者访问config响应地址,/ueditor/index?action=config,查看请求返回。一般出现这种情况有两种可能:1、开启了Yii调试,或者使用了yii-debug-toolbar之类的插件导致返回格式不识别。2、没有配置controllerMap。

  • 非常遗憾依然不支持Yii的CSRF防御机制,虽然Ueditor1.4+支持了「自定义请求参数」的功能(参考http://fex.baidu.com/ueditor/#server-server_param,非常好的功能,可以用于解决swf上传的身份维持功能,如果1.3.6中也有这个,就不用修改ueditor的文件了),但是该请求参数是通过GET方式提交,而Yii的CSRF是从POST/PUT/DELETE方法中获取,因此还是不能正常使用。如果有需求,请自行修改controller。

  • 出现 TypeError: 'null' is not an object (evaluating 'b.style') 等类似的错误,说明当前页面没有指定id的元素。这个widget只是注册JS,把原有的textarea表单变成UEditor编辑器,因此请不要删除原有的输入框。


github地址:https://github.com/xbzbing/yii1-ueditor


留言交流

cch
cch 2014-08-20 19:02 回复
你好,遇到了出现后端配置不正确的提示,怎么都解决不了,能加我qq 489285050吗?谢谢
疯狂的dabing
疯狂的dabing 2014-08-21 09:41 回复
回复 cch : question QQ聊过后原来是因为没有登录。。。因为使用场景多为后台编辑器,所以设置了登录后才能上传的限制。不过这样的话会一直显示后台加载失败,我对插件进行了修改,当请求为config时候,不需要身份验证。
逗逗
逗逗 2014-08-28 10:06 回复
本地正常,放到网上会出现 Asset文件 "__DIR__/resources" 不存在 错误
疯狂的dabing
疯狂的dabing 2014-08-28 10:46 回复
回复 逗逗 : 额,这个错误可能是__DIR__这个常量没有正常解析。__DIR__需要php5.3以上版本支持,请确认服务器版本号。如果低于php5.3请将__DIR__修改为dirname(__FILE__)。之前没有在意这个问题,随后会采用向下兼容的方式去写。
dddd
dddd 2014-08-28 14:07 回复
回复 疯狂的dabing : 改了以后不报异常,但编辑器不显示,本地可以的
疯狂的dabing
疯狂的dabing 2014-08-28 15:20 回复
回复 dddd : arrow 编辑器不显示前端有什么异常?打开调试工具看看。ueditor的js文件加载了吗?扩展使用了yii的assets管理资源文件,需要有应用根目录下的asset文件夹的写权限,检查下服务器的权限设置吧。
kkk
kkk 2014-09-02 21:55 回复
无法上传,提示 ' 后端配置项没有正常加载,上传插件不能正常使用 '。已经使用最新版本。 “我对插件进行了修改,当请求为config时候”,这个是什么意思? 另外UeditorController 中还有很多使用了 __DIR__
疯狂的dabing
疯狂的dabing 2014-09-04 00:40 回复
回复 kkk : 感谢提醒,已经对项目中所有的__DIR__进行了修改。同时也欢迎发现其他不兼容bug。UEditor在加载后,会发起类似http://www.crazydb.com/index.php?r=ueditor/index&action=config&noCache=1409761331872的请求,当这个请求相应内容不符合预期时,就会提示“后端没有正常加载”。因此你可以在打开页面的时候开启调试工具查看请求返回内容,或者get请求这个地址,查看返回内容进行调试。
vishun
vishun 2014-11-06 17:22 回复
上传中文名的附件时,会提示失败,只能上传英文名称的文档,应该在UeditorController.php中将'filePathFormat'最后面_{filename}去掉就可以上传中文的了。
疯狂的dabing
疯狂的dabing 2014-11-06 20:06 回复
回复 vishun : 1、中文附件无法上传问题应该与服务器环境有关,我本地与远程均可以正常上传。2、这个filePathFormat是UEditor的上传重命名规则,但是由于UEditor的后缀检测规则有问题(参考这个issue:https://github.com/fex-team/ueditor/issues/334),所以我在扩展中覆盖了默认配置。3、如果需要自定义配置,可以在controllerMap中增加配置config属性,指定一个保存规则。
vishun
vishun 2015-01-10 08:34 回复
回复 疯狂的dabing : 这个貌似是编辑器utf和gbk版本的问题,网上看到有人也提问解答。具体解决方法是在ueditor/resources/php/Uploader.class.php中upFile()方法中120行左右修改为: //移动文件 $saveFilePath=iconv("UTF-8", "GBK//IGNORE",$this->filePath);//修改,使上传中文名可以 if (!(move_uploaded_file($file["tmp_name"], $saveFilePath) && file_exists($saveFilePath))) { //移动失败
bao
bao 2014-11-23 11:21 回复
render的时候编辑器可以正常的渲染出来,但renderpartial的时候就不行了,这是为什么呢、亲
疯狂的dabing
疯狂的dabing 2014-11-24 16:15 回复
回复 bao : 这是因为扩展使用的是Yii的clientScript来注册JS,而Yii的renderPartial函数在渲染的时候不会输出CSS和JS,因此使用renderPatial的时候不会显示编辑器。如果要在这种情况下使用,可以把UeditorWidget中的注册文件相关部分,全部使用那个echo script/css标签的方式打印出来,你可以试试看。PS你还可以试着将layout设置为null,并使用render代替renderPartial,然后看看编辑器出来没有?
shunzi
shunzi 2014-12-25 12:51 回复
object has no method 'yiiactiveform' 出现这个错误 位置是jQuery('#yw0').yiiactiveform 这个是怎么回事呢提示没有yiiactiveform方法
疯狂的dabing
疯狂的dabing 2014-12-25 12:56 回复
回复 shunzi : arrow 这个错误应该跟扩展没有关系,你去掉扩展看看是否依然出错?再就是原有的textarea不能去掉,扩展只是注册JS并把原有的textarea变成UEditor编辑器。这真是个蛋疼的设定,原来是想减少工作量,直接插入不改原来的代码就能使用,看来下个版本得改成标准写法了。
shunzi
shunzi 2014-12-25 13:14 回复
每次提交都提示文章内容不存在 就是编辑器里面的 内容提交不上
chen
chen 2014-12-29 21:37 回复
后台要使用,但总提示需要登录,这要在哪设置呢?
疯狂的dabing
疯狂的dabing 2014-12-30 09:45 回复
回复 chen : 在UEditorCongroller的init()方法中,有注释你可以仔细看看。后台使用还需要登录权限说明你没有使用Yii的登录体系啊。。。
ivzhu
ivzhu 2015-02-02 15:00 回复
编辑器如何默认初始内容?
疯狂的dabing
疯狂的dabing 2015-02-02 15:28 回复
回复 ivzhu : widget使用的时候除了name和id,还要增加一个'options'=>'initialContent:"初始化内容"',具体配置参考http://fex-team.github.io/ueditor/#start-config 之前还给Yii2写了个扩展,发现Yii1扩展编写时候确实存在很多问题,今天会更新一个大版本,多谢关注。
sushangyu
sushangyu 2015-03-21 21:06 回复
能不能给一下在controller中怎么处理上传文件,或者给一个具体的demo可以吗,我是小白啊
疯狂的dabing
疯狂的dabing 2015-03-21 21:12 回复
回复 sushangyu : 上传文件是由扩展的controller做的,不需要人工干预,只需要在前端引入扩展即可。如果要修改上传控制,可以继承扩展的UEeditorController并作相应的修改,建议使用新的版本,参考地址:http://www.crazydb.com/archive/更新_UEditor1.4.3-for-Yii1-扩展
sushangyu
sushangyu 2015-03-23 21:45 回复
昨天上传文件还是正常的,今天,单文件上传出现errorHandler is not defined,多图上传显示后端配置项没有正常加载,上传插件不能正常使用,真心服了。我也没配置过什么啊。
sushangyu
sushangyu 2015-03-23 21:47 回复
有个疑问,就是把这个富文本的内容存到数据库后,取出时,怎么把图片的信息单独取出,放到指定的img标签呢,我真的很菜,希望没烦到你。
疯狂的dabing
疯狂的dabing 2015-03-23 21:51 回复
回复 sushangyu : 使用的是新版本吗?按照调试步骤来操作就可以了,你打开调试器,看看网络请求,单独请求下看看是什么错误,依次排查就好。从富文本中提取图片信息,这个跟扩展没有关系,使用正则提取img标签就行。
soso_liu
soso_liu 2016-06-01 11:12 回复
我的也是后端配置项未正常加载,就不能上传图片,然后我的“index.php/ueditor?action=config&&noCache=1464749894356”这个地址在浏览器调试里报404,想问一下是什么问题
点击换图