wordpress插件开发

在线文档:

http://codex.wordpress.org/zh-cn:%E5%87%BD%E6%95%B0%E5%8F%82%E8%80%83

http://phpdoc.wordpress.org/trunk/

开发插件 http://codex.wordpress.org/zh-cn:%E5%BC%80%E5%8F%91%E4%B8%80%E4%B8%AA%E6%8F%92%E4%BB%B6

怎样在admin中添加菜单 http://codex.wordpress.org/Adding_Administration_Menus

 

admin管理中添加脚本和样式表资源:http://codex.wordpress.org/Plugin_API/Action_Reference/admin_enqueue_scripts

plugins_url的调用需要注意场合,应该在hook方法中调用,否则得不到值。

遇到的headers already sent问题:

插件在本地运行的好好的,发送到网站上启用后报:这个插件在启用的过程中产生了xx 个字符的异常输出。插件是可以运行的,但是退出admin时就一大堆headers already sent(xxxx 第xx行),连xmlrpc也不能用了。删除插件就没这个问题。

我在网上查,发现php utf-8 bom这个问题。

php utf-8的 BOM 问题解决  http://blog.csdn.net/ok7758521ok/article/details/1756052

我就以为是这个问题,但是用unicode 16进制查看却没有发现bom头。

后来才发现eclipse utf-8格式本身就是不带bom头的。 http://stackoverflow.com/questions/2905582/working-with-utf-8-files-in-eclipse

Both bug 78455 ("Provide an option to force writing a BOM to UTF-8 files") and bug 136854 don't leave much hope for such an option.

The support for encoding in the workspace is based on what is available from Java.
For any given resource in the workspace, it is possible to obtain a charset string that can be used with any Java APIs that take charset strings.
Examples are:

  • 'US-ASCII',
  • 'UTF-8',
  • 'Cp1252',
  • 'UTF-16' (Big Endian, BOM inserted automatically),
  • 'UTF-16BE' (Big Endian, BOM not inserted automatically),
  • 'UTF-16LE' (Little Endian, BOM not inserted automatically).

For Java encodings, except for the 'UTF-16' encoding, BOMs are not inserted (when writing) or discarded (when reading) for free.
Even if this is puzzling to end users, this is how all Java applications work.
If applications want to support creating UTF-8 files with BOMs to match their users' expectations, they need to provide such capability on their own (as neither Java nor the Resources model will help with that).
Eclipse does provide some improvements towards detecting BOMs, but not with generating or skipping them.

真是冤大头,我还用notepad++的格式/转为utf-8 wihout BOM转换了一下,确实不是这个原因。

最后发现那个报错已经说明了是哪一行,那一行是个php code之外的空白,把空白删除了就可以了!

再查查wordpress plugin资料,原来插件主文件代码里是要注意空白的。如果在展示上有空白,建议写在另外的php文件中在require进来。

http://codex.wordpress.org/WordPress_Coding_Standards

Remove Trailing Spaces

Important: Make sure you remove trailing whitespace after closing PHP tags.

Also remove trailing spaces at the end of each line of code.

 

在wp-setting.php中32 行设置默认时区 date_default_timezone_set( 'PRC' );

Continue reading wordpress插件开发

YUI Compressor使用

一般来说,js脚本混淆是吃力不讨好的事。没有真正的混淆,做得再好的工具混淆后,仍然可以被反推理。

花在混淆上面的功夫相对于脚本本来的价值很可能是不划算的。

但是,混淆一下起码还是有些作用的。

使用混淆最担心的是造成脚本错误。

我尝试用了YUI Compressor http://developer.yahoo.com/yui/compressor/,觉得还不错。

首先,它的混淆还是比较安全的:

The YUI Compressor is JavaScript minifier designed to be 100% safe and yield a higher compression ratio than most other tools.

in the face of evil features such as eval or with, the YUI Compressor takes a defensive approach by not obfuscating any of the scopes containing the evil statemen。对于eval和with采取保护措施。

