这几天做的一个项目中需要在所见即所得编辑器中实现图片上传的功能,我因为比较喜欢CKEditor的界面而选择了它。虽然有跟CKEditor配合良好的CKFinder,不过这个东东的功能太复杂,简单看了下CKEdtior的文档,发现这个功能还是可以自己实现而不用借助CKFinder的。

下面代码虽然基于Yii Framework的,但是用其他框架或者语言思路却是完全一样的,有需要的童鞋可以参考一下。

首先要让CkEditor出现图片上传的功能,需要配置编辑器的filebrowserImageUploadUrl属性:

1
2
3
4
5
CKEDITOR.replace( 'editor1',
    {
        filebrowserUploadUrl : '/uploader/upload.php',
        filebrowserImageUploadUrl : '/uploader/upload.php?type=Images'
    });

然后在对应的URL上实现图片上传的功能,并向CKEditor返回特定格式的HTML代码,CKEditor就能正常预览并插入图片了。
下面只截取控制器的部分代码,Controller部分我是这样实现的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
/**
 * 保存上传的图片
 *
 * @return string javascript code
 * @author lfyzjck
 **/
public function actionImg($type, $CKEditor, $CKEditorFuncNum, $langCode = 'zh-cn')
{
	if(empty($CKEditorFuncNum) || $type != 'Images'){
		$this->mkhtml($CKEditorFuncNum,'','错误的函数调用');
	}
	if(isset($_FILES['upload'])){
		//获取关于图片上传配置
		$options = Options::model()->findByPk(1);
		$form = new UploadForm('image',$options);
		$form->upload = CUploadedFile::getInstanceByName('upload');
		if($form->validate()){
		//文件名:时间+源文件名
			$target_filename = date('Ymd-hm',time()).$form->upload->getName();
			$path = Yii::app()->basePath.'/../uploads/'.$target_filename;			//图片保存路径
			$form->upload->saveAs($path);
			$this->mkhtml($CKEditorFuncNum,Yii::app()->baseUrl.'/uploads/'.$target_filename, "上传成功");
		}
		else{
			$this->mkhtml($CKEditorFuncNum,'',$form->getError('upload'));
		}
	}
}
/**
 * 返回CKEditor的提示信息
 *
 * @return void
 * @author lfyzjck
 **/
private function mkhtml($fn, $fileurl, $message) 
{
	$str = '<script type="text/javascript">window.parent.CKEDITOR.tools.callFunction('.$fn.', "'.$fileurl.'", \''.$message.'\')</script>';
	exit($str);
}

需要特别说明的mkhtml函数,他会调用CKEditor的函数产生提示信息。上传成功的时候将图片链接返回,CKEditor会根据URL生成图片预览。
继续阅读

发表在 PHPer 标签为 , , ,
  |  阅读(606次)

从日本的核爆炸说起

2011 年 3 月 17 日

人们抢购食盐

昨天傍晚上新浪微博,发现上面充斥关于食盐脱销的消息,事情发展到这一步,真的让人有点啼笑皆非。好在学校里一切如常,不知道会不会闹到炒菜做饭都没盐的底部。事情大概的发展经历是这样子的:

日本福岛核电站发生爆炸以后,大家就在热烈讨论着放射性微粒会不会随着大风或者海流影响到中国,万一有影响该如何防范的问题。据卫生部回应以及方舟子先生的建议

@方舟子:核尘埃若含放射性碘,人体吸入后富集在甲状腺,对甲状腺造成伤害。服用碘片可减少对放射性碘的吸收,保护甲状腺。在吸入放射性碘数小时前服用可起到100%保护作用。在吸入的同时服用也基本可保护。所以没必要提前服用。碘片剂量(100毫克)远远超出碘的每日限量(一天1.1毫克),没事不要乱吃。

对于这个说法我虽然无法驳斥,但我相信放射性微粒绝对不止有碘元素,阻断对碘的吸收到底对防辐射有多大帮助很难评估,不如躲在室内不要出来的实在。之后的一条短信才是将这次事件推向了高潮:

继续阅读

发表在 杂谈 标签为 ,
  |  阅读(116次)

原文地址:http://blogs.sitepoint.com/2011/02/05/ajax-data-formats-xml-soap-html/

当Jesse James Garrett发明了AJAX的时候,它本来的意思是“异步JavaScript和XML”(Asynchronous JavaScript and XML),本质上,你可以通过以下步骤实现:

  1. 创建一个Web Service,比如一个通过HTTP GET/POST方式传递参数后就能返回XML数据的PHP页面。
  2. 编写客户端JavaScript访问Web Service,即传递参数并取出返回的XML,因为请求是被异步的处理的缘故,浏览器在等待数据返回的过程中不会锁死。
  3. 解析XML并相应的更新HTML文档。

