<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
	<channel>
		<title>膘叔</title>
		<link>http://www.neatstudio.com/</link>
		<description>只关心我所关心的，不在意我所不在意的</description>
		<copyright>Copyright (C) 2004 Security Angel Team [S4T] All Rights Reserved.</copyright>
		<generator>SaBlog-X Version 1.6 Build 20080806</generator>
		<lastBuildDate>Fri, 10 Sep 2010 20:50:59 +0000</lastBuildDate>
		<ttl>10</ttl>
		<item>
			<guid>http://www.neatstudio.com/show-1266-1.shtml</guid>
			<title>Yii documents</title>
			<author>gouki</author>
			<description><![CDATA[<p>这两天一直在看Yii框架，也下载了一份API手册，却发现API手册里只有方法的介绍，却没有具体的调用方法，如果是纯方法的话，说实话，我还情愿用IDE的自动完成来查看呢。当然有个API手册在查询的时候会比较方便一点。</p>
<p>那么，有没有真正的manual呢？到官网的documentation分类去看了一下，NND，一堆 英文，不过，在我犀利的眼神下，还是发现了这玩意：<a href="http://www.yiiframework.com/doc/guide/">The Definitive Guide to  Yii</a> ，点开一看，原来这才是类似于PHP手册的manual呀。可惜能够下载的只有PDF版本。更可恨的是，也只有英文版的，算了，将就点吧。。。虽然英文烂了点，一些简单的东西还是能够看得懂的。</p>
<p>如果初学Yii，还是建议看一下这个guide：<a href="http://www.yiiframework.com/doc/guide/">The Definitive Guide to  Yii</a> ，它，有中文版，在：http://www.yiiframework.com/doc/guide/zh_cn/index</p>
<p>左边的树的目录也很清晰，值得一观，不过更建议的是多看一下：http://www.yiiframework.com/doc/guide/zh_cn/basics.application，我最初就是没看这个，一下子不知道如何调用Cache，都想在代码 new Cache之类的了。</p>
<p>--EOF--</p>
<p>后记：感谢烂桔推荐的：<a href="http://dreamneverfall.cn/yiidoc/index.htm" target="_blank">http://dreamneverfall.cn/yiidoc/index.htm</a>，烂桔的网站为：<a href="http://iorange.cc" target="_blank">http://iorange.cc</a></p>]]></description>
			<link>http://www.neatstudio.com/show-1266-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-4-1.shtml">PHP Framework</category>
			<pubDate>2010-05-06 14:08</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-1264-1.shtml</guid>
			<title>Yii 笔记二</title>
			<author>gouki</author>
			<description><![CDATA[<p>Yii的用户登录，如果不算上权限的话，恐怕真的是很简单的登录。<br />
简单的判断，简单的处理一下就完事了。<br />
但我今天还真的被简单的折腾了一下。<br />
User登录，需要写几个地方<br />
1、components目录下的UserIdentity.php中，需要加一个判断用户的方法，返回errorCode，当然没有错的话就返回0,这是常用ERROR_NONE<br />
2、model目录下的loginForm，里面有简单的判断处理，如果登录成功，调用CWebUser中的login方法。起初的时候，我一直没找到Yii::app()-&gt;user是哪个类。。<br />
3、由于Yii::app()-&gt;user-&gt;login方法的特殊性，因此，必须要在UserIdentity.php中设定好getId,getName,和states变量。当然最简单的就是判断是否取到用户数据，如果取到的话，直接$this-&gt;setPersistentStates($usermodel-&gt;getAttributes());如果没有id,name的变量，那么即使你登录了，还是会显示没有登录的。我就是在这里被折腾了好久。<br />
<br />
over。。。</p>]]></description>
			<link>http://www.neatstudio.com/show-1264-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-4-1.shtml">PHP Framework</category>
			<pubDate>2010-05-05 13:54</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-1263-1.shtml</guid>
			<title>初用Yii</title>
			<author>gouki</author>
			<description><![CDATA[<p>Yii是在iorange的推荐下使用的，这两天我才刚刚在使用。做点笔记而己，没有其他</p>
<p>1、就象我在neatcn.com写的，创建项目非常简单，yii.bat这个命令就可以完成了。详细就在http://www.neatcn.com/show-57-1.shtml</p>
<p>2、项目目录中components中的文件，会在autoload中被引用，也只有这一个目录下的会被autoload，其他的都是有固定规范的。（不知道有没有理解错）</p>
<p>3、model目录下居然是tablemodel和form两种的集合，有点乱（官方的例子是这样的），不过想着form的validation也是用tablemodel来完成的，又能够理解这种做法，普通的tablemodel类继承cActiveRecord。</p>
<p>4、Controllers目录下是控制类，默认是SiteController，和其他框架默认是indexController有点不一样。继承自CController类。controller类中有一个layout的变量，可以设定layout。一般可以手工指定，如果同一个类里有不同的layout，估计还是要写个方法才行</p>
<p>5、Model的activeRecord返回的是对象，而不是象其他框架默认返回数组，因此取集合时要用getAttributes方法，当然，如果是只有一条数据，也可以直接$model-&gt;fieldname这样的方式来获取值 。</p>
<p>才学了这么一点，慢慢来吧。。重构路是漫长的。</p>]]></description>
			<link>http://www.neatstudio.com/show-1263-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-4-1.shtml">PHP Framework</category>
			<pubDate>2010-05-05 10:54</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-1086-1.shtml</guid>
			<title>ThinkPHP经常会遗忘的事</title>
			<author>gouki</author>
			<description><![CDATA[<p>使用THinkPHP框架开发程序，经常容易遗忘的事是什么呢？<br />
1、app runtime没有及时更新<br />
2、datamodel 缓存在更改表结构后没有刷新<br />
3、数据缓存设定的时间太长。而在更改数据后没有主动刷新</p>
<p>4、模版缓存中的 include file 一般不会强制刷新。。</p>
<p>以上是开发注意事情，如果你发现改了一些设置或者其他什么后，死活不正常，请先检查以上四样。</p>]]></description>
			<link>http://www.neatstudio.com/show-1086-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-4-1.shtml">PHP Framework</category>
			<pubDate>2010-01-28 15:01</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-1045-1.shtml</guid>
			<title>thinkPHP与Ucenter的连接注意事项</title>
			<author>gouki</author>
			<description><![CDATA[<p>这其实是一个老问题，凡是使用ThinkPHP与Ucenter通讯的程序都需要注意一点。。</p>
<p>ThinkPHP定义了一个基类为Base类，而Ucenter也同样定义了一个基类Base类。<br />
ThinkPHP一开始就加载了BASE类，而Ucenter在使用mysql连接的的时候，就会加载BAse类。因此，凡是使用thinkphp的程序，请把ucenter的连接方式从mysql改为空，即，改用post方式通信 。</p>
<p>Over</p>
<p>其实，关于这个BUG，我很早就在discuz论坛提过了。当然也在ThinkPHP论坛提过。但事实上，都没有什么解决方案。而我更推崇的应该是ucenter进行变化。。呵呵</p>
<p>原文我发在了：<a href="http://www.ucapi.com/wiki/2009/12/thinkphp-ucenter-infomation/">UCAPI.COM</a>,然后我再去挖挖坑，看看DZ和TP论坛以前是怎么回复的。。</p>
<p>原来，在DZ，根本就没有人理我：http://www.discuz.net/thread-1204869-1-1.html，这是当时说的两个BUG：
<div class="codeText">
<div class="codeHead">http://www.discuz.net/thread-1204869-1-1.html</div>
<ol start="1" class="dp-xml">
    <li class="alt"><span><span>1、1.5版的XML解析器可能有问题，我在使用uc_user_login的时候，无法解析，把老版的xml.class.php拷进去，问题解决。也没有仔细看问题在何处。&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>2、不算BUG的BUG，由于我使用框架进行开发，自己有个基类为base,在使用MYSQL通讯的时候，它默认加载了uc_client库中的base类，造成类重载错误&nbsp;&nbsp;</span></li>
    <li class=""><span>建议uc_client中的所有类以&ldquo;uc_&rdquo;开头，避免与其他系统产生冲突。&nbsp;&nbsp;</span></li>
</ol>
</div>
</p>
<p>TP论坛我是在群里提的。。。没记录了。唉。。</p>
<p>&nbsp;</p>]]></description>
			<link>http://www.neatstudio.com/show-1045-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-4-1.shtml">PHP Framework</category>
			<pubDate>2009-12-29 09:08</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-1007-1.shtml</guid>
			<title>初用thinkphp的widget</title>
			<author>gouki</author>
			<description><![CDATA[<p>widget最早的应用应该是vista了。。但WEB上的就说不准谁是最早应用的。。。<br />
<br />
ThinkPHP从很早的版本里就有支持了，但，我却一直没有用过，依稀记得yblog在用widget的时候，好象ThinkPHP那时候还没有正式支持。。</p>
<p>我这次使用，其实也算是个意外，在对thinksns二次开发的时候，有些页面需要经常重用，不得己，只能使用widget了。</p>
<p>随便看了一下，如果仅仅只是用来显示一些简单的页面，那么widget还是很方便的就能够被使用了。thinkphp2.0的手册中也有介绍。。</p>
<p>最简单的用法莫过于在Lib目录下，新建一个widget目录。然后放上一个class文件，最后附上一个基本同名的模版就行了。。<br />
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol start="1" class="dp-c">
    <li class="alt"><span><span>&lt;?php&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">class</span><span>&nbsp;RightSlideWidget&nbsp;</span><span class="keyword">extends</span><span>&nbsp;Widget&nbsp;&nbsp;</span></span></li>
    <li class=""><span>{&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">function</span><span>&nbsp;render(</span><span class="vars">$data</span><span>){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="vars">$data</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
在同目录下放置一个RightSlide.html就行了。。该html的解析与你使用的模版引擎有关，一般情况下，还是使用TP的模版了。。</p>
<p>在正式的模版中使用【我是指使用TP的情况下】，直接{:W('RightSlide',array('data'=&gt;1))}就可以了。</p>
<p>很简单吧。</p>]]></description>
			<link>http://www.neatstudio.com/show-1007-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-4-1.shtml">PHP Framework</category>
			<pubDate>2009-12-02 21:36</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-984-1.shtml</guid>
			<title>Zend framework quickstart -&gt; create project</title>
			<author>gouki</author>
			<description><![CDATA[<p>仍然是quickstart的内容之一：create project</p>
<h3>Create Your Project</h3>
<p>In order to create your project, you must first install Zend Framework.</p>
<p>为了创建您的ZF项目，你必须先安装ZF框架</p>
<h3>Install Zend Framework</h3>
<p>The easiest way to get Zend Framework along with a complete PHP stack is     by installing <a target="_blank" href="http://www.zend.com/en/products/server-ce/downloads">Zend     Server</a>. Zend Server has native installers for Mac OSX, Windows,     Fedora Core, and Ubuntu, as well as a universal installation package     compatible with most Linux distributions.</p>
<p>最简单安装ZF的方法就是安装ZendServer，ZendServer可以安装在苹果系统，windows, fedora,ubuntu，而且支持大多数的linux操作系统 。</p>
<p>After you have installed Zend Server, the Framework files may be found     under <code class="php">/Applications/ZendServer/share/ZendFramework</code> on Mac     OSX, <code class="php">C:\Program Files\Zend\ZendServer\share\ZendFramework</code> on     Windows, and <code class="php">/usr/local/zend/share/ZendFramework</code> on Linux.     The <code class="php">include_path</code> will already be configured to include     Zend Framework.</p>
<p>在你安装完zendserver后，如果您是使用MAC系统，你将在<code class="php">/Applications/ZendServer/share/ZendFramework目录下找到</code>框架文件，windows平台的话，是在, <code class="php">C:\Program Files\Zend\ZendServer\share\ZendFramework目录中，而linux平台则在</code><code class="php">/usr/local/zend/share/ZendFramework目录中。同时include_path也已经被配置好支持ZF框架了。</code></p>
<p>Alternately, you can <a target="_blank" href="http://framework.zend.com/download">download the latest version of Zend Framework</a> and     extract the contents; make a note of where you have done so.</p>
<p>当然你也可以直接下载ZF的最新版本并解压到你想使用的目录中</p>
<p>Optionally, you can add the path to the <tt>library/</tt> subdirectory of     the archive to your <tt>php.ini</tt>'s <tt>include_path</tt> setting.</p>
<p>或者，你也可以把library这个目录加载到你的php.ini中的include_path设置中。</p>
<p>That's it! Zend Framework is now installed and ready to use.</p>
<p>这时候，ZF框架就已经被安装好并能够被使用了。</p>
<p>&nbsp;</p>
<div class="codeText">
<div class="codeHead">zf Command Line Tool ZF命令行工具</div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span>In&nbsp;your&nbsp;Zend&nbsp;Framework&nbsp;installation&nbsp;is&nbsp;a&nbsp;bin/&nbsp;subdirectory,&nbsp;containing&nbsp;the&nbsp;scripts&nbsp;zf.sh&nbsp;and&nbsp;zf.bat&nbsp;for&nbsp;Unix-based&nbsp;and&nbsp;Windows-based&nbsp;users,&nbsp;respectively.&nbsp;Make&nbsp;a&nbsp;note&nbsp;of&nbsp;the&nbsp;absolute&nbsp;path&nbsp;to&nbsp;this&nbsp;script.&nbsp;&nbsp;</span></span></li>
    <li class=""><span>在你的ZF安装目录下，有两个可执行文件：zf.sh和zf.bat，他们分别对应着Unix平台和windows平台。记录下这个文件的绝对路径&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>Wherever&nbsp;you&nbsp;see&nbsp;references&nbsp;to&nbsp;zf.sh&nbsp;or&nbsp;zf.bat,&nbsp;please&nbsp;substitute&nbsp;the&nbsp;absolute&nbsp;path&nbsp;to&nbsp;the&nbsp;script.&nbsp;On&nbsp;unix-like&nbsp;systems,&nbsp;you&nbsp;may&nbsp;want&nbsp;to&nbsp;use&nbsp;your&nbsp;shell's&nbsp;alias&nbsp;functionality:&nbsp;alias&nbsp;<span class="attribute">zf.sh</span><span>=</span><span class="attribute-value">path</span><span>/to/ZendFramework/bin/zf.sh.&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>当你想要引用这zf.sh或者zf.bat文件&nbsp;的时候，请先设置它的详细路径。例如在Unix平台下，你可以使用shell功能来进行替代：alias&nbsp;<span class="attribute">zf.sh</span><span>=</span><span class="attribute-value">path</span><span>/to/ZendFramework/bin/zf.sh&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>If&nbsp;you&nbsp;have&nbsp;problems&nbsp;setting&nbsp;up&nbsp;the&nbsp;zf&nbsp;command-line&nbsp;tool,&nbsp;please&nbsp;refer&nbsp;to&nbsp;the&nbsp;manual.&nbsp;&nbsp;</span></li>
    <li class=""><span>如果你还对ZF命令行工具有疑问，那就只能查看官方的手册了&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>Open a terminal (in Windows, Start -&gt; Run, and then use &quot;cmd&quot;). Navigate     to a directory where you would like to start a project. Then, use the path     to the appropriate script, and execute one of the following:</p>
<p>&nbsp;</p>
<p>打开终端（在windows下面为：开始-&gt;运行-&gt;输入cmd），转到你想要创建项目的子目录中，开始就可以开始使用你刚才设置的路径来运行那两个script之一了。</p>
<p>&nbsp;</p>
<div class="codeText">
<div class="codeHead">XML/HTML代码</div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span>#&nbsp;Unix:&nbsp;&nbsp;</span></span></li>
    <li class=""><span>%&nbsp;zf.sh&nbsp;create&nbsp;project&nbsp;quickstart&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>#&nbsp;DOS/Windows:&nbsp;&nbsp;</span></li>
    <li class="alt"><span>C:<span class="tag">&gt;</span><span>&nbsp;zf.bat&nbsp;create&nbsp;project&nbsp;quickstart&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p>Running this command will create your basic site structure, including your     initial controllers and views. The tree looks like the following:</p>
<p>&nbsp;</p>
<p>运行了这个命令，你将会得到ZF框架的项目的最基本结构，包含了初始化后的控制和和视图（controllers and vews），这个树形结构类似如下：</p>
<div class="codeText">
<div class="codeHead">XML/HTML代码</div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span>quickstart&nbsp;&nbsp;</span></span></li>
    <li class=""><span>|--&nbsp;application&nbsp;&nbsp;</span></li>
    <li class="alt"><span>|&nbsp;&nbsp;&nbsp;|--&nbsp;Bootstrap.php&nbsp;&nbsp;</span></li>
    <li class=""><span>|&nbsp;&nbsp;&nbsp;|--&nbsp;configs&nbsp;&nbsp;</span></li>
    <li class="alt"><span>|&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;`--&nbsp;application.ini&nbsp;&nbsp;</span></li>
    <li class=""><span>|&nbsp;&nbsp;&nbsp;|--&nbsp;controllers&nbsp;&nbsp;</span></li>
    <li class="alt"><span>|&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;|--&nbsp;ErrorController.php&nbsp;&nbsp;</span></li>
    <li class=""><span>|&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;`--&nbsp;IndexController.php&nbsp;&nbsp;</span></li>
    <li class="alt"><span>|&nbsp;&nbsp;&nbsp;|--&nbsp;models&nbsp;&nbsp;</span></li>
    <li class=""><span>|&nbsp;&nbsp;&nbsp;`--&nbsp;views&nbsp;&nbsp;</span></li>
    <li class="alt"><span>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;helpers&nbsp;&nbsp;</span></li>
    <li class=""><span>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`--&nbsp;scripts&nbsp;&nbsp;</span></li>
    <li class="alt"><span>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;error&nbsp;&nbsp;</span></li>
    <li class=""><span>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;`--&nbsp;error.phtml&nbsp;&nbsp;</span></li>
    <li class="alt"><span>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`--&nbsp;index&nbsp;&nbsp;</span></li>
    <li class=""><span>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`--&nbsp;index.phtml&nbsp;&nbsp;</span></li>
    <li class="alt"><span>|--&nbsp;library&nbsp;&nbsp;</span></li>
    <li class=""><span>|--&nbsp;public&nbsp;&nbsp;</span></li>
    <li class="alt"><span>|&nbsp;&nbsp;&nbsp;`--&nbsp;index.php&nbsp;&nbsp;</span></li>
    <li class=""><span>`--&nbsp;tests&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;application&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;`--&nbsp;bootstrap.php&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;library&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;`--&nbsp;bootstrap.php&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;`--&nbsp;phpunit.xml&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>&nbsp;</p>
<p>At this point, if you haven't added Zend Framework to your     <tt>include_path</tt>, we recommend either copying or symlinking it into     your <tt>library/</tt> directory. In either case, you'll want to either     recursively copy or symlink the <tt>library/Zend/</tt> directory of your Zend     Framework installation into the <tt>library/</tt> directory of your project.      On unix-like systems, that would look like one of the following:</p>
<p>在这点中，如果你没有将ZF框架加入到你的 include_path ,我们推荐你将它 COPY或者 symlinking到你的 library目录下。两种方法其中都是将library/Zend 目录 链至你的项目。在unlx系统中，它大致是这样操作的：</p>
<div class="codeText">
<div class="codeHead">XML/HTML代码</div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span>#&nbsp;Symlink:&nbsp;&nbsp;</span></span></li>
    <li class=""><span>%&nbsp;cd&nbsp;library;&nbsp;ln&nbsp;-s&nbsp;path/to/ZendFramework/library/Zend&nbsp;.&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>#&nbsp;Copy:&nbsp;&nbsp;</span></li>
    <li class="alt"><span>%&nbsp;cd&nbsp;library;&nbsp;cp&nbsp;-r&nbsp;path/to/ZendFramework/library/Zend&nbsp;.&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>On Windows systems, it may be easiest to do this from the Explorer.</p>
<p>&nbsp;</p>
<p>在windows平台下，直接在资源管理器中就能够操作完毕。</p>
<p>Now that the project is created, the main artifacts to begin understanding     are the bootstrap, configuration, action controllers, and views.</p>
<p>项目创建完毕后，the main artifact【不知道如何翻译】先了角解一下：bootstrap,configuration,action,controllers和views</p>
<h4>The Bootstrap</h4>
<p>Your <tt>Bootstrap</tt> class defines what resources and components to     initialize. By default, Zend Framework's <a href="http://framework.zend.com/manual/en/zend.controller.front.html">Front Controller</a> is     intialized, and it uses the <tt>application/controllers/</tt> as the     default directory in which to look for action controllers (more on that     later). The class looks like the following:</p>
<p>Bootstrap类定义了资源和构成的初始化。默认情况下ZF只初始化了Front Controller【前端操作器】，它使用了 application/controllers 作为默认目录，在该目录里有着controller控制类的文件。bootstrap最初是这样的：
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol start="1" class="dp-c">
    <li class="alt"><span><span class="keyword">class</span><span>&nbsp;Bootstrap&nbsp;</span><span class="keyword">extends</span><span>&nbsp;Zend_Application_Bootstrap_Bootstrap&nbsp;&nbsp;</span></span></li>
    <li class=""><span>{&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
</p>
<p>As you can see, not much is necessary to begin with.</p>
<p>就你看到的内容来说，好象没有多少是必需的。</p>
<h4>Configuration</h4>
<p>While Zend Framework is itself configurationless, you often need to     configure your application. The default configuration is placed in     <tt>application/configs/application.ini</tt>, and contains some basic     directives for setting your PHP environment (for instance, turning error     reporting on and off), indicating the path to your bootstrap class (as well     as its class name), and the path to your action controllers. It looks as     follows:</p>
<p>ZF本身的配置是极少的，你通常需要为你自己的项目进行单独配置。默认的配置文件是/application/configs/application.ini，在文件中定义了一些PHP环境变量（如error_reporting的打开与否）和bootstrap类的路径（甚至是bootstrap类的名称），以前你的控制器的路径，内容如下：</p>
<p>
<div class="codeText">
<div class="codeHead">XML/HTML代码</div>
<ol start="1" class="dp-xml">
    <li class="alt"><span><span>;&nbsp;application/configs/application.ini&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>[production]&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="attribute">phpSettings.display_startup_errors</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">0</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="attribute">phpSettings.display_errors</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">0</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="attribute">includePaths.library</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">APPLICATION_PATH</span><span>&nbsp;&quot;/../library&quot;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="attribute">bootstrap.path</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">APPLICATION_PATH</span><span>&nbsp;&quot;/Bootstrap.php&quot;&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="attribute">bootstrap.class</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">&quot;Bootstrap&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="attribute">resources.frontController.controllerDirectory</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">APPLICATION_PATH</span><span>&nbsp;&quot;/controllers&quot;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>[staging&nbsp;:&nbsp;production]&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>[testing&nbsp;:&nbsp;production]&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="attribute">phpSettings.display_startup_errors</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">1</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="attribute">phpSettings.display_errors</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">1</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>[development&nbsp;:&nbsp;production]&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="attribute">phpSettings.display_startup_errors</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">1</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="attribute">phpSettings.display_errors</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">1</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
Several things about this file should be noted. First, when using INI-style     configuration, you can reference constants directly and expand them;     <tt>APPLICATION_PATH</tt> is actually a constant. Additionally note that     there are several sections defined: production, staging, testing, and     development. The latter three inherit settings from the &quot;production&quot;     environment. This is a useful way to organize configuration to ensure that     appropriate settings are available in each stage of application development.</p>
<p>关于这个文件的必须要注意一些事。首先，当你使用ini格式的配置文件时，你可以直接引用常量，如APPLICATION_PATH就是一个常量。另外，还有一些选择器是默认定义过的：production,staging,testing和defelopment。后面三个设置都是从production的环境变量中扩展的。这样，你就可以很好的为你的项目开发进行适当的配置。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;原文：http://framework.zend.com/docs/quickstart/create-your-project</p>
<p>有点长，写的也乱。先写这么多，下次补全。</p>
<p>其实不太想翻译这个，毕竟太初级了。。。我想翻译的是这个：http://devzone.zend.com/tag/PHP101</p>
<p>但是翻译现在这个QuickStart是可以让我在言语组织上学习点东西。先为我想翻译的东西打点基础吧。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>]]></description>
			<link>http://www.neatstudio.com/show-984-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-4-1.shtml">PHP Framework</category>
			<pubDate>2009-11-16 16:24</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-982-1.shtml</guid>
			<title>zend framdwork quick start</title>
			<author>gouki</author>
			<description><![CDATA[<p>最近重操旧业，看起了zend framework，如今的1.9x与以前不一样了。所以，把ZF的quick start逐步翻译一下，权当复习和温故了。</p>
<p>原文地址：http://framework.zend.com/docs/quickstart/create-a-model-and-database-table</p>
<h3>ZF &amp; MVC Introduction</h3>
<h4>Zend Framework</h4>
<p>Zend Framework is an open source, object oriented web application framework     for PHP 5.  ZF is often called a 'component library', because it has many     loosely coupled components that you can use more or less independently. But     Zend Framework also provides an advanced Model-View-Controller (MVC)     implementation that can be used to establish a basic structure for your ZF     applications. A full list of Zend Framework components along with short     descriptions may be found in the <a href="http://framework.zend.com/about/components" target="_blank">components overview</a>. This QuickStart will introduce you to     some of ZF's most commonly used components, including Zend_Controller,     Zend_Layout, Zend_Config, Zend_Db, Zend_Db_Table, Zend_Registry, along with a     few view helpers.</p>
<p>Using these components, we will build a simple database-driven guest book     application within minutes. The complete source code for this application is     available in the following archives:</p>
<p>zend framework 介绍</p>
<p>ZF是一个开源且面向对象的，支持PHP5的WEB应用框架。ZF通常被叫做&ldquo;组件库&rdquo;，因为他拥有很多松耦合的组件，因此你可以在应用中或多或少的独立使用它们。但ZF更多的是为你的ZF应用提供了一个高级的MVC架构【？？翻译不来了】所有的ZF组件列表，你可以从 组件预览 页进行查看。而这个QuickStart会给你的ZF最通常使用的组件进行介绍，如Zend_Controller,Zend_layout,Zend_Config,Zend_Db,Zend_Db_table,Zend_Registry,以及一些视图助手【这个应该是讲View的，但不知道怎么翻译好。现在终于明白那些翻译书的朋友们的痛苦之处了。明知道啥意思就是说不出口，还是词汇量少啊】</p>
<h4>Model-View-Controller</h4>
<p>So what exactly is this MVC pattern everyone keeps talking about, and why     should you care? MVC is much more than just a three-letter acronym (TLA) that     you can whip out anytime you want to sound smart; it has become something of a     standard in the design of modern web applications. And for good reason. Most     web application code falls under one of the following three categories:     presentation, business logic, and data access. The MVC pattern models this     separation of concerns well. The end result is that your presentation code can     be consolidated in one part of your application with your business logic in     another and your data access code in yet another. Many developers have found     this well-defined separation indispensable for keeping their code organized,     especially when more than one developer is working on the same application.</p>
<p>MVC</p>
<p>那么我们就来讲讲什么是MVC了以及你对于MVC来说，最关心的是什么。MVC虽然只是三个单词的开始每个字母组成的新词，然而他已经成为了网页程序的标准设计模式了。而且，有充分的理由证明，大多数的网络程序代码都被归于以下三种分类之一：表达方式【？】，商业逻辑 和数据访问层。MVC模式则能够使你们将关注点进行分离。最终你的表示代码只占你的商业逻辑的一小部分，同样数据访问层也是这样。大多数开发人员发觉这能够使得他们保持代码分离并且条理清晰，尤其是在同一项目中有多名开发人员时。</p>
<p>翻译的很迷惘。。。</p>
<p>其实上面的大意无非就是MVC结构使得程序员可以将更多的精力放在业务逻辑上，而不是将大量的精力浪费在表现层和数据访问上。</p>
<p>不过，虽然翻译的很乱，但我还是多少又理解了一点这方面的知识。MVC如今已经被很多人所接受，很多招聘上也都写着，熟悉MVC模式开发。其实，如果真正项目已经按着MVC模式开发的话，那么招聘进去的人，又有多少是同时对于这三个方面进行开发的呢？</p>
<p>Model - View - Controller，在ZF框架中也是很分离的。看框架的 application目录就很清楚了。除了module和config目录外，剩下的就是：controllers,models和views目录了。。由此可见，基本上也分得比较清楚了</p>]]></description>
			<link>http://www.neatstudio.com/show-982-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-4-1.shtml">PHP Framework</category>
			<pubDate>2009-11-13 09:24</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-949-1.shtml</guid>
			<title>老王梳理的Zend Framework Bootstrap机制</title>
			<author>gouki</author>
			<description><![CDATA[<p>以下是老王梳理的内容，bootstrap对于ZF来说非常重要，很大一部分人的程序损耗，都在这里。。。。<br />
<br />
原文地址：http://hi.baidu.com/thinkinginlamp/blog/item/419f36d34b68c40a3af3cfc9.html<br />
<br />
说点题外话，单就框架而言，对我而言使用CakePHP要比使用Zend Framework顺手得多，不过最近CakePHP陷入了<a href="http://bakery.cakephp.org/articles/view/the-cake-is-still-rising" target="_blank">多事之秋</a>，Phpnut，Gwoo，Nate彻底闹僵，Gwoo和Nate选择离开，据<a target="_blank" href="http://irc.cakephp.org/logs/link/1110092#message1110102">坊间传闻</a>他们已经开始另立门户，稍后会释出一个CakePHP的衍生框架：<a target="_blank" href="http://li3.rad-dev.org/">Lithium</a>。虽然CakePHP官方已经表态会一如既往的继续前进，但毫无疑问在众多开发者眼中，CakePHP的前景已经不再明朗，其是否能继续保证PHP框架领头羊的地位也越发充满疑问。<br />
<br />
之所以说了这么多题外话，就是为了说明一点，对于广大PHPer而言，过多局限于一种框架之上本身就是一种强耦合，未来是不可预期的。所以我打算在继续使 用CakePHP的同时，适当向Zend Framework倾斜，如果Lithium不错的话，也会在我未来学习计划之中占有一席之地。<br />
<br />
言归正传，新版的Zend Framework引入了<a href="http://framework.zend.com/manual/en/zend.application.html" target="_blank">Zend_Application</a>，把Bootstrap进行的规范化的封装，一个典型的Application的Bootstrap文件大致如下：</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol start="1" class="dp-c">
    <li class="alt"><span><span class="keyword">class</span><span>&nbsp;Bootstrap&nbsp;</span><span class="keyword">extends</span><span>&nbsp;Zend_Application_Bootstrap_Bootstrap&nbsp;&nbsp;</span></span></li>
    <li class=""><span>{&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">protected</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;_initAutoloader()&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$autoloader</span><span>&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Zend_Application_Module_Autoloader(</span><span class="keyword">array</span><span>(&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'namespace'</span><span>&nbsp;=&gt;&nbsp;</span><span class="string">'Application'</span><span>,&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'basePath'</span><span>&nbsp;=&gt;&nbsp;APPLICATION_PATH,&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;));&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="vars">$autoloader</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>在Bootstrap中，所有以_init开头的方法被当做资源方法自动运行，如果方法有返回值的话，还会被作为资源保存。资源方法不是唯一配置资源的方 式，为了避免重复编码，框架包含了若干现成的资源插件，可以在配置文件里通过简单设置就可以达到相应的功能，一个典型的配置文件如下所示：</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol start="1" class="dp-c">
    <li class="alt"><span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">array</span><span>(&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'bootstrap'</span><span>&nbsp;=&gt;&nbsp;</span><span class="keyword">array</span><span>(&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'path'</span><span>&nbsp;=&gt;&nbsp;APPLICATION_PATH&nbsp;.&nbsp;</span><span class="string">'/Bootstrap.php'</span><span>,&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;),&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'resources'</span><span>&nbsp;=&gt;&nbsp;</span><span class="keyword">array</span><span>(&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'modules'</span><span>&nbsp;=&gt;&nbsp;</span><span class="keyword">array</span><span>(),&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'frontController'</span><span>&nbsp;=&gt;&nbsp;</span><span class="keyword">array</span><span>(&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'controllerDirectory'</span><span>&nbsp;=&gt;&nbsp;APPLICATION_PATH&nbsp;.&nbsp;</span><span class="string">'/controllers'</span><span>,&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'moduledirectory'</span><span>&nbsp;=&gt;&nbsp;APPLICATION_PATH&nbsp;.&nbsp;</span><span class="string">'/modules'</span><span>,&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;),&nbsp;&nbsp;</span></li>
    <li class=""><span>);&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>resources部分的modules和frontController就是资源插件。其中modules资源开启了系统的模块功能。比如说你有一个admin模块的话，那么对应的也可以有一个它自己的Bootstrap类：</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol start="1" class="dp-c">
    <li class="alt"><span><span class="keyword">class</span><span>&nbsp;Admin_Bootstrap&nbsp;</span><span class="keyword">extends</span><span>&nbsp;Zend_Application_Module_Bootstrap&nbsp;&nbsp;</span></span></li>
    <li class=""><span>{&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>需要说明的一点是Modules的Bootstrap里一般不再需要类似前面的_initAutoloader资源方法，这是因为从父类 Zend_Application_Module_Bootstrap里已经通过继承自动执行了以模块名为命名空间的Autoloader操作。<br />
<br />
在使用Modules的Bootstrap时，有一点需要注意的是系统会把所有模块的所有资源方法统统初始化一遍，打个比方来说，如果你有一个Blog模 块，还有一个Forum模块，每个模块使用各自独立的数据库配置，都有一个自己的_initDb方法，那么即便是我们单独访问Blog或者Forum中一 个模块，系统还是会把两个数据库都连接一遍，这无疑是低效的。但也不能就此认为这是Zend Framework的设计错误，问题的根源在于我们划分模块的粒度大小，如上所示，Blog和Forum不应该以Module的形式存在，而应该以 Application的形式存在。如此一来仅需要在Application层次的Bootstrap中执行一次数据库连接即可。<br />
<br />
Zend Framework的文档虽然看似详细，但很多细节都没有说明，比如说View助手缺省就会加载，这一点可以在 Zend_Controller_Front中看到对Zend_Controller_Action_Helper_ViewRenderer的调用，所 以最好在使用时自己扎到源代码里查阅。</p>]]></description>
			<link>http://www.neatstudio.com/show-949-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-4-1.shtml">PHP Framework</category>
			<pubDate>2009-10-25 22:57</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-946-1.shtml</guid>
			<title>ZF 1.9.4 出来了</title>
			<author>gouki</author>
			<description><![CDATA[<p>ZendFramework的更新速度不可谓不快，记得5月份的时候它还是1.7.8左右，如今 刚过去5个月，却已经是1.9.4了。<br />
虽然说这几个月，发生了很多事，比如PHP5.3的推出、ZDE 7.1测试版推出等，ZF的速度也太快了吧？</p>
<p>changelog:http://framework.zend.com/changelog/1.9.4</p>
<p>quickstart:http://framework.zend.com/docs/quickstart</p>]]></description>
			<link>http://www.neatstudio.com/show-946-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-4-1.shtml">PHP Framework</category>
			<pubDate>2009-10-23 22:49</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-754-1.shtml</guid>
			<title>Yii Demos 随想</title>
			<author>gouki</author>
			<description><![CDATA[<p>最近想看看yii,也想看看他的demo，就去了demo网站：<a href="http://www.yiiframework.com/demos/">http://www.yiiframework.com/demos/</a>，挺有意思。<br />
<br />
创意？不知道<br />
下载一个vm虚拟机，直接在vm里面跑起来。挺不错<br />
我试了一下，下载下来19M，解开后，稍有点大70多M，直接放到vm server里就可以运行了。<br />
根据官方所说，它支持：</p>
<p>The following components are installed on this appliance:</p>
<ul>
    <li>PHP 5.2.3 (in fast-cgi mode)</li>
    <li>Lighttpd 1.4.7 (mod_rewrite and fast-cgi enable)</li>
    <li>Yii 1.0.6 (including demos)</li>
    <li>PostgreSQL 8.2.4</li>
    <li>phpPgAdmin 4.1.3</li>
    <li>Linux kernel 2.6.17.7</li>
</ul>
<p>居然不是mysql，看来mysql太大了，而且太适合cgi之类的进程？（windows下的精简版用过，好象也不是特别大。还是说yii对postgreSql有特别的优待？）<br />
<br />
再试了一下，居然也支持ssh连接。<br />
但是缺点<br />
1、无法切换到root<br />
2、无法关机？？？halt不行，shutdown说没有这个命令<br />
3、wget??不能下载？本来想装个samba看看的。。看来只能算了。只能当成普通的虚拟机玩玩吧。<br />
<br />
最后再说一点，可以考虑象这样的打包方式进行演示。代码加密，环境配置好，windows下面用小型整合包，linux下面用这样的虚拟机，两份同时给客户展示。。<br />
<br />
或许会有更多不同的用户体验？<br />
也是猜猜而已。。。</p>]]></description>
			<link>http://www.neatstudio.com/show-754-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-4-1.shtml">PHP Framework</category>
			<pubDate>2009-07-05 09:12</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-692-1.shtml</guid>
			<title>using zf and smarty</title>
			<author>gouki</author>
			<description><![CDATA[<p>使用zend framework开发时，可以采用第三方模版，比如smarty，在网上找了很多资料，一般来说是两种</p>
<p>1、扩展view</p>
<p>2、使用Zend_Registry，在初始化的时候加载smarty,然后在输出的时候使用Zend_Registry::get('smarty')-&gt;display();</p>
<p>使用第二种方式的话，我当然是没有什么说的了。我这里说的是使用第一种方案。</p>
<p>在第一种方案中，官方有例子，页面地址为：http://framework.zend.com/manual/en/zend.view.scripts.html，写上一个类，调用Zend_View_Interface，写上相同的函数就可以了。。</p>
<p>官方有源码，我这里就不贴了。我把官方的例子写一下：</p>
<p>&nbsp;</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol class="dp-c" start="1">
    <li class="alt"><span><span class="comment">//Example&nbsp;1.&nbsp;In&nbsp;initView()&nbsp;of&nbsp;initializer.</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="vars">$view</span><span>&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Zend_View_Smarty(</span><span class="string">'/path/to/templates'</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="vars">$viewRenderer</span><span>&nbsp;=&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">new</span><span>&nbsp;Zend_Controller_Action_HelperBroker::getStaticHelper(</span><span class="string">'ViewRenderer'</span><span>);&nbsp; //使用此例子时，请将new去掉，静态方法不需要new</span></span></li>
    <li class="alt"><span><span class="vars">$viewRenderer</span><span>-&gt;setView(</span><span class="vars">$view</span><span>)&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&gt;setViewBasePathSpec(<span class="vars">$view</span><span>-&gt;_smarty-&gt;template_dir)&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&gt;setViewScriptPathSpec(<span class="string">':controller/:action.:suffix'</span><span>)&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&gt;setViewScriptPathNoControllerSpec(<span class="string">':action.:suffix'</span><span>)&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&gt;setViewSuffix(<span class="string">'tpl'</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="comment">//Example&nbsp;2.&nbsp;Usage&nbsp;in&nbsp;action&nbsp;controller&nbsp;remains&nbsp;the&nbsp;same...</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">class</span><span>&nbsp;FooController&nbsp;</span><span class="keyword">extends</span><span>&nbsp;Zend_Controller_Action&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>{&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;barAction()&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>-&gt;view-&gt;book&nbsp;&nbsp;&nbsp;=&nbsp;</span><span class="string">'Zend&nbsp;PHP&nbsp;5&nbsp;Certification&nbsp;Study&nbsp;Guide'</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>-&gt;view-&gt;author&nbsp;=&nbsp;</span><span class="string">'Davey&nbsp;Shafik&nbsp;and&nbsp;Ben&nbsp;Ramsey'</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="comment">//Example&nbsp;3.&nbsp;Initializing&nbsp;view&nbsp;in&nbsp;action&nbsp;controller</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">class</span><span>&nbsp;FooController&nbsp;</span><span class="keyword">extends</span><span>&nbsp;Zend_Controller_Action&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>{&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;init()&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>-&gt;view&nbsp;&nbsp;&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Zend_View_Smarty(</span><span class="string">'/path/to/templates'</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$viewRenderer</span><span>&nbsp;=&nbsp;</span><span class="vars">$this</span><span>-&gt;_helper-&gt;getHelper(</span><span class="string">'viewRenderer'</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$viewRenderer</span><span>-&gt;setView(</span><span class="vars">$this</span><span>-&gt;view)&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&gt;setViewBasePathSpec(<span class="vars">$view</span><span>-&gt;_smarty-&gt;template_dir)&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&gt;setViewScriptPathSpec(<span class="string">':controller/:action.:suffix'</span><span>)&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&gt;setViewScriptPathNoControllerSpec(<span class="string">':action.:suffix'</span><span>)&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&gt;setViewSuffix(<span class="string">'tpl'</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>以上是官方的example。不过，如果按第一个例子测试，是会出错的。。。</p>
<p>&nbsp;</p>
<p>请看第4行。。。静态方法居然用了new。（应该是粗心吧。不过我昨天是直接复制的，死活报错，也没有仔细看，丢人啊）写这篇 文章，主要也就是提醒一下，这个例子有点问题。</p>
<p><font color="#ff0000">顺便说一下，由于官方的例子里，是把$_smarty写成了protected，那么，其实在外面是不能够被直接引用的。要么写一个__get方法，要么，把属性改为public吧</font></p>
<p>不过，在使用smarty后，你会发现，你原来的layout功能不能完全使用了，为什么呢？因为，在原来的layout里面，代码都是类似于这样：</p>
<p>&nbsp;</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol class="dp-c" start="1">
    <li class="alt"><span><span>&lt;?php&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="vars">$this</span><span>-&gt;layout()-&gt;title;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>?&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>大致是这样的代码，这个，可不能用在smarty中。虽然在smarty中也可以用标签来调用PHP代码，但这毕竟不是一个好办法。</p>
<p>&nbsp;</p>
<p>不过还好，又有牛人写了一个很牛叉的例子。LOOK：http://anders.tyckr.com/2008/03/12/implementing-zend-layout-and-smarty-using-zend-framework-mvc/，不过这个例子我还没有全部看完，先贴上来。以后慢慢看，应该会用在项目中吧？</p>
<p>不然，我就用不了layout了，除非我放弃这个东西。。哈哈</p>]]></description>
			<link>http://www.neatstudio.com/show-692-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-4-1.shtml">PHP Framework</category>
			<pubDate>2009-05-30 21:45</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-640-1.shtml</guid>
			<title>Zend Framework 1.8.0 Released</title>
			<author>gouki</author>
			<description><![CDATA[<div class="article-body">
<p>1.8版本的公布，应该是ZF推动框架和代码标准化的步骤之一吧。随着加入ZF开发的人越来越多，ZF的功能越来越强大，但代码也越来越庞大了。</p>
<p>新版本主要是有两个特色功能：1是快速构建项目开发，利用cli程序来进行快速推荐，2是简化了云计算的操作（这主要应该是ZF和amazon的合作导致的吧？）</p>
<p>快速构建项目的功能，应该是比较让用户开心的，虽然zs6已经能够创建ZF项目，但还是有很多controller,action,model需要用户一一去创建，这，虽然不复杂，也如果多的话，也很繁琐。如今 ，1.8也让你解放出来了，看图上的命令行界面，你应该知道新版本是多么的方便了吧？（顺便说一下，现在国内的thinkPHP,QeePHP都有类似功能的工具推出，这可是国内走在了前端，他们都是一年前就有推出哦）</p>
<p>本次更新对Zend_Loader_Autoloader作出了更新，它与Zend_loader::autoload()不太一样，是一次新的改进。具体我也不翻译了，可以自己看一下代码就清楚了。这主要是对SPL的autoload所不能解决问题的一些改进，比如类名前缀等</p>
<p>云计算也是此次的亮点，但我一般用不了amazon的东西，所以我也不想翻译这些东西了。相信国内也用不了这些，哈哈</p>
<p>最后的更新，请看英文版最后的：Other Contributions，看看里面是不是有你想要的东西。</p>
<p>&nbsp;</p>
<p>I'm pleased to announce the Zend Framework 1.8.0 release, the first in our     1.8 series of releases. This release marks the culmination of several     long-standing projects, as well as a formalization of many of our     recommended practices.</p>
<p>There are two major stories in this release: first, the addition of several     components designed to provide and promote Rapid Application Development;     second, two offerings that make using Zend Framework in the cloud easier.</p>
<p><a href="http://framework.zend.com/download/latest">Download it now!</a></p>
<h3>Rapid Application Development</h3>
<p>1.8.0 marks the first public release of <tt>Zend_Tool</tt>.     At its simplest, <tt>Zend_Tool</tt> provides a command-line script that can     be used to ease many common project-related tasks: setting up the project     tree, adding controllers, actions (and related view scripts), model classes,     etc. More advanced users can create their own tool providers that can then     be directly invoked from that script -- or even create their own RPC     endpoints so as to expose the tooling on the web or via a web service.</p>
<p>As an example of it in action, check out this screenshot:</p>
<p style="text-align: center;"><img alt="zf.sh Help Screen" src="http://framework.zend.com/manual/en/figures/zend.tool.framework.clihelp.png" /></p>
<p>In a related vein, 1.8 also introduces <tt>Zend_Application</tt>, which     provides a standard and object oriented method for bootstrapping     applications. Bootstraps may define their own initialization resources, or     draw upon some common plugins to do their work. Additionally, resources may     be bootstrapped individually, allowing you to utilize a common bootstrap     with multiple gateway scripts tailored for different tasks.</p>
<p>One dependency of <tt>Zend_Application</tt> is     <tt>Zend_Loader_Autoloader</tt>. <tt>Zend_Loader_Autoloader</tt> is a     replacement for <tt>Zend_Loader::autoload()</tt>, and solves many of the     issues users have reported with that solution. Additionally, it provides the     ability to manage a stack of namespaced autoloaders, working around some     minor issues of the SPL's autoloader as well as providing opportunistic     matching of namespace prefixes to match your classes quickly. A     subcomponent, <tt>Zend_Loader_Autoloader_Resource</tt> provides a simple     mechanism for mapping classes to the filesystem when the directory structure     may not exactly correspond to the class name. By using an autoloader by     default, you can help keep your code more performant as well as leave class     resolution out of your code -- greatly epediting application development.</p>
<p><strong>Note:</strong> the <a href="http://framework.zend.com/docs/quickstart">Zend         Framework Quick Start</a> has been updated to use <tt>Zend_Tool</tt> and     <tt>Zend_Application</tt>. It's an excellent introduction to these     components as well as Zend Framework's MVC in general.</p>
<h3>Cloud Computing</h3>
<p>Web 2.0 applications have many demands not seen in traditional web     applications. One of these is the need for distributed storage, and another     is the need to scale horizontally on demand as traffic to your site spikes.</p>
<p><a href="http://aws.amazon.com/">Amazon</a> has provided solutions to both     of these problems for several years now with its <a href="http://aws.amazon.com/s3/">Simple Storage Service (S3)</a> and <a href="http://aws.amazon.com/ec2/">Elastic Compute Cloud (EC2)</a>,     respectively.</p>
<p>Amazon S3 provides web services developers may use to store and retrieve     data. The service is distributed, and thus highly scalable, reliable, and     fast. <tt>Zend_Service_Amazon_S3</tt> provides an object oriented approach     to the service, as well as a PHP streams wrapper -- both designed to make     working with S3 from your PHP applications a simple matter.</p>
<p>Amazon EC2 provides a web service to allow launching and managing server     instances within Amazon's data centers. These server instances may be used     at any time for any length of time -- allowing you to scale your site only     when you need to handle extra traffic, or run your services entirely from     the EC2 platform.</p>
<h3>Other Contributions</h3>
<p>The number of community contributions and bug fixes for 1.8.0 has been     phenomenal. Below is a list of the primary feature additions for the     release.</p>
<ul class="ul">
    <li><tt>Zend_Tool</tt>, contributed by Ralph Schindler</li>
    <li><tt>Zend_Application</tt>, contributed by Ben Scholzen and Matthew Weier O'Phinney</li>
    <li><tt>Zend_Loader_Autoloader</tt> and <tt>Zend_Loader_Autoloader_Resource</tt>, contributed by Matthew Weier O'Phinney</li>
    <li><tt>Zend_Navigation</tt>, contributed by Robin Skoglund</li>
    <li><tt>Zend_CodeGenerator</tt>, by Ralph Schindler</li>
    <li><tt>Zend_Reflection</tt>, Ralph Schindler and Matthew Weier O'Phinney</li>
    <li><tt>Zend Server</tt> backend for <tt>Zend_Cache</tt>, contributed by Alexander Veremyev</li>
    <li><tt>Zend_Service_Amazon_Ec2</tt>, contributed by Jon Whitcraft</li>
    <li><tt>Zend_Service_Amazon_S3</tt>, Justin Plock and Stas Malyshev</li>
    <li>Incorporated Dojo 1.3</li>
    <li>Added support for arbitrary Dojo Dijits via view helpers</li>
    <li><tt>Zend_Filter_Encrypt</tt>, contributed by Thomas Weidner</li>
    <li><tt>Zend_Filter_Decrypt</tt>, contributed by Thomas Weidner</li>
    <li><tt>Zend_Filter_LocalizedToNormalized</tt> and         <tt>_NormalizedToLocalized</tt>, contributed by Thomas Weidner</li>
    <li>Support for file upload progress support<tt> in Zend_File_Transfer</tt>, contributed by Thomas Weidner</li>
    <li>Translation-aware routes, contributed by Ben Scholzen</li>
    <li>Route chaining capabilities, contributed by Ben Scholzen</li>
    <li><tt>Zend_Json</tt> expression support, contributed by Benjamin Eberlei and Oscar Reales</li>
    <li><tt>Zend_Http_Client_Adapter_Curl</tt>, contributed by Benjamin Eberlei</li>
    <li>SOAP input and output header support, contributed by Alexander Veremyev</li>
    <li>Support for keyword field search using query strings, contributed by Alexander Veremyev</li>
    <li>Support for searching across multiple indexes in <tt>Zend_Search_Lucene</tt>, contributed by Alexander Veremyev</li>
    <li>Significant improvements for <tt>Zend_Search_Lucene</tt> search result match highlighting capabilities, contributed by Alexander Veremyev</li>
    <li>Support for page scaling, shifting and skewing in <tt>Zend_Pdf</tt>, contributed by Alexander Veremyev</li>
    <li><tt>Zend_Tag_Cloud</tt>, contributed by Ben Scholzen</li>
    <li>Locale support in <tt>Zend_Validate_Int</tt> and         <tt>Zend_Validate_Float</tt>, contributed by Thomas Weidner</li>
    <li>Phonecode support<tt> in Zend_Locale</tt>, contributed by Thomas Weidner</li>
    <li><tt>Zend_Validate_Db_RecordExists</tt> and <tt>_RecordNotExists</tt>, contributed by Ryan Mauger</li>
    <li><tt>Zend_Validate_Iban</tt>, contributed by Thomas Weidner</li>
    <li><tt>Zend_Validate_File_WordCount</tt>, contributed by Thomas Weidner</li>
</ul>
<p>In addition, we recorded well over 200 bug fixes for this release.</p>
<p>Please join me in a hearty round of congratulations and acknowledgment of     all contributors who helped make this release possible through code     contributions, feedback, testing, documentation, translations, and issue     reports!</p>
</div>]]></description>
			<link>http://www.neatstudio.com/show-640-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-4-1.shtml">PHP Framework</category>
			<pubDate>2009-05-03 21:47</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-539-1.shtml</guid>
			<title>使用ZendFramework的时候打印SQL</title>
			<author>gouki</author>
			<description><![CDATA[<p>在使用ZendFramework开发的时候，会遇到要对SQL进行优化的处理，但是从ZEND的DB类里并没有找到输出SQL的方法，唯一看到的输出也是在SELECT类里面有一个__toString()的方法，但这个方法也只能输出SELECT的语句，对于Insert,Update,Delete之类的语句并不能处理。<br />
<br />
开始的时候，很郁闷，后来问HaoHappy，因为他是国内第一批翻译ZF手册的人，果然我一问，他一下子就说，有一个Profiler类可以解决。<br />
翻开手册，Zend_Db_Profiler，里面果然有操作。。（注：类名是凭记忆的，以下内容也是凭记忆写出来的）<br />
<br />
1、在DB的CONFIG里面把profiler打开，如果没有打开，则需要用$profiler =&nbsp; $db-&gt;getProfiler();然后 $profiler-&gt;setEnable(true); (好象记错了，请看手册，我这里只说解决方法)<br />
<br />
2、然后有一个设置 Profiler 的filter条件的，可以设定select,insert,update,delete的操作。<br />
<br />
3、然后根据官方的例子，对SQL进行输出（手册上的例子，只是输出了执行时间最长的SQL哦）。如果需要每条都输出，你得在那个 if 判断外把sql 存储下来，即 $query-&gt;getQuery(); <br />
<br />
4、根据手册，还可以输出到fireBug和利用FirePHP来进行类似的debug，但我试了一下没有成功（&nbsp; QEE 支持 firePHP ,不知道是否借鉴了ZEND的这个功能，猜测而己 ）<br />
<br />
纯粹是一个记录，顺便感谢一下HaoHappy</p>]]></description>
			<link>http://www.neatstudio.com/show-539-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-4-1.shtml">PHP Framework</category>
			<pubDate>2009-03-11 23:08</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-528-1.shtml</guid>
			<title>zf的paginator的疑问</title>
			<author>gouki</author>
			<description><![CDATA[<p>如果按照ZEND的手册，在使用Zend_Paginator类的时候有两种方法，一种是直接new，一种是用factory<br />
当然，用factory是很方便的。只需要Zend_Paginator::factory( $array )就行了<br />
可是，如果这个array很大怎么办？它没有说。。<br />
即使是new Zend_Paginator( Zend_Db_xxx ?$array )［不记得括号中是哪个abstract了］，如果数据量大，他也没办法的呀？？<br />
<br />
今天白天我试着一下子查询了1W多条，立马死掉。<br />
我看网上的例子，大多是要么直接传结果，要么是传 ZEND_DB的查询对象进去。但结果集都不大的，所以顺利运行 了。我不知道结果集是上万的时候会怎么样，呵呵<br />
<br />
最后我是采用了先COUNT出总数，然后用range生成一个大数组传组 Zend_Paginator::factory() ,因为我看他里面的计数是用count的，所以我对factory的数组参数就直接传了这个range出来的数组给它。<br />
<br />
结果，成功了，看来，这也就可以了。只是方法有点妖而己。。<br />
<br />
记录一下，备忘一下。<br />
<br />
Config文件<br />
[paginator]<br />
page.pagemax = 10<br />
page.pagestart = 1<br />
page.itemperpage = 25<br />
<br />
在文件里</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol class="dp-c" start="1">
    <li class="alt"><span><span>&lt;?php&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="comment">//...前面略</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="vars">$request</span><span>&nbsp;=&nbsp;</span><span class="vars">$this</span><span>-&gt;_request&nbsp;;&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="vars">$currentPage</span><span>&nbsp;=&nbsp;</span><span class="vars">$request</span><span>-&gt;getParam(</span><span class="string">'page'</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="vars">$result</span><span>&nbsp;=&nbsp;</span><span class="vars">$table</span><span>-&gt;fetchAll(&nbsp;...&nbsp;条件&nbsp;);&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="vars">$resultCount</span><span>&nbsp;=&nbsp;</span><span class="vars">$table</span><span>-&gt;getCount(&nbsp;...&nbsp;条件&nbsp;);&nbsp;</span><span class="comment">//文件自己实现</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="vars">$resultCountArray</span><span>&nbsp;=&nbsp;range(&nbsp;1,&nbsp;</span><span class="vars">$resultCount</span><span>&nbsp;);&nbsp;</span><span class="comment">//到底是从0到resultCount-1好，还是直接从1到$resultCount好，我没有仔细测试过</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="vars">$paginator</span><span>&nbsp;=&nbsp;Zend_Paginator::factory(&nbsp;</span><span class="vars">$resultCountArray</span><span>&nbsp;);&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="vars">$paginator</span><span>-&gt;setCurrentPage(&nbsp;</span><span class="vars">$currentPage</span><span>&nbsp;)&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&gt;setItemPerPage(&nbsp;25&nbsp;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//这个方法可能写错了，我是凭记忆写的，请看手册</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&gt;setPageRange(&nbsp;10&nbsp;);&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="vars">$this</span><span>-&gt;view-&gt;paginator&nbsp;=&nbsp;</span><span class="vars">$paginator</span><span>;&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p>部分参数在获取失败的情况下，会直接从Config文件里读取，这里就不详细写了，大致应该是：</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol class="dp-c" start="1">
    <li class="alt"><span><span>&lt;?php&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="comment">//.....略</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="vars">$config</span><span>&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Zend_Config_Ini(</span><span class="string">'...path...'</span><span>&nbsp;,&nbsp;</span><span class="string">'paginator'</span><span>&nbsp;);&nbsp;</span><span class="comment">//即Config中[]包含的文字</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="vars">$pageMax</span><span>&nbsp;=&nbsp;</span><span class="vars">$config</span><span>-&gt;page-&gt;pagemax&nbsp;;&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="comment">//取出来的每条数据都是对象了</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>]]></description>
			<link>http://www.neatstudio.com/show-528-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-4-1.shtml">PHP Framework</category>
			<pubDate>2009-03-04 21:24</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-513-1.shtml</guid>
			<title>TP单字母函数整理</title>
			<author>gouki</author>
			<description><![CDATA[<p>这是一篇TdWeb的笔记，在征得他的同意后，我放了上来。他最初是为Lite版本写的，但现在这些单字母函数在标准版里也都同样存在了。因此这些资料在两个版本的ThinkPHP中都同样适用。由于Tdweb偷了点懒，部分代码都是直接复制过来的，所以，我稍做了一下整理（主要是页面样式的稍做更新，同时对于部分语句进行了一些更新，tdweb莫生气）<br />
原文网址：http://bitctw.cn/hl/docs/<br />
原文如下：(我仅针对单字母函数作介绍)</p>
<p>　　TP所有单独的函数，除了两个用来生成项目的buildAppDir之类的，其余都在框架目录/Common/functions.php这个文件里。</p>
<p>　　有人不太喜欢TP这种单字母函数，其实这也是TP的一个特色，如果理解了这些函数的作用，不管是背，还是写，都是非常方便的，接下来我们以字母顺序开始。</p>
<p><strong>A函数（基本是Action的简写）</strong></p>
<p>　　A函数是用来实例化我们的Action类的，例如我们的程序有2个Action分别是IndexAction和TestAction，在 IndexAction中有个myHello方法能够输出hello world，如果我也想在TestAction中也输出同样一段文字怎么办？最原始的方法首先我们导入IndexAction.class.php这个文 件，然后new IndexAction，最后调用myHello方法才行。<br />
<br />
代码一般为 ：</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol class="dp-c" start="1">
    <li class="alt"><span><span>&lt;?php&nbsp;&nbsp;</span></span></li>
    <li class=""><span>import(<span class="string">&quot;@.Action.Index&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="comment">//导入本项目目录下Action目录下的Index.class.php文件。</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">class</span><span>&nbsp;TestAction&nbsp;</span><span class="keyword">extends</span><span>&nbsp;Action{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;index()&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$index</span><span>=</span><span class="keyword">new</span><span>&nbsp;IndexAction();</span><span class="comment">//实例化IndexAction</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="func">echo</span><span>&nbsp;</span><span class="vars">$index</span><span>-&gt;myHello();</span><span class="comment">//调用myHello()方法</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>?&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>那么，如果我们用A函数，怎么写呢？</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol class="dp-c" start="1">
    <li class="alt"><span><span>&lt;?php&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">class</span><span>&nbsp;TestAction&nbsp;</span><span class="keyword">extends</span><span>&nbsp;Action{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;index()&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$index</span><span>=A(</span><span class="string">&quot;Index&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="func">echo</span><span>&nbsp;</span><span class="vars">$index</span><span>-&gt;myHello();&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>?&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>　　呵呵，少写很多代码吧。当然，这还不是最偷懒的方法，请看下边的R()函数，就知道什么是偷懒的极致了。</p>
<p><strong>B函数 </strong></p>
<p>　　这是随着行为应运而生的新生函数，可以执行某个行为，例如B('app_begin');就是在项目开始之前，执行这个行为定义的所有函 数,支持2个参数，第二个参数支持需要接受一个数组，例如B('app_begin',array(&quot;name&quot;=&gt;&quot;tdweb&quot;,&quot;time&quot;=&gt;time()));这样。</p>
<p><strong>C函数 </strong></p>
<p>　　获取配置值，这个大家用的应该不少。虽然使用方便，但是C函数无疑是一个非常强大的函数。</p>
<p>获取值：　　<br />
获取所有设置：C(); 不传递任何参数，返回一个包含所有设置的数组。<br />
获取指定配置：C('URL_MODEL') 这样就能得到URL_MODEL的配置信息<br />
获取指定二维数组配置：C(&quot;array.name&quot;)，这样就返回数组array下的key为name所对应的值<br />
<br />
设置值：<br />
为二维数组赋值C(&quot;array.name&quot;,&quot;value&quot;)，原理同上（获取array.name的值），后边的value是值</p>
<p>批量赋值： <br />
$test=array(&quot;URL_MODEL&quot;=&gt;1,&quot;THIN_MODEL&quot;=&gt;true&quot;);<br />
C($test);<br />
这样直接将数组里的值赋值了</p>
<p>判断是否赋值：<br />
C(&quot;?URL_MODEL&quot;)这样前边加个&quot;?&quot;，如果已经赋值，则返回true</p>
<p>　　需要说明的是，这里虽然更改了配置的值，但是仅仅是这个页面做了更改，到下个页面就不起作用了，如果想改就永久更改，那么需要配合F函数，将配置文件写入config.php才行。</p>
<p><strong>D函数 </strong></p>
<p>　　DAO函数应该是我们写程序用的最多的函数了。和A函数类似，如果不使用D函数，就需要导入Model，然后new Model，剩下都是一样的。</p>
<p>　　但是D函数有2个有点，一是如果之前实例化过这个Model，那么就不再实例化了，剩资源；二是方便调试，如果不存在 这个Model，会抛出TP异常，非常人性化。</p>
<p>　　如果访问本项目的Model直接D(&quot;Model名称&quot;);就可以了，如果打算跨项目访问，就使用 D(&quot;Model名称&quot;,&quot;项目名称&quot;);其他的就没什么说的了</p>
<p><strong>F函数 </strong></p>
<p>　　快速读取和保存文件数据</p>
<p>　　快速保存数据：F(&quot;mydata&quot;,&quot;这里是要保存的数据&quot;)，这样就在项目Data目录下保存了一个名叫mydata.php的文件，里边的内容是该函数的第二个参数。</p>
<p>　　指定保存时间 ：F(&quot;mydata&quot;,&quot;这里是要保存的数据&quot;,&quot;60&quot;)，这样，如果下次再访问，间隔大于60秒则删除次缓存文件。</p>
<p>　　指定保存目录：F(&quot;mydata&quot;,&quot;这里是要保存的数据&quot;,&quot;60&quot;,DATA_PATH) ，这样就指定保存在data目录下</p>
<p>　　立即删除缓存：F(&quot;mydata&quot;,null)，第二个参数传递一个null值，这样就删除了mydate这个缓存</p>
<p>　　读取缓存数据：F(&quot;mydata&quot;)，这样就读取这个缓存了</p>
<p><strong>L函数 </strong></p>
<p>　　语言定义函数，L(&quot;intro&quot;)获取定义成intro的语言，l(&quot;intro&quot;,&quot;介绍&quot;)为intro赋值，关于这个赋值的长久性，道理同C函数一样。</p>
<p><strong>R函数 </strong></p>
<p>　　还记得我们的A函数吧，如果仅仅想执行某个方法，其实用R函数更方便，刚才的可以替换成</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol class="dp-c" start="1">
    <li class="alt"><span><span>&lt;?php&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">class</span><span>&nbsp;TestAction&nbsp;</span><span class="keyword">extends</span><span>&nbsp;Action{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;index()&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$index</span><span>=R(</span><span class="string">&quot;Index&quot;</span><span>,</span><span class="string">&quot;myHello&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="func">echo</span><span>&nbsp;</span><span class="vars">$index</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>?&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>&nbsp;呵呵，是不是更简单？</p>
<p><strong>S函数</strong></p>
<p>　　全局缓存读写函数，和C类似，不过是直接写成文件的哦，写在Temp目录下，不过在缓存有一点需要注意，如果缓存名称是aaa，那么缓存生成的文件名称就是md5(&quot;aaa&quot;)的值，值得注意。</p>
<p><strong>U函数</strong></p>
<p>　　U函数是很强大的一个函数，它主要是进行URL组装，同时支持不同模式和路由</p>
<p>例如：<br />
取得当前模块的Action地址 ：U(&quot;/nowMethod&quot;);<br />
取得当前模块的Action地址，并传递参数：U(&quot;/nowMethod?params=test&quot;);</p>
<p>　　（如果不习惯上边那种方式，可以使用U(&quot;/nowMethod&quot;,array(&quot;params&quot;=&gt;&quot;test&quot;);这样的数组方式传递参数，效果是一样的）</p>
<p>　　访问其他模块的方法：U(&quot;Other/otherMethod&quot;)，这样就是访问Other模块下的otherMethod方法<br />
跨项目访问：U(&quot;appname://Other/otherMethod&quot;);<br />
使用路由访问：U(&quot;appName://routeName@moduleName/actionName?params&quot;);</p>
<p>　　另外，如果想直接跳转，那么就在第二个参数写1，例如U(&quot;/nowMethod&quot;,1);这样就直接调转到指定URL了</p>
<p>　　好了，介绍了TP的9大函数，相信你或多或少也有些了解了吧。如果想了解更多更好的功能，请看function.php的代码，注释很详尽</p>
<p>&nbsp;</p>
<p>稍微排版了下，也删了点不太和谐的内容，希望可以给大家带来帮助。。</p>]]></description>
			<link>http://www.neatstudio.com/show-513-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-4-1.shtml">PHP Framework</category>
			<pubDate>2009-02-21 21:16</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-476-1.shtml</guid>
			<title>PHP框架：Treacle 介绍</title>
			<author>gouki</author>
			<description><![CDATA[<p>群友Bopo自己开发了一个PHP的framework。Bopo从认识到现在，大概也有四五年的时间了吧，不过这个框架的年龄并不是特别长，大概只有2年多左右。最早这个框架BOPO是自己做项目的时候一点点的做的，但后来他终于有想法将它逐步扩大成为了一个框架。</p>
<p>最初看到框架的时候，还是一个雏型，现在，比以前好多了，所提供的支持也多了很多。让我们来看看这个糖浆究竟有些什么。</p>
<h2 class="title">Treacle 是个什么呢?</h2>
<div class="text">Treacle 为开发者轻松、快捷的创建应用程序提供帮助。Treacle  框架简单、清晰，容易理解和学习，并且有完全中文化的文档和丰富的示例程序降低学习成本。</div>
<h2 class="title">Treacle 有什么特点?</h2>
<div class="text">
<ul>
    <li>完全跨平台</li>
    <li>完全支持 PHP5</li>
    <li>不倚赖特别的 PHP 扩展模块</li>
    <li>简单、容易理解的 MVC 模型</li>
    <li>丰富的助手对象和组件</li>
    <li>开放源代码，完全中文化的注释和文档</li>
    <li>商业公司提供技术支持</li>
</ul>
</div>
<h2 class="title">如何获取技术支持?</h2>
<div class="text">您可以通过参与我们的论坛来获得技术支持。<br />
官方网址：http://www.treacle.cn/<br />
<br />
可能现在有些简陋，但是期待一下吧。</div>]]></description>
			<link>http://www.neatstudio.com/show-476-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-4-1.shtml">PHP Framework</category>
			<pubDate>2009-01-19 16:05</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-475-1.shtml</guid>
			<title>ThinkPHP发布1.5Lite版</title>
			<author>gouki</author>
			<description><![CDATA[<p>一大早流年就在群里说发布了Lite版本，但是我还没有欣赏一下具体的代码，好象这个版本的想法是用Yhustc那里冒出来的，因为他的Yblog就自行对ThinkPHP 1.5进行了简化只保留了常用的功能，比如：数据库只支持MYSQL（也是，这个博客程序只用MYSQL，其他的一些驱动就可有可无了）。于是流年在这个想法的基础上，花了几天时间进行了Lite的构造。（估计几天的休息时间就这么没有了吧）</p>
<p>官方原文：http://www.thinkphp.cn/Blog/25</p>
<p>发布该版本的原因是很多应用开发要求较高的性能并且不需要很多特殊的功能</p>
<p><font color="#ff0000"><strong>Lite版本提供网站开发最需要的功能，优化性能，更适合大型项目！</strong></font></p>
<p>[ <strong>功能列表</strong> ]<br />
<br />
编译缓存<br />
自动生成<br />
异常处理<br />
URL模式<br />
语言包支持<br />
模板主题支持<br />
空模块和空操作<br />
前置和后置操作<br />
智能数据表识别<br />
自动加载<br />
标签库<br />
类库导入<br />
Vendor支持<br />
ADSL方法<br />
跨库操作<br />
字段映射<br />
URL组装<br />
URL伪静态<br />
原生SQL操作<br />
多数据库连接和切换<br />
分布式数据库支持<br />
支持MySql和PDO<br />
惯例配置<br />
项目配置<br />
动态配置<br />
模块配置<br />
静态缓存<br />
动态缓存<br />
模板引擎和扩展支持<br />
日志处理<br />
SQL日志<br />
调试模式<br />
运行时间显示<br />
页面Trace<br />
类库扩展<br />
自动验证<br />
自动完成<br />
CURD基本<br />
AR模式基本<br />
连贯操作</p>
<p>[ <strong>注意事项</strong> ]<br />
去掉了ORG类库包（自己可以增加扩展）<br />
保留文件缓存驱动<br />
保留内置模板引擎和PHP模板引擎驱动<br />
查询条件只支持字符串<br />
CURD接口和数据库接口已经更改（和标准版不兼容）<br />
视图模型和关联操作已经去掉<br />
模型的数据操作保留了 add save delete find query execute 增加了select方法 并做了参数的调整<br />
去掉了自动获取数据表字段信息 改由模型自己定义或者不定义<br />
保留运行信息和页面Trace显示<br />
去掉了URL路由功能（该部分功能可以用空模块和空操作取代）</p>
<p>[ <a href="http://thinkphp.cn/Down/download/id/107">下载Lite版本</a>&nbsp;]<br />
<br />
Lite版本适合对TP有一定了解的开发人员，并且有PHP开发经验和足够的扩展能力。</p>]]></description>
			<link>http://www.neatstudio.com/show-475-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-4-1.shtml">PHP Framework</category>
			<pubDate>2009-01-19 14:23</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-458-1.shtml</guid>
			<title>TP1.5版本中使用smarty模版引擎的技巧</title>
			<author>gouki</author>
			<description><![CDATA[<p>从TP1.5开始，对于其他的模版引擎有了原生支持（不再是以前那种插件机制了）。<br />
本文以使用smarty模版为例作点简单介绍，其他的，可以参考一下View.class.php中的fetch方法可知。<br />
<br />
TP的SVN中已经含有smarty模版库，因此当你要使用的时候，只需要在项目的config.php里作一点简单的配置：</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol start="1" class="dp-c">
    <li class="alt"><span><span class="string">'</span></span><span><span>TMPL_ENGINE_TYPE</span></span><span><span class="string">'</span></span><span><span> =&gt;&nbsp;</span><span class="string">'smarty'</span><span>,&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//这个是设置引擎为smarty</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p><br />
从2009-01-07下午的SVN版本里，流年为又增加了一个TMPL_ENGINE_CONFIG这个数组，即：</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol start="1" class="dp-c">
    <li class="alt"><span><span class="string">'</span></span><span><span>TMPL_ENGINE_CONFIG</span></span><span><span class="string">'</span></span><span><span> =&nbsp;</span><span class="keyword">array</span><span>(&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'template_dir'</span><span>&nbsp;=&gt;&nbsp;TMPL_PATH&nbsp;,&nbsp;</span><span class="comment">//这个就是tpl目录了</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'compile_dir'</span><span>&nbsp;&nbsp;=&gt;&nbsp;CACHE_PATH&nbsp;.&nbsp;</span><span class="string">&quot;tplCompile/&quot;</span><span>,&nbsp;</span><span class="comment">//这是我自己设定的，模版编译缓存放在这个目录里</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'cache_dir'</span><span>&nbsp;&nbsp;&nbsp;&nbsp;=&gt;&nbsp;CACHE_PATH&nbsp;.&nbsp;</span><span class="string">&quot;tplCache/&quot;</span><span>,&nbsp;&nbsp;&nbsp;</span><span class="comment">//如果需要生成页面缓存，这个也是必须的</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'left_delimiter'</span><span>&nbsp;=&gt;&nbsp;</span><span class="string">'{'</span><span>,&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'right_delimiter'</span><span>&nbsp;=&gt;&nbsp;</span><span class="string">'}'</span><span>,&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'caching'</span><span>&nbsp;=&gt;&nbsp;false,&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'force_compile'</span><span>&nbsp;=&gt;&nbsp;true,&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'compile_check'</span><span>&nbsp;=&gt;&nbsp;true,&nbsp;&nbsp;</span></span></li>
    <li class=""><span>),&nbsp;&nbsp;</span></li>
</ol>
</div>
<p><br />
备注：如果按照我这样的写法，请到cache目录里手动创建tplCompile和tplCache两个目录，否则程序会报错。<br />
报错信息大致为：</p>
<div class="codeText">
<div class="codeHead">XML/HTML代码</div>
<ol start="1" class="dp-xml">
    <li class="alt"><span><span>Catchable&nbsp;fatal&nbsp;error:&nbsp;Object&nbsp;of&nbsp;class&nbsp;Smarty&nbsp;could&nbsp;not&nbsp;be&nbsp;converted&nbsp;to&nbsp;string&nbsp;in&nbsp;D:\local\htdocs\ThinkPHP\Album\Temp\~runtime.php&nbsp;on&nbsp;line&nbsp;145&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p><br />
如果出现这样的报错信息，请先检查这两个目录是否存在<br />
<br />
在项目开发的时候，caching 最好设为false，否则你根本看不到效果。<br />
<br />
如此设定完毕后，你就可以直接在项目中使用了，下面以Index模块的index方法进行举例：在IndexAction.class.php的index的方法里</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol start="1" class="dp-c">
    <li class="alt"><span><span class="vars">$this</span><span>-&gt;assign(</span><span class="string">&quot;test&quot;</span><span>&nbsp;,&nbsp;</span><span class="string">&quot;This&nbsp;is&nbsp;a&nbsp;test&nbsp;string&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="vars">$this</span><span>-&gt;display();&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p>然后到模版里：</p>
<div class="codeText">
<div class="codeHead">XML/HTML代码</div>
<ol start="1" class="dp-xml">
    <li class="alt"><span><span>{$test}&nbsp; <br />
    </span></span></li>
</ol>
</div>
<p>就可以看到输出了。不过，这里需要注意的是，如果你$this-&gt;display()没有指定文件名，那么默认的模版文件就是default/Index/index.html，这点和原先使用TP默认的模版引擎没有什么区别。<br />
出现问题最大的应该是在include方法里，include的使用方法是：{include file=&quot;Public/header.html&quot;}，就象我前面所说，smarty的模版路径只指到了tpl目录，但实际上，我们是在默认的default目录下操作，因此正确的写法应该是{include file=&quot;default/Public/header.html&quot;}<br />
如果我们写的程序要对应多模版，那么，上面那种直接写死default的方法是不行的，还好，TP为我们留了一个常量：TEMPLATE_NAME，于是我们的写法就可以是现在这样：</p>
<div class="codeText">
<div class="codeHead">XML/HTML代码</div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span>{include&nbsp;</span><span class="attribute">file</span><span>=</span><span class="attribute-value">&quot;`$smarty.const.TEMPLATE_NAME`/Public/header.html&quot;</span><span>}&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p>现在试一下，是否公用目录里的header.html被加载了？<br />
<br />
最后再报一个warning。如果是在WINDOWS下面开发并且开启了DEBUG_MODE，那么你在读取模版的时候，页面的Trace信息里，偶尔会出现一个注意：</p>
<p>&nbsp;</p>
<div class="codeText">
<div class="codeHead">XML/HTML代码</div>
<ol start="1" class="dp-xml">
    <li class="alt"><span><span>[&nbsp;09-01-08&nbsp;14:36:02&nbsp;]&nbsp;注意：[2]&nbsp;unlink(./Cache/tplCompile/\%%70^706^706C3AFE%%index.html.php)&nbsp;[function.unlink]:&nbsp;No&nbsp;such&nbsp;file&nbsp;or&nbsp;directory&nbsp;core.write_file.php&nbsp;第&nbsp;44&nbsp;行.&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p><br />
这些信息，可以被忽略掉。模版文件还是会正常的生成和编译的。它只会在第一次生成模版编译文件的时候出现</p>]]></description>
			<link>http://www.neatstudio.com/show-458-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-4-1.shtml">PHP Framework</category>
			<pubDate>2009-01-08 21:22</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-447-1.shtml</guid>
			<title>QEE PHP 发布</title>
			<author>gouki</author>
			<description><![CDATA[<p>QEEPHP终于发布了，没有看到廖羽雷吃笔记本，也是一种遗憾。</p>
<p>要知道QeePHP可是让人等了整整一年，当年论坛上就有人说：宁可相信世上有鬼也不相信老廖的嘴。可见让人有多失望</p>
<p>不过，在昨天凌晨的时候，QeePHP还是提供了下载，不过下载完了之后还没有时间仔细观摩。</p>
<p>初步看了一下，目录结构与ZF相类似，自动加载类库也使用了spl_auto_load，因为使用了这个函数，造成的后果是，文件名全部是小写了。呵呵（不知道原因的可以去查看这个函数）</p>
<p>其他还没有仔细看。</p>
<p>可以先看官方：http://qeephp.com</p>]]></description>
			<link>http://www.neatstudio.com/show-447-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-4-1.shtml">PHP Framework</category>
			<pubDate>2009-01-02 00:47</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-446-1.shtml</guid>
			<title>YY博鼎力之作：ThinkPHP 2008年离线资料包下载</title>
			<author>gouki</author>
			<description><![CDATA[<p>YY博鼎力之作哦，大家支持一下。<br />
除此之外，他还写了一个yBlog，同样请大家支持<br />
http://www.yhustc.com，就是yBlog的官方网站。</p>
<p>介绍：</p>
<p>ThinkPHP  2008年离线资料包，将ThinkPHP论坛使用版面与帮助资料版面2008年所有帖子全部采集生成HTML文件，并添加了全文检索功能。可以在不联网的情况下方便查找论坛中相关问题的讨论，并且可以方便的搜索，比CHM的搜索更强大的搜索。点击搜索结果可以直接来到帖子页，也可以直接通过首页进入相关版面列表，就跟操作BBS一样。</p>
<p>注意：需要安装.NET框架2.0及以上版本</p>
<p>图片：</p>
<p align="center"><a href="http://www.neatstudio.com/attachment.php?id=282" target="_blank"><img src="http://www.neatstudio.com/attachments/date_200901/thumb_3d4873b500fbf23f30f7d91a7d29fc1c.png" border="0" alt="大小: 89.9 K&#13;尺寸: 500 x 366&#13;浏览: 558 次&#13;点击打开新窗口浏览全图" width="500" height="366" /></a></p>
<p align="center"><a href="http://www.neatstudio.com/attachment.php?id=283" target="_blank"><img src="http://www.neatstudio.com/attachments/date_200901/thumb_45b480023800fbc8df7be09db8f28732.png" border="0" alt="大小: 66.32 K&#13;尺寸: 470 x 376&#13;浏览: 517 次&#13;点击打开新窗口浏览全图" width="470" height="376" /></a></p>
<p align="center"><a href="http://www.neatstudio.com/attachment.php?id=284" target="_blank"><img src="http://www.neatstudio.com/attachments/date_200901/thumb_5acbc8043a3a58112d224d5e91b1fe61.jpg" border="0" alt="大小: 72.93 K&#13;尺寸: 469 x 376&#13;浏览: 511 次&#13;点击打开新窗口浏览全图" width="469" height="376" /></a></p>
<p>下载地址：http://www.yhustc.com/ThinkPHP2008.rar</p>
<p>本站分流：<a href="http://www.neatcn.com/attachment/ThinkPHP2008.rar">下载</a></p>]]></description>
			<link>http://www.neatstudio.com/show-446-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-4-1.shtml">PHP Framework</category>
			<pubDate>2009-01-02 00:43</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-265-1.shtml</guid>
			<title>享受TP的DISPATCH功能</title>
			<author>gouki</author>
			<description>文章需要输入密码才能浏览.</description>
			<link>http://www.neatstudio.com/show-265-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-4-1.shtml">PHP Framework</category>
			<pubDate>2008-09-15 23:38</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-209-1.shtml</guid>
			<title>zendframework 1.6终于将SOAP放进去了</title>
			<author>gouki</author>
			<description><![CDATA[<p>1.6版本的zf终于将SOAP放进来了，同时也增加了DOJO的支持。不过我没有想通。为什么那么多的JS框架，最终会选择了DOJO。</p>
<p>这些不是我能够想得通的。还是看看到底更新了什么再说吧。</p>
<p>An overview of new features:</p>
<ul class="disc">
    <li>Dojo Integration
    <ul>
        <li>JSON-RPC</li>
        <li>Dojo Data packing</li>
        <li>Dojo View Helper</li>
        <li>Dijit integration with Zend_Form &amp; Zend_View</li>
        <li>Dojo Library Distribution</li>
    </ul>
    </li>
    <li>SOAP
    <ul>
        <li>SOAP Server</li>
        <li>SOAP Client</li>
        <li>Autodiscovery</li>
        <li>WSDL access</li>
        <li>WSDL Generation</li>
    </ul>
    </li>
    <li>Preview of Tooling Project in Laboratory (see /laboratory folder)
    <ul>
        <li>Command Line Interface</li>
        <li>Project Asset Management</li>
    </ul>
    </li>
    <li>Unit Testing Harness for Controllers</li>
    <li>Lucene 2.3 Index File Format Support</li>
    <li>Zend_Session save handler for Database Tables</li>
    <li>Paginator Component</li>
    <li>Text/Figlet Support</li>
    <li>ReCaptcha Service</li>
    <li>Zend_Config_Xml Attribute Support</li>
    <li>Character Set Option for DB Adapters</li>
    <li>Zend File Transfer Component</li>
    <li>New Media View Helpers (Flash, Quicktime, Object, and Page)</li>
    <li>Support in Zend_Translate for INI File Format</li>
</ul>
<p>This obviously marks a very important step towards a high-quality, highly tested 1.6 GA release. Thanks to everyone who has contributed to this release in any way: with patches/check ins, documentation/translations, and bug reports.</p>
<p>But our work is not yet over! Let's do our best to bring this release to the breaking point to find areas we can improve the release for General Availability. Based on your feedback we will determine in the next few weeks whether we require additional release candidates, so please provide feedback on our issue tracker (<a href="http://framework.zend.com/issues">http://framework.zend.com/issues</a>) as soon as you can and ask any questions/post your experiences on the appropriate mailing list.</p>
<p>Again, the Zend Framework community does NOT recommend this release for production use. We do, however, recommend evaluating new features in this release with existing and new applications.</p>
<p>Enjoy 1.6RC1, and see you on the issue tracker, wiki, and mailing lists!</p>
<p>&mdash;&mdash;&mdash;&mdash;END&mdash;&mdash;&mdash;&mdash;</p>
<p>不知道：Zend File Transfer Component，这个会给我们带来什么样的惊喜？大文件传输还是其他的？下载源码研究一下，哈哈</p>]]></description>
			<link>http://www.neatstudio.com/show-209-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-4-1.shtml">PHP Framework</category>
			<pubDate>2008-08-20 23:53</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-208-1.shtml</guid>
			<title>Zend_Acl and MVC Integration Part I (Basic Use)</title>
			<author>gouki</author>
			<description><![CDATA[<p>原文地址：http://devzone.zend.com/article/3509-Zend_Acl-and-MVC-Integration-Part-I-Basic-Use<br />
<br />
原文内容：</p>
<p><cite>By Aldemar Bernal</cite></p>
<p>So, what is wrong with Zend_Acl and the current MVC implementation in the Zend Framework? there is nothing wrong, it is just that it gets not too obvious for developers how to achieve an optimal integration between these two important parts of the framework.</p>
<p>First at all, this article is based on the following Zend Framework Proporsal (<a href="http://framework.zend.com/wiki/pages/viewpage.action?pageId=39025">link</a>), by this moment this proposal is in Pending Recommendation state.</p>
<p>Well, how it works? There are two key components in this proposal:</p>
<ol>
    <li>A Front Controller Plugin: This component resolves if the current user has access to the page which is being opened.</li>
    <li>An Action Helper: This component allows you to check whether the current user has access inside a controller.</li>
</ol>
<p>Based on these two components, let's try them with an example. Let's talk about a website like DevZone, we would need a controller that work with the user management and another one which will deal with article management, as well we need 3 types of users (roles), one for guests, one for writers and another one which will approve the articles; resuming, we have:</p>
<p><strong>Resources:</strong></p>
<ol>
    <li>user controller.</li>
    <li>article controller.</li>
</ol>
<p><strong>Roles:</strong></p>
<ol>
    <li>Guest.</li>
    <li>Writer.</li>
    <li>Admin.</li>
</ol>
<p>&nbsp;</p>
<h3>Setting up the Zend_Acl component</h3>
<p>After defined what we want to do, the next step will create a Zend_Acl instance which will reflect our model.</p>
<p>&nbsp;</p>
<pre>/** Creating the ACL object */<br />require_once 'Zend/Acl.php';<br />$myAcl = new Zend_Acl();</pre>
<p>&nbsp;</p>
<h3>Creating the roles</h3>
<p>Now we create the roles in our Zend_Acl instance.</p>
<p>&nbsp;</p>
<pre>/** Creating Roles */<br />require_once 'Zend/Acl/Role.php';<br />$myAcl-&gt;addRole(new Zend_Acl_Role('guest'))<br />      -&gt;addRole(new Zend_Acl_Role('writer'), 'guest')<br />      -&gt;addRole(new Zend_Acl_Role('admin'), 'writer');</pre>
<p>&nbsp;</p>
<h3>Creating the resources</h3>
<p>And then we create the resources needed (one per controller) and their relationship with the roles we created.</p>
<p>&nbsp;</p>
<pre>/** Creating resources */<br />require_once 'Zend/Acl/Resource.php';<br />$myAcl-&gt;add(new Zend_Acl_Resource('user'))<br />      -&gt;add(new Zend_Acl_Resource('article'));</pre>
<p>&nbsp;</p>
<h3>Creating the permissions</h3>
<p>Now that we added the roles and resources to our Zend_Acl instance, it's time to explain what actions must be available to which roles.</p>
<ol>
    <li>Guest won't have access to edit, add or approve an article.</li>
    <li>Writer won't have access to approve an article.</li>
    <li>Admin will have complete access.</li>
</ol>
<p>&nbsp;</p>
<pre>/** Creating permissions */<br />$myAcl-&gt;allow('guest', 'user')<br />      -&gt;deny('guest', 'article')<br />      -&gt;allow('guest', 'article', 'view')<br />      -&gt;allow('writer', 'article', array('add', 'edit'))<br />      -&gt;allow('admin', 'article', 'approve');</pre>
<p>&nbsp;</p>
<h3>Creating the access denied view file</h3>
<p>We will need to create a view and an action which will address all those denied users, in order to do it, first we create a new action in our error controller:</p>
<p>&nbsp;</p>
<pre>class ErrorController extends Zend_Controller_Action<br />{<br />    ....<br /><br />    public function deniedAction()<br />    {<br />    }<br /><br />    ....<br />}</pre>
<p>&nbsp;</p>
<p>And then we create our view file (/application/views/scripts/error/denied.phtml) with some warning message:</p>
<p>&nbsp;</p>
<pre>&lt;h1&gt;Error&lt;/h1&gt;<br />&lt;h2&gt;Access denied&lt;/h2&gt;<br />&lt;p&gt;You are trying to access an area which you have not allowed.&lt;/p&gt;</pre>
<p>&nbsp;</p>
<h3>Finishing the configuration</h3>
<p>Okay, we have setup our Zend_Acl configuration, so far, it doesn't look like something new, but the next step is register the controller plugin, this important part takes the Zend_Acl instance we created and then validates it against the current page being accessed by an user.</p>
<p>&nbsp;</p>
<pre>/** Setting up the front controller */ <br />require_once 'Zend/Controller/Front.php'; <br />$front = Zend_Controller_Front::getInstance(); <br />$front-&gt;setControllerDirectory('path/to/controllers'); <br /> <br />/** Registering the Plugin object */ <br />require_once 'Zend/Controller/Plugin/Acl.php'; <br />$aclPlugin = new Zend_Controller_Plugin_Acl($myAcl);<br />$aclPlugin-&gt;setRoleName($currentUserRole);<br /><br />$front-&gt;registerPlugin(new Zend_Controller_Plugin_Acl($acl, 'guest')); <br /><br />/** Dispatching the front controller */ <br />$front-&gt;dispatch();</pre>
<p>&nbsp;</p>
<p>After this configuration is done, once an user enters in our application, depending the role he/she has the page will be displayed or an access denied page will be displayed.</p>
<p>For more information about this you can go to:<br />
<a href="http://framework.zend.com/wiki/pages/viewpageattachments.action?pageId=39025">Zend_Acl &amp; MVC Integration</a><br />
and here is a small implementation source code of this:<br />
<a href="http://framework.zend.com/wiki/download/attachments/39025/ZionFramework.zip">Source Code</a></p>
<p>&mdash;&mdash;&mdash;&mdash;END&mdash;&mdash;&mdash;&mdash;<br />
由于本文并没有什么特别的地方，而且单词也没有什么，故不作翻译。</p>]]></description>
			<link>http://www.neatstudio.com/show-208-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-4-1.shtml">PHP Framework</category>
			<pubDate>2008-08-19 23:20</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-200-1.shtml</guid>
			<title>Adobe to contribute AMF support to Zend Framework</title>
			<author>gouki</author>
			<description><![CDATA[<p>Copy from framework.zend.com , it's submitted of <span class="comment-block">Thursday, July 31, 2008<br />
It's full contents :
<div class="codeText">
<div class="codeHead">XML/HTML</div>
<ol start="1" class="dp-xml">
    <li class="alt"><span><span>Andi Gutmans, the CTO of Zend, blogged yesterday about a new proposal making it&rsquo;s way through the Zend Framework process.  </span></span></li>
    <li class=""><span>Adobe has made a proposal for an AMF (Action Message Format) component in Zend Framework. This ZF component will allow for client-side applications built with Flex and Adobe AIR to communicate easily and efficiently with PHP on the server-side. Leading the design of the component for Adobe is Wade Arnold. Wade already has a track record of bringing the Adobe RIA technologies to PHP as a result of all of his work on AMFPHP.  </span></li>
    <li class="alt"><span>I know everybody over on the Zend Framework team is real excited about this proposal. If you work with Zend Framework then you are going to want to keep an eye on it.  </span></li>
</ol>
</div>
</span></p>
<p>and someone were comments for this news,</p>
<p>&nbsp;</p>
<div class="codeText">
<div class="codeHead">XML/HTML代码</div>
<ol class="dp-xml" start="1">
    <li class="alt"><span><span>This is really great news! I am currently using JSON as the interface format between my Zend Framework and Flex app. This week I've been considering switching to amfphp (Lee Brimelow prepared a screencast http://www.gotoandlearn.com/player.php?</span><span class="attribute">id</span><span>=</span><span class="attribute-value">78</span><span>), but I didn't want to refactor/change all of my code. Zend_Amf is great news. I can't wait to begin using it. Cheers Adobe!   </span></span></li>
</ol>
</div>
<p>&nbsp;</p>
<p>这样看来，以后ADOBE或许也会主动参与了吧？</p>]]></description>
			<link>http://www.neatstudio.com/show-200-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-4-1.shtml">PHP Framework</category>
			<pubDate>2008-08-16 12:16</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-155-1.shtml</guid>
			<title>浅谈TP的COOKIE类</title>
			<author>gouki</author>
			<description><![CDATA[<p>TP的COOKIE类是被封装好的，里面包含了一些常见的操作，set,get,clear等等，其实TP的cookie类与其他的COOKIE有着明显的不同，那就是TP的COOKIE ID是唯一的（不好意思，在我写完这段的时候，为了防止写错，我又重新打开了cookie.class.php，却突然发现，现在的cookie功能与以前的不一样了。）</p>
<p>以前的set函数是类似于这样：
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol start="1" class="dp-c">
    <li class="alt"><span><span class="vars">$_COOKIE</span><span>[C(</span><span class="string">'COOKIE_ID'</span><span>)][C(</span><span class="string">'COOKIE_PREFIX'</span><span>).</span><span class="vars">$name</span><span>]&nbsp;=&nbsp;</span><span class="vars">$value</span><span>&nbsp;;&nbsp;&nbsp;</span></span></li>
</ol>
</div>
如今的又恢复成：
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol start="1" class="dp-c">
    <li class="alt"><span><span class="vars">$_COOKIE</span><span>[C(</span><span class="string">'COOKIE_PREFIX'</span><span>).</span><span class="vars">$name</span><span>]&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;</span><span class="vars">$value</span><span>;&nbsp;&nbsp;</span></span></li>
</ol>
</div>
</p>
<p>既然如此，我还是按最新的稍作讲解吧。。。</p>
<p>Cookie类，固名思意，就是把对COOKIE的操作进行了封装，通过定义一个COOKIE名的前缀，以防与其他COOKIE产生冲突，然后加上COOKIE变量的名称，就可以进行赋值、取值等。</p>
<p>Cookie类所有的操作都采用了静态方法，即在实际应用中，只要加载了Cookie类，就可以随时使用了：
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol start="1" class="dp-c">
    <li class="alt"><span><span>&lt;?&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="comment">//假设cookie&nbsp;前缀为&nbsp;'neatcn_'</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>Cookie::get(<span class="string">'test'</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="comment">//return&nbsp;$_COOKIE['neatcn_test'];</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>Cookie::set(<span class="string">'test'</span><span>,</span><span class="string">'123456'</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="comment">//return&nbsp;setcookie('neatcn_test','123456',xxx,xxx,xxx);</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="comment">//xxx是默认定义的常量，如默认COOKIE的过期时间，作用域等</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
对于这些封装，可以方便使用，同样需要注意的是，在Cookie操作时，请不要输出header，否则可能会出现header already send的warning，同时无法写cookie，这点请需要注意。</p>
<p>另外一个需要注意的是，cookie在不同的浏览器下面有着不同的限制，最常见的就是cookie的长度，请尽量不要超过4K的字节。</p>
<p>参考资料：</p>
<p>
<div class="codeText">
<div class="codeHead">FF浏览器</div>
<ol start="1" class="dp-xml">
    <li class="alt"><span><span>*&nbsp;一个&nbsp;Cookie&nbsp;档案最多只能包含&nbsp;300&nbsp;个&nbsp;Cookies。（这只适用于&nbsp;Netscape，因为它把所有的&nbsp;Cookie&nbsp;都放在一个档案。）&nbsp;&nbsp;</span></span></li>
    <li class=""><span>*&nbsp;每一个&nbsp;Cookie&nbsp;的大小不得超过&nbsp;4KB。&nbsp;&nbsp;</span></li>
    <li class="alt"><span>*&nbsp;每一个&nbsp;URL&nbsp;路径，最多只能设定&nbsp;20&nbsp;个&nbsp;Cookie。&nbsp;&nbsp;</span></li>
</ol>
</div>
</p>]]></description>
			<link>http://www.neatstudio.com/show-155-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-4-1.shtml">PHP Framework</category>
			<pubDate>2008-07-30 23:04</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-114-1.shtml</guid>
			<title>ThinkPHP怎么样更好的使用Smarty第三方插件</title>
			<author>gouki</author>
			<description><![CDATA[<p>如果你在使用ThinkPHP框架的时候不想采用TP自带的模版系统，而使用第三方的模版系统，你有很多其他的选择，在这里我仅介绍Smarty这种比较官方，而且比较强大的模版系统。</p>
<p>由于Smarty兼容PHP4，因此，它的效率会相对低一点点，这个低只是相对的，估计等Smarty啥时候正式放弃PHP4的时候，效率可能会上很大一个台阶。</p>
<p>&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;&hellip;</p>
<p><strong>最多请看全文。</strong></p><br /><br /><a href="http://www.neatstudio.com/show-114-1.shtml" target="_blank">阅读全文</a><br /><br />]]></description>
			<link>http://www.neatstudio.com/show-114-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-4-1.shtml">PHP Framework</category>
			<pubDate>2008-06-26 23:02</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-72-1.shtml</guid>
			<title>为ThinkPHP开发自定义标签几个注意事顶</title>
			<author>gouki</author>
			<description><![CDATA[<p>ThinkPHP的模版引擎强大就强大在于它可以使用XML标签来为TP模版引擎进行扩展，因此TP的标签功能就成了TP模版的亮点所在。要想让TP的模版功能更加强大，你就得学会扩展TP的标签功能，即：自定义标签</p>
<p>开发自定义标签功能的时候，有几个注意的地方，<br />
1、文件名的规范性，这个当然是不用多解释了，TagLibInput.class.php<br />
&nbsp; &nbsp; （TagLib加是你定义的标签名，首字符大写，这样你的文件名中的Input就会自动认为你的XML文件名）<br />
2、目录所在：目前暂时还是存放到THINKPHP的核心类库里，目录为：/THINKPHP/Lib/Think/Template<br />
&nbsp; &nbsp; 主程序文件放到：/THINKPHP/Lib/Think/Template/TagLib/ 目录下<br />
&nbsp; &nbsp; 自定义的XML文件放到：/THINKPHP/Lib/Think/Template/Tags/ 目录下<br />
<br />
&nbsp; &nbsp; （自定义的文件是小写的标签名，即刚才类名中的Input的小写）<br />
<br />
<font color="#0000ff">注意事顶：</font><br />
&nbsp; &nbsp; 如果你发现你自定义的标签没有被解析，请按如下方法进行检查（以input标签为例）<br />
&nbsp; &nbsp; 1、查看文件开始的地方是否加载了&lt;tagLib name=&quot;cx,html,input&quot; /&gt;,同时，请检查是否符合XML规范，如：标签一定要闭合。例：&lt;br /&gt;，否则会出现XML解析错误<br />
&nbsp; &nbsp; 2、检查文件是否都为UTF－8编码，因为在解析XML的时候，都是采用UTF8编码，如果不是UTF8编码，会出现一些奇怪的解析错误，很多时候都会出现simpleXml解析器错误，如果出现这种错误，请检查文件编码，如果是UTF8编码的文件，请同时检查文件头是否存在BOM标记。<br />
&nbsp;&nbsp;&nbsp; 3、自定义的标签中，是否忘了双引号。由于在写HTML的时候，很容易忽略双引号，比如&lt;input type=text name=name&gt;，如果是这样，在被当成XML解析的时候，肯定会报错的，正确的写法应该是：&lt;input type=&quot;text&quot; name=&quot;name&quot; value=&quot;value&quot; /&gt;（标签要闭合），如果是自己自定义的标签，则应该这样写：&lt;input:text name=&quot;&quot; value=&quot;&quot; /&gt;</p>]]></description>
			<link>http://www.neatstudio.com/show-72-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-4-1.shtml">PHP Framework</category>
			<pubDate>2008-04-23 09:29</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-71-1.shtml</guid>
			<title>解决使用ThinkPHP框架自带模版程序处理&lt;??&gt;出现的问题</title>
			<author>gouki</author>
			<description><![CDATA[<p>使用ThinkPHP自带的模版引擎处理模版问题时，一般情况下不会有什么问题。</p>
<p>但是，在处理一些XHTML模版时，可能会遇到以下问题，比如，模版作者在制作模版时，为了规范页面，往往在文件头部加上<span style="color: #007700">&lt;?</span><span style="color: #0000bb">xml&nbsp;version</span><span style="color: #007700">=</span><span style="color: #dd0000">&quot;1.0&quot;&nbsp;</span><span style="color: #0000bb">encoding</span><span style="color: #007700">=</span><span style="color: #dd0000">&quot;utf-8&quot;</span><span style="color: #0000bb">?&gt;，<font color="#000000">表明文件是属于XML规范，所有的标签都必须遵循XML的相关规定。</font></span></p>
<p><span style="color: #0000bb"><font color="#000000">然而，默认的ThinkPHP模版引擎在处理的时候会出现错误，处理这个错误的情况有以下几种办法。</font></span></p>
<p><span style="color: #0000bb"><font color="#000000">第一种方法：你尝试关闭PHP的短标签功能<br />
第二种方法：试着用&lt;literal&gt;&lt;/literal&gt;标签把XML的标签包含起来，即 <br />
</font><code id="code1"><span style="color: #007700">&lt;</span><span style="color: #0000bb"><font color="#000000">literal&gt;</font></span><span style="color: #007700"><font face="Tahoma"><span style="color: #007700">&lt;?</span><span style="color: #0000bb">xml&nbsp;version</span><span style="color: #007700">=</span><span style="color: #dd0000">&quot;1.0&quot;&nbsp;</span><span style="color: #0000bb">encoding</span><span style="color: #007700">=</span><span style="color: #dd0000">&quot;utf-8&quot;</span><span style="color: #0000bb">?&gt;</span></font></span>&lt;/<font color="#000000">literal</font>&gt;</code> </span>
<p>&nbsp;</p>
</p>
<p><font color="#000000">第三种方法：修改ThinkPHP/Lib/Think/Template/ThinkTemplate.class.php的compiler函数，在函数的最后一行return $templContent;前加入</font></p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol class="dp-c">
    <li class="alt"><span><span class="comment">//&nbsp;将&lt;?标签用echo方式输出 </span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span class="vars">$tmplContent</span><span>&nbsp;=&nbsp;preg_replace(</span><span class="string">'/(&lt;?(?!php|=|$))/i'</span><span>,&nbsp;</span><span class="string">'&lt;?php&nbsp;echo&nbsp;'</span><span>\1</span><span class="string">';&nbsp;?&gt;'</span><span>.</span><span class="string">&quot;n&quot;</span><span>,&nbsp;</span><span class="vars">$tmplContent</span><span>&nbsp;); &nbsp;&nbsp;</span></li>
</ol>
</div>
<p><font color="#000000">任何一种方法理论上都可以，第一种第二种方法实在不行的时候，再用第三种，毕竟第三种方法是改动核心的，如果以后更新核心库，可能会不当心就覆盖掉了。</font></p>
<p><font color="#000000">不过，流年说过了，他已经更新了模板引擎的解析类，并且专门判断了是否开启了短标签，如果开启的话会自动用第三种方法解析。更新下SVN的ThinkTemplate.class.php 文件就可以了（可能压缩包还没有同步更新[2008-04-22]）。<br />
</font></p>
<p>&nbsp;</p>]]></description>
			<link>http://www.neatstudio.com/show-71-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-4-1.shtml">PHP Framework</category>
			<pubDate>2008-04-23 09:13</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-13-1.shtml</guid>
			<title>ThinkPHP两周年，同时有新的更新</title>
			<author>gouki</author>
			<description><![CDATA[<p><strong><img src="http://www.neatcn.com/attachments/date_200802/78c8490a3b6bd1a40670ca61be3b8c95.jpg" alt="" /><br />
</strong></p>
<p><strong>官方的话：</strong><br />
新年的气氛即将恢复平静，ThinkPHP也快2岁了，这是一个让所有关注和支持ThinkPHP的朋友们值得祝贺的时刻，官方也准备了一份礼物以回馈大 家的支持，感谢大家和ThinkPHP风雨同舟一起度过。届时将开通ThinkPHP官方在线体验中心，给大家送上丰富的示例和演示，而且还将发布一个更 新版本，包含了值得期待的项目目录自动创建功能和众多的完善。<strong><font color="orangered">新手们有福了，呵呵~希望2008奥运年大家红红火火，继续努力！</font></strong><br />
<strong><font color="royalblue">　　PS：了解ThinkPHP发展历史的人应该猜到2周年是什么时候了，呵呵~</font></strong></p>
<p><font color="royalblue">目前，官方还推出了新的示例中心，网址是：http://exp.thinkphp.cn/Examples/</font><strong><font color="royalblue"><br />
</font></strong></p><br /><br /><a href="http://www.neatstudio.com/show-13-1.shtml" target="_blank">阅读全文</a><br /><br />]]></description>
			<link>http://www.neatstudio.com/show-13-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-4-1.shtml">PHP Framework</category>
			<pubDate>2008-02-22 20:55</pubDate>
		</item>
	</channel>
</rss>