在yui-yuicompressor-6e2bc23中的reademe中,我发现:

+ Supports wildcards for specifying multiple input files.

但是实际使用确是不支持通配符和多文件的,一次只能处理一个文件。

这样导致要处理多个文件要么写bat脚本,要么写ant文件。但是仍不能多个合并到一个。

这两个方法真丑!ant支持文档也找不到!

它不是java写的吗?我还是自己写代码来条用它得了!

下面是对源码中Bootstrap类的使用,添加功能不难吧!

public static void main(String args[]) throws Exception
	{
		ClassLoader loader = new JarClassLoader();
		Thread.currentThread().setContextClassLoader(loader);
		Class c = loader.loadClass(YUICompressor.class.getName());
		Method main = c.getMethod("main", new Class[] { String[].class });
		String srcpath = "E/html";
		String despath = "E:/dest/all.js";
		// main.invoke(null, new Object[]{new String[]{"-v","-o",path + "\all.js","--type","js",path + "\xxx.js"}});

		String[] jss = { "a.js", "b.js" }; //note the order
		File[] dess = new File[jss.length];

		for (int i = 0; i < jss.length; i++)
		{
			File tmpFile = File.createTempFile("yuicp", null);
			tmpFile.deleteOnExit();
			main.invoke(null,
						new Object[] { new String[] { "-v", "-o", tmpFile.getAbsolutePath(), "--type", "js", srcpath + "/" + jss[i] } });			
			dess[i] = tmpFile;
		}

		FileOutputStream out = new FileOutputStream(despath);
		for (int i = 0; i < dess.length; i++)
		{
			FileInputStream in = null;
			try
			{
				in = new FileInputStream(dess[i]);
				copyLarge(in, out);
			}
			finally{
				if (in != null){
					in.close();
				}
			}
		}
		
		out.close();
		// main.invoke(null, new Object[]{args});
	}

	public static long copyLarge(InputStream input, OutputStream output) throws IOException
	{
		byte[] buffer = new byte[1024*4];
		long count = 0;
		int n = 0;
		while (-1 != (n = input.read(buffer)))
		{
			output.write(buffer, 0, n);
			count += n;
		}
		return count;
	}

 

尝试了一下,还不错,压缩了50%以上。而且没有错误!

注意,合并的所有文件最好都是未压缩的,否则合并后可能出现错误。

后来发现了eclipse插件http://marketplace.eclipse.org/content/yuicompressor

其实这个插件在我的myeclipse里面存在n年了,今天才注意!

Continue reading YUI Compressor使用

web下载,弹出框,乱码等问题

对于一个下载链接,要想浏览器弹出保存对话框而不是直接打开文件,需要再返回头中设置Content-disposition说明。

以java servlet代码为例:

resp.setContentType( "application/octet-stream;");
resp.setHeader( "Content-disposition","attachment;filename="+ URLEncoder.encode(f.getName(),"utf-8"));

这两句让浏览器认识到附件是一个二进制流,只管下载。即使是txt文件也是如此。

因此对于一个a tag将其href指向这样的下载链接的话,浏览器会弹出保存对话框,页面也不会跳到空白页。也就是不需要指定target=”_blank”的。

对于乱码问题,需要设置文件名的编码。但是对于有空格和中文的文件名来说,弹出框显示的文件名各浏览器并不相同:

FF:完全是utf-8编码后的形式,看不出原文件名。

IE:中文可显示,但是空格还是以+号显示。

chrome:同IE。

 

参见:

Content-disposition说明以及中文乱码http://hi.baidu.com/_javaf/blog/item/93ae0710715e9d1ab9127b94.html

Continue reading web下载,弹出框,乱码等问题

关于jvm参数

Java HotSpot VM参数类别
  • 以-X开头的参数是非标准的(不保证在所有的VM实现里都支持),并且在后续的JDK版本发布中修改后不作通告。
  • 以-XX开头的参数是不稳定的,并且它也不推荐,只是临时使用。这些参数同样在修改后不作通告。