AJAX这个名字被很多开发人员滥用。今天,这个由大写字母构成的缩写已经进化成Ajax——任何在浏览器和服务器之间传输数据并且不需要整个页面刷新的技术代名词,原因如下:

  1. 异步方法并不是必须的(虽然大部分时候需要)
  2. 你不是必须使用Javascript
  3. 你当然也不一定需要XML

最终,不论你使用何种技术,你仍然必须在两个设备之间传输数据。这篇是这个系列文章的第一部分,谈论各种格式的优缺点。
继续阅读

发表在 杂谈 标签为 , , , , ,
  |  阅读(572次)

用了一个主题,不过因为是免费的,默认不支持Wordpress 3.0里面新加入的自定义菜单(custom menu),于是决定自己改造一番

如果你的主题不支持”自定义菜单“的话,进入外观->菜单设置会有不支持的提示,要让主题支持这个新功能,首先在functions.php里面加入以下代码:

1
2
3
4
5
< ?php
if ( function_exists( 'register_nav_menu' ) ) {
	register_nav_menu( 'pluginbuddy_mobile', 'PluginBuddy Mobile Navigation Menu' );
}
?>

第一个参数相当于一个slug,即唯一的一个ID,第二个参数是描述,然后在进入”菜单“设置就不会看到不支持的提示了,但要真正让这个功能可用,还要继续修改导航菜单的调用方式。
比如我的博客现在主题调用菜单的代码在header.php
继续阅读

发表在 PHPer 标签为 , ,
  |  阅读(332次)

2011-1-16 Update:增加了基于隐式唯一法的检测,可以解的数独更多,第二个数独还是没解出来啊。。。
2011-1-27 Update:完善算法,能够进行尝试,失败后自动回滚直到解除答案为止

好吧,我承认我无聊了,给自己不想自习找个借口,昨天看到Google Goggles能拍照解数独,很是诧异,忽然意识到这个极费脑力的游戏确实可以交给电脑去做,于是乎诞生了写一个解数独的算法。

目前的算法是基于逻辑推理法和穷举法结合的方法,先尝试用逻辑方法解题,无法解决的时候会尝试填一个数字,再使用逻辑方法,依次直到解出正确答案为止。这样有一个很明显的好处就是能够避免穷举,毕竟逻辑推理的方法效率要高很多。

逻辑推理方法实现的算法比较简单,只有比较常用的基于候选数的显式唯一法和隐式唯一法。每个待填的格子中所有可能填入的数称为候选数。

当某个单元格的候选数的个数只有一个的时候,这个格子的数就是确定的,这个就称为显式唯一法。在某一行所有待填格子的候选数的集合中,如果某个数字在所有数字中只出现了一次,那个这个数字的位置也是唯一确定的,因为这行的其他单元格都不可能填入这个数字,这个就叫隐式唯一法。大部分的简单数独问题都可以用这两种方法交替解决。

当用简单的逻辑法无法解决时,我们就保存当前数独的状态,然后从可能的候选数中抽出一个填入,再利用逻辑法解题,如果发生错误就回滚到上一个状态,并从候选数中删除该数字,继续尝试下一种可能,如果没有错误但题目仍然没有解决,就继续抽出一个可能的候选数填入,以此类推,直到解决题目为止。这个过程用一个堆栈实现。

继续阅读

发表在 Python 标签为 , ,
  |  阅读(793次)

难得把压在草稿箱的文章发出来,写博客真的太耗费时间了,压力好大。

实现国际化的方式比较多,很多php framework都内置i18n支持,但大部分是基于PHP的数组实现的,这种方法并不推荐。目前最为流行也最通用的方法是gettext。

Gettext 用于系统的国际化(I18N)和本地化(L10N),可以在编译程序的时候使用本国语言支持(Native Language Support(NLS)),其可以使程序的输出使用用户设置的语言而不是英文.

关于gettext的更多资料请参见:http://oss.org.cn/man/linux/lfs/htmlbook/appendixa/gettext.html

下面说说如何利用gettext在你的PHP程序中实现国际化。
继续阅读

发表在 PHPer 标签为 , , , ,
  |  阅读(705次)

对列表(list)进行排序

推荐的排序方式是使用内建的sort()方法,速度最快而且属于稳定排序

1
2
3
4
5
6
7
8
9
10
11
>>> a = [1,9,3,7,2,0,5]
>>> a.sort()
>>> print a
[0, 1, 2, 3, 5, 7, 9]
>>> a.sort(reverse=True)
>>> print a
[9, 7, 5, 3, 2, 1, 0]
>>> b = ['e','a','be','ad','dab','dbc']
>>> b.sort()
>>> print b
['a', 'ad', 'be', 'dab', 'dbc', 'e']

对列表的排序是遵循DSU(decorate-sort-undecorate)模式的,序列是安装条目的顺序进行比较的,对刚刚例子中的字符串来说,就是按照从左到右的顺序,逐个字符进行比较,一旦得出结果就停止比较。
继续阅读

发表在 Python 标签为 , , ,
  |  阅读(505次)
Page 2 of 912345...Last »