一些有用的-XX参数

这些参数的默认值在不同的平台上可能会有不同的值。不同平台的不同默认值列在描述里。

  • Boolean参数可以通过-XX:+<option>进行开启(true),通过-XX:-<option>进行关闭(false)
  • Numeric参数可以通过-XX:<option>=<number>进行设置数据可以包含'm'或'M'来表示兆,'k'或'K'表示千字节。'g'或'G'表示千兆。(例如, 32k等于32768)。
  • String参数可以通过-XX:<option>=<string>进行设置, 它通常用来指文件,路径或一些命令的列表。

详见:http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html

Continue reading 关于jvm参数

javascript 时间操作

  • 时间相加减:

var dt = new Date();

dt.setMonth(dt.getMonth() - 1); //减一个月

dt.setMonth(dt.getMonth() + 1); //加一个月

如果恰好是第一月即dt.getMonth()=0;那么dt.setMonth(dt.getMonth() - 1) = dt.setMonth(- 1),这时dt会变为上一年最后一个月,也是保证了减一个月的逻辑。

同理适用于加法dt.setMinutes(60);这样dt是下一个小时了。

其他依此类推……

  • 判断最近的整点:

往前最近的分钟:

var dt = new Date();

dt.setUTCSeconds(0);

dt.setUTCMillSeconds(0);

往后最近的分钟(包括本身如果就是整点分钟):

dt.setUTCSeconds(dt.getUTCSeconds() + 59);

dt.setUTCMilliseconds(0);
dt.setUTCSeconds(0);

其他依此类推……

Continue reading javascript 时间操作

wordpress问题

将网站上的wordpress安装到本机,数据库在wp-config.php中配好了,但是访问主页一直报500 internal错误。看apahe日志,

[Wed Nov 23 20:53:42 2011] [warn] [client 127.0.0.1] mod_fcgid: read timeout from pipe
[Wed Nov 23 20:53:42 2011] [error] [client 127.0.0.1] Premature end of script headers: index.php

在网上查,没有对症的。

以我的经验很可能是数据库连接问题,于是另写个页面专门连数据库,成功了!这就让人郁闷了。

没办法,打开define('WP_DEBUG', true);只好一行行用echo定位了,最后发现确实是数据库问题。在load.php中require_wp_db函数,定位到wp-db.php::db_connect函数。

mysql_connect这一句有问题。晕,我不是专门测试了吗?

经过比照,就只host一个用127.0.0.1可以,而用localhost就不行!

问题在这!但是我使用jdbc使用localhost是可以的啊?

查看host文件,果然localhost没有配置,映射localhost 127.0.0.1后,再测试就可以了。

仍然不懂为什么jdbc可以自动找到localhost而php需要通过dns配置才行?

这个问题解决后,数据库需要修改wp_options表,将siteurl和home设置成本机url。

打开Mod_Rewrite模块,因为wordpress使用到了这个模块,所以要在apache http.conf中将LoadModule rewrite_module modules/mod_rewrite.so前面的注释去掉来启用此模块。另外需要为文件夹配置打开.htcaccess配置。如:

<Directory "xxxx/public_html">   
    AddHandler fcgid-script .php 
    FcgidWrapper "xxxx/php-cgi.exe" .php
    Options execCGI FollowSymLinks
    AllowOverride All
    Order allow,deny
    Allow from all   
</Directory>

注意蓝字部分配置。

wordpress根目录下的.htcaccess文件直接拷贝过来就行了。

到这一步,本机的wordpress环境基本可用了!

至于.htcaccess中的php.ini配置什么的,是虚拟主机具体环境需要的,这是wordpress安装时自动生成的??反正对本机环境运行wordpress没什么问题。

参见:

http://www.leapsoul.cn/?p=25  Apache Mod_Rewrite实现URL重写的配置方法

http://hi.baidu.com/%D1%F8%C0%CF%D4%BA%B3%A4/blog/item/6fb6764fd0533ff4d72afcd8.html  suPHP - 以属主身份来运行php

但是访问本机wordpress比访问站点还慢!这是怎么回事?关了xdebug也是一样!后来发现是wp-utf8-excerpt这个插件比较慢,关了就好了。

另外xdebug也是性能因素的很重要的个原因,打开xdebug会慢一倍以上,但是不打开又不好看调试信息。

有的环境下会出现admin中样式乱套,发现是load-styles.php这个样式加载有问题,换个php版本试试看,例如5.3.3就可以解决这个问题。

 

将最后编辑时间显示在文章上,需要在single.php和index.php中添加如下代码:

<?php 
$u_time = get_the_time('U');
$u_modified_time = get_the_modified_time('U');
if ($u_modified_time >= $u_time + 86400) {
echo "and last modified on ";
the_modified_time('F jS, Y');
echo " at ";
the_modified_time();
echo ", "; } 
?>

 

无法使用wlw发布私有文章。MS宣称还没提供这种功能也没有提供插件的方式。

 

Continue reading wordpress问题

raphael 介绍

对于无插件web chart,不久前还是头疼的事情,大部分解决方案是flash,包括extjs3。当前extjs4出来了,发现它是封装了vml和svg。虽然extjs4是基于沙箱的,可以和extjs3合用,但是我试过了,那性能是惨不忍睹。

我看到jquery的chart插件flot http://code.google.com/p/flot/, 但是它是使用canvas的,对于ie使用excanvas来包装,但是在我的ie浏览器中就报错了。

让我们看看raphael,它是封装了vml和svg,而且,extjs4的chart也是基于它的!所以,完全可以使用raphael来画图!

文档: http://raphaeljs.com/reference.html

它的接口是按照svg来设计的,所以会参考到 w3c svg文档 http://www.w3.org/TR/SVG/painting.html

首先创建一个raphael对象:

var r = Raphael('holder', 500, 300);

上面的代码在页面的holder元素下创建了一个Paper对象。

下面画一条线: Paper.path

r.path('M0,0,L200,200');

这里画了一个斜线,从画布原点,也就是左上角向坐标200,200处画线。其中的M表示将画笔起点移动到,L表示向某处画线。这是svg的语法,可参见: http://www.w3.org/TR/SVG/paths.html#PathData

上面的代码返回的是Element对象。

然后我们来为这条线添加颜色:Element.attr

r.path('M0,0,L200,200').attr({stroke:'red','stroke-width':'5px'});

使用attr方法将画笔属性设置成红色和5像素宽。

效果如图:

Snap1

我们再画个三角形:

r.path('M{0},{1},L{2},{3}L{4},{5}Z',0,100,50,150,0,200).attr({fill:'blue'});

注意到,使用path的另外的形式,使用大括号中的参数来生成语句。其中的索引分别对应后面的参数位置。更多的格式见Raphael.format。另外我们指定了三个顶点,最后一个Z表示将此路径封闭。然后我们使用蓝色来填充这个封闭的三角形。

Snap2

我们再来写上文本:

r.text(100,90,'Hello!').attr({stroke:'black','stroke-width':'2px',fill:'green','font-size':'90px'});

在上面的代码中,我们在100,90坐标处,写上了hello的文本。它是用2px黑色外框,绿色填充,90px大小的字体来绘制的。

Snap3

完整的代码是:

html代码:

><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>test.html</title> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="this is my page"> <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"> <!--<link rel="stylesheet" type="text/css" href="./styles.css">--> <script type="text/javascript" src="raphael.js"></script>

Continue reading raphael 介绍

【转】ExtJS 4.0 的改变--较为完整的介绍。

因为有过删帖的经验,还是转过来吧! 原文:http://andy-ghg.iteye.com/blog/1133456

惯例,看之前先看看我的很久很久以前的学习笔记(就是那个Word文档,没兴趣的可以不看,不影响):
http://wenku.baidu.com/view/ce8d3e08763231126edb1146.html
本文里面不会详细介绍某些方法函数具体如何使用,例子全部自己写的(部分参考API和ExtJS 4.0 Developer Preview),应该不会有错,提到的方法函数只提供名字,自己去API看(在此严重鄙视一些照搬API就出本书捞钱的人)
基础上的变化:
兼容性
ExtJS4最终会提供一个兼容ExtJS 3的解决方案。
沙箱模式
可是使用alias来为组件添加别名,类似以前的Ext.reg,不过alias会用不同的类别区分开来,例如,widget.xxxxx和feature.xxxxx是不一样的,虽然它们都是用alias来定义的,但是类别完全不同。
包和命名空间的改变
现在的ExtJS不再使用混乱的分包机制(其实以前的感觉更加直白),例如以前的Window,包名是Ext.Window,但是现在则是 Ext.window.Window,Ext.window包下还包括了Ext.window.MessageBox等。SplitButton则是 Ext.button.Split。
创建新的对象
现在ExtJS使用Ext.define函数来创建组件类,该函数还能实现自动加载JS类(uses属性,需设置Ext.Loader为开启详见下文,看不懂看API),它会自动的完成以前的ns(namespace)功能。例如下面

Js代码

  1. Ext.ns("Foo.bar"); 
  2. Foo.bar = Ext.extend(Ext.util.Observable,{ 
  3. //your code here
  4. }); 
  5. Ext.reg("foobar",Foo.bar); 

所以现在创建一个组件应该是这样的:

Js代码

  1. Ext.define("Foo.bar",{ 
  2.         extend : "xxxxxx", 
  3.         alias : "widget.foobar"
  4.        //your code here
  5. }); 

现在ExtJS不再使用new关键字(当然你想用也没关系),而是推荐使用Ext.create函数来解决这个问题,例如以往我们创建一个组件的代码是

Js代码

  1. var win = new Ext.Window({ 
  2. //some options
  3. }); 

而现在则是

Js代码

  1. var win = Ext.create("Ext.window.Window",{ 
  2. //some options
  3. }); 

新的类加载方法--Class Loading
现在ExtJS可以动态加载JS文件(类)了,新的Ext.Loader类和一些其它的方法可以完成分别加载所需的JS文件,例如Ext.Loader里的setPath、require等方法函数可以做到动态加载。
如果要使用这个功能,你首先得启用它:

Js代码

  1. Ext.Loader.setConfig({ 
  2.       enabled: true, 
  3.       paths: { 
  4. 'My': 'my_own_path'
  5.       } 
  6. }); 

path的意思是,当前引用这个JS的HTML文件同级的my_own_path目录被命名为My,所以以后该目录下的所有类名为My.xxxx的类都能被动态加载。
例如以下文件目录:
d副本
在定义的时候就是:

Js代码

  1. Ext.Loader.setConfig({ 
  2.       enabled: true, 
  3.       paths: { 
  4. 'NS': 'app'
  5.       } 
  6. }); 

app/person文件夹中的类名为LKPerson的定义代码为:

Js代码

  1. Ext.define("NS.person.LKPerson", { 
  2.     extend : "Ext.panel.Panel", 
  3.         alias : "widget.lkperson",//当然,这个属性不是必须的
  4.     border : false, 
  5.         initComponent : function(){ 
  6. this.callParent(arguments);//这个arguments你懂,不懂Google
  7.         } 
  8. }) 

注意一点的就是,NS.person.LKPerson中的LKPerson就是文件名称(换句话说文件名必须是LKPerson且必须在person目录下)
好了,下面看看动态加载的两种方式:
require的用法如下:

Js代码

  1. Ext.require("Foo.bar"); 
  2. Ext.define("AA.bb.CC",{ 
  3. //some options
  4. }); 

require的意思是:在这个类(AA.bb.CC)被加载之前必须要加载Foo.bar并且被实例化(虽然好用但是劝各位不要滥用)。
uses的用法如下:

Js代码

  1. Ext.define("AA.bb.CC",{ 
  2.         uses:["Foo.bar"] 
  3. }); 

uses的意思是:在这个类(AA.bb.CC)在运行过程中要用到Foo.bar这个类,用到的时候再加载。
其它的就不多解释,具体看API(这句话我最后说一遍
混入类
将一个类混入到另外一个类中,创建的时候一同创建:

Js代码

  1. Ext.define("Dog",{ 
  2.     sayHello : function(){ 
  3.         alert("AAAA") 
  4.     } 
  5. }) 
  6. Ext.define("Animal",{ 
  7.     mixins:{ 
  8.         dog:"Dog"
  9.     } 
  10. }); 
  11. Ext.onReady(function(){ 
  12. var an = Ext.create("Animal"); 
  13.     an.mixins.dog.sayHello(); 
  14. }) 

静态方法
现在所有的类(是所有的ExtJS类,Ext.define定义的)都提供静态方法,可以很方便的定义:

Js代码

  1. Ext.define('Computer', { 
  2.      statics: { 
  3.          factory: function(brand) { 
  4. // 'this' in static methods refer to the class itself
  5. return new this(brand); 
  6.          } 
  7.      }, 
  8.      constructor: function() { ... } 
  9. }); 
  10. var dellComputer = Computer.factory('Dell'); 

Config
这个东西很时髦,看看用法:

Js代码

  1. Ext.define("Foo",{ 
  2.     config: { 
  3.         title: 'Default Title'
  4.     }, 
  5.     constructor: function(cfg) { 
  6. this.initConfig(cfg); 
  7.     } 
  8. }); 
  9. Ext.onReady(function(){ 
  10. var an = Ext.create("Foo",{ 
  11.         title:"My Title"
  12.     }); 
  13.     console.log(an.getTitle()); 
  14. }); 

运行以下看看会出现什么?是My Title,config会自动生成getter和setter还有apply方法。
Ext.env.Browser
这个东西很好很强大。。。。记得以前有Ext.isIE、Ext.isFF等方法判断浏览器,这次ExtJS 4不仅保留了以前的函数,还提供了更为强大Ext.env包来干这些事情,这个包下面还有其它两个类:
Ext.env.OS,顾名思义判断操作系统的,印象中ExtJS3中好像也有,不过这次新增了一些操作系统(主要是移动领域的操作系统)。

Js代码

  1. if (Ext.os.is.Windows) { 
  2. // Windows specific code here
  3. if (Ext.os.is.iOS) { 
  4. // iPad, iPod, iPhone, etc.

Ext.env.FeatureDetector,这个绝对是新加的,主要用于判断HTML5和CSS3的,例如

  • CSS3/动画/转换
  • Canvas/ SVG/ VML
  • 触摸屏是否可用/方向
  • 地理位置(HTML5的东西相信不陌生吧?)
  • SqlDatabase
  • WebSockets
  • History
  • 音频
  • 视频

Lang包的修改
不知道lang是什么意思?(想想java.lang.String和java.lang.Number吧)
现在ExtJS 4一直在为新的ECMAScript标准做准备,这就是为什么要有这个包存在的原因,新的ECMAScript标准大家可以在ActionScript3 中详细看看,AS3基本上是遵循了下一代ECMAScript标准的,例如数据类型String、Number、Array、uint等等,ExtJS 4为了能与下一代的ECMAScript标准兼容,提前提供了这些东西的JS实现。
Ext.Function
这个东西不知道大家平时用不用(也许大家用了没察觉到),我是经常用的。例如在以往的ExtJS版本中的代码:

Js代码

  1. function foo(){ 
  2. //这里
  3. }.createDelegate(scope,arguments); 

现在变成了(这里使用了一个综合的例子,大家可以重点看看bind的用法):

Js代码

  1. Ext.define("Foo",{ 
  2.     config:{ 
  3.         bar:"I don't need sex,the government fucks me every day!"
  4.     }, 
  5.     constructor : function(cfg){ 
  6. this.initConfig(cfg); 
  7.     } 
  8. }); 
  9. function fun(str){ 
  10. if(str){ 
  11.         alert(str); 
  12. return; 
  13.     } 
  14.     alert(this.getBar()); 
  15. Ext.onReady(function(){ 
  16. var foo = Ext.create("Foo"); 
  17.     Ext.bind(fun,foo)();//后面的括号你懂
  18. //如果要传递参数可以以数组的形式放入,例如这样:
  19. //Ext.bind(fun,foo,["私はセックスを必要としない、政府は毎日私をファック!"])();
  20. }); 

好了,我承认我有点那啥,不过希望不影响你继续读下去的兴趣。
相同的还有
ExtJS 3中的

Js代码

  1. myFunction.defer(1000, scope); 

变成了4中的

Js代码

  1. Ext.defer(myFunction, 1000, scope); 

还有callBack变成了pass,其它的自己去发掘。
ExtJS的工具,
就是它: 

使用工具来编译你的JS,别想歪了,我知道JS是解释性的,详细的先看看这篇文章关于JSBuilder的作用:
http://hi.baidu.com/mallor/blog/item/5aec22f3e3dcbadc0b46e074.html
ExtJS的senchaSDKtools里面还提供了theme的制作(命令行的??!!!),如果嫌ExtJS审美疲劳了可以试试这个。没玩过,所以不多解释,这里就告诉大家有这么回事儿就行了。
关于大家最关心的数据
这个Store想必是最关心的吧?(好了,外面貌似下冰雹了我晕,楼顶啪啪的!没时间去核实有北京的2011年七月二十六号晚上21:40:00左右的网友如果核实了留言证实一下)。
嗯,说到冰雹,我觉得转载这篇文章的人应该注意一下告诉出处,这篇文章来自流水无心的ITEYE博客http://andy-ghg.iteye.com/
扯远了,再回来继续说,这个Store现在改变可不小,详细的参看一下这个文章
[url src='http://www.sencha.com/blog/ext-js-4-anatomy-of-a-model/']Countdown to Ext JS 4: Anatomy of a Model[/url]
好了,我知道我很懒,但是我可以简单说一下:modal代替了以往store中fields:[""]的功能,但是我没用(实际使用有问题- -!学艺不精),其实它是一个对象。。。对的是对象,MVC中的Model,好了,具体看API中关于MVC的介绍吧。
Store中有一个变化就是baseParams变程了extraParams,注意下。每一个Store必须(?是否必须我也不知道,不过我现在是这么用的)要有一个Proxy且必须给一个type,现在的Store是这样写的:

Js代码

  1. Ext.define('User', { 
  2.     extend: 'Ext.data.Model', 
  3.     fields: [ 
  4.         {name: 'name',  type: 'string'}, 
  5.         {name: 'age',   type: 'int'} 
  6.     ] 
  7. }); 
  8. Ext.create("Ext.data.Store",{ 
  9.     modal:"User", 
  10.     proxy{ 
  11.         url : "xxxx.do", 
  12.         type : "ajax"
  13.     } 
  14. }) 

确实像那么回事儿,但是我不买账。。。在实际项目中我还是用我的fileds,在没彻底搞明白之前,不太敢这么弄
当然Store的改动远远不止这些,例如Proxy中新增了一个localStorage(Ext.data.proxy.LocalStorage)用于过渡到HTML5的localStorage等等。
Draw绘图
这个东西喜欢吗?我喜欢嘿嘿
ExtJS4中提供了绘图,夸浏览器的,它内部实现了Canvas、SVG、VML等绘图方法,所以不同的浏览器它会自动使用该浏览器支持的绘图方式。支持IE6789、基于Gecko的浏览器(FF)、基于WebKit内核的浏览器(Chrome)。
FX
从ExtJS提供这个以来我就不怎么用,原因很简单,浪费我的资源。。。。在新的ExtJS中,提供了类似Flex中关于动画的包方法Ext.fx.target.*,因为我不怎么用,所以不再阐述。
布局
这里的改变也很大,但是我觉得我在这个博客里说再多也没有你自己去运行它的例子来得要直观。
好了,说了这么多,当然没有说完。。。。更多细节的改变的大家自己去发掘,推荐一篇文章《ExtJS 4.0 Developer Preview》,地址我忘了,网络时代相信对你来说找到它不难。
最后做一下小小的广告:
我自己写的AS3(Flex)流程图例子快要完工了~!以前提供了一个简易的Demo版本,这次是经过重大修改后的(不是说以前有重大的BUG,而是以前的实在太难用- -!),虽然是例子,但是如果您喜欢,完全可以用来做二次开发~!嘿嘿。下面是最新版的截图: 

目前提供了这些小组件: 

最后的最后
从ExtJS 2.0一直用到4.0,从Flex 3用到Flex 4.5,感慨很多,在ExtJS成长的过程中我已渐渐的从前端转向了后端,不是因为我不再热爱前端和RIA,而是因为我觉得多方的了解与涉及能让自己得到更好的升华,目前专注j2ee开发,主要涉及Spring、Spring Security、CAS SSO、JMS ActiveMQ、Hibernate、jBPM、Oracle。
其它的包括C#、C++QT4、jQuery等等也装模作样的学了些,所以不要再讨论某个语言某个框架的优劣,有这个时间可以学到很多很多东西。何必眼光这么狭隘呢?,争论太浪费精力。少点争论多点实际付出。
Happy coding~!

 

参见:

http://blog.csdn.net/zhangxin09/article/details/6191740  Ext JS 4的倒数:程序员预览 Countdown to Ext JS 4: Developer Preview

Continue reading 【转】ExtJS 4.0 的改变--较为完整的介绍。

重装mysql无法启动服务的问题

之前装的mysql5.1,但是经过系统还原后服务没有了,干脆升级到5.5,但是安装好了,配置时最后一步就是启动不了!

查看日志:programdata/data/pc.err发现:

111121 22:16:50  InnoDB: Log file .\ib_logfile0 did not exist: new to be created
InnoDB: Setting log file .\ib_logfile0 size to 10 MB
InnoDB: Database physically writes the file full: wait...
111121 22:16:50  InnoDB: Log file .\ib_logfile1 did not exist: new to be created
InnoDB: Setting log file .\ib_logfile1 size to 10 MB
InnoDB: Database physically writes the file full: wait...
111121 22:16:50 InnoDB: Cannot initialize created log files because
111121 22:16:50 InnoDB: data files are corrupt, or new data files were
111121 22:16:50 InnoDB: created when the database was started previous
111121 22:16:50 InnoDB: time but the database was not shut down
111121 22:16:50 InnoDB: normally after that.
111121 22:16:50 [ERROR] Plugin 'InnoDB' init function returned error.
111121 22:16:50 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
111121 22:16:50 [ERROR] Unknown/unsupported storage engine: INNODB
111121 22:16:50 [ERROR] Aborting

在网上一查,原来要将ib_logfile0,ib_logfile1,还有ibdata1这三个文件删掉才行,它们分别在data和programdata目录中(在配置时由你指定的)。

但是最后还是连不上,即使是服务启动了,就是连不上。

总是在第四步的security setting上提示1045 Error,死活不能连接'root'@'localhost' password[YES]

找这篇文章来:http://marclee.blog.163.com/blog/static/40317017201157101349210/ 任然不行。

没办法,退回去下载5.1的,安装顺利。

╮(╯▽╰)╭,还是老老实实用5.1吧!

Continue reading 重装mysql无法启动服务的问题

Pagination


Total views.

© 2013 - 2019. All rights reserved.

Powered by Hydejack v6.6.1