CakePHP


CakePHP的MVC三部分都有一些和Cache相关的设置:
如Model里的cacheQueries属性,如果此属性被设置为true,那么假设我们在一次请求里,重复执行某条SELECT SQL,那么在第一次查询的时候其结果会被缓存(保存到一个数组里),以后重复的查询将会直接得到结果。
Controller里的cacheAction必须满足三个条件才能生效:
1. 在配置文件core.php里设置:Configure::write(‘Cache.check’, true);
2. 在控制器中加载Cache助手:var $helpers = array(‘Cache’); (可以统一放在app_controller.php里)
3. 在控制器中设定$cacheAction属性,如:var $cacheAction = true; 或者 var $cacheAction = "1 hour";
注意:设定$cacheAction的时候,可以使用数组的方式,如:
var $cacheAction = array(
    ‘view/1′ => 123456,
    ‘view/2′ => ’1 year’
);
Controller里的persistModel属性比较有趣,如果设置为true,那么在此Controller里用到的Model会被序列化后缓存,据说从一个序列化后的缓存文件里加载数据,然后反序列化后得到说要的对象,比直接用new实例化有效率。
View的模板里可以使用<cake:nocache></cake:nocache>把不需要缓存的部分隔出来。不过并不是所有的变量都可以放在<cake:nocache></cake:nocache>之间,你只要看看实际生成的缓存文件就应该明白,视图缓存文件的原理是生成一个渲染后的php文件,并且缓存文件里面附带有controller的基本信息,在缓存有效的时间内,同样的请求会跳过action的执行,直接使用视图缓存。所以如果你在action里set出来的视图变量就不可能放在cake:nocache里,action并不执行,这样的变量不会生效,如果你一定要实现类似的功能,可以尝试使用requestAction方法。
另外,Model里在执行save和del方法的时候,会通过钩子方法更新缓存文件。
参考链接
==================
View里的renderElement方法已经不推荐使用了,取而代之的是使用element方法,现在似乎流行直接用名词做方法名,似乎说法是这样更DSL,不过我现在还不太习惯这样的方式。
==================
尽量避免在controller中使用requestAction,而应该尽可能的结合view中的element使用requestAction。

加载基本文件 

cake/basics.php 里面定义了常用的方法以及时间常量 

$TIME_START = getMicrotime(); 记录开始执行时间 

cake/config/paths.php 里面定义一些基本路径 

cake/lib/object.php cake的基本类 

cake/lib/inflector.php 这里主要是处理单复数,带下划开命名以及驼峰式命名 

cake/lib/configure.php 里面提供文件配置的读写,路径的设置,以及加载文件的方法 

cake/lib/cache.php 缓存的操作 



Configure::getInstance(); 开始对项目的配置 

config/core.php 项目的配置文件 

config/bootstrap.php 项目的入口文件 



App::import(‘Core', array(‘Dispatcher')); 加载核心,开始做正事了,GO 

$Dispatcher = new Dispatcher(); 

$Dispatcher->dispatch($url); 开始执行,通过对当前的url解析,如果你设置了压缩Js、Css,则对这些文件压缩输出,如果你对页面设置缓存,则直接输出缓存页面,最后查找相应的Controller。如果找不到,则进行相应的错误处理。 

实例化当前Controller,确定视图路径,实例化Component,获得仅当前Controller[不包含父类Controller]的方法 

对当前Controller中私有方法、带admin路由或者带prefix的方法进行保护,不允许直接访问 

设置当前Controller的基本属性,如base、here、webroot、plugin、params、action、 passedArgs[array_merge($this->params['pass'],$this->params['named'])] 

调用Controller中的constructClasses方法 

执行__mergeVars方法,该方法对父子类的components、helpers、uses等属性进行特殊合并处理 

调用Component->init()方法,载入用户设置的系列components(Session为默认),并默认enabled属性为true。(该属性可以后期在beforeFilter里修改) 

调用Component->initialize()方法,若系列components里有这个initialize方法并且该component 的enabled为true,则调用该components->initialize方法(这里enabled用户好像无法通过 Controller设置,只能为true) 

调用当前Controller中beforeFilter()方法,这个方法是个好东西^_^ 

调用Component->startup()方法,同样,若系列components里有这个startup方法并且该component的 enabled为true,则调用该components->startup方法(这里enabled倒是可以通过beforeFilter设 置),该方法也是components里最重要的方法,比如Auth就在这里大作文章^_^ 

开始执行当前Controller里的Action方法 

如果设置autoRender为true,则根据调用当前Controller的render()方法,否则返回或输出Action方法的返回的数据 

调用Controller的render()方法时,先调用当前Controller中的beforeRender()方法 

加载视图渲染类 

调用Component->beforeRender()方法,同样,若系列components里有这个beforeRender方法并且该 component的enabled为true,则调用该components->beforeRender方法(这里enabled可以通过 beforeFilter设置) 

获取当前Model的数据验证错误信息,给View使用 

调用View的render()方法 

载入相关Helper助手 

调用Helper的beforeRender()方法 

调用Helper的afterRender()方法 

相关的缓存处理 

执行renderLayout()方法,当然前提你要允许渲染布局,默认为default.ctp布局文件 

调用Helper的beforeLayout()方法 

调用Helper的afterLayout()方法 

调用Component->shutdown()方法,同样,若系列components里有这个shutdown方法并且该component的 enabled为true,则调用该components->shutdown方法(这里enabled可以通过beforeFilter设置) 

执行当前Controller里的afterFilter方法,这里你可以对视图的输出内容($controller->output)做一些处理 

返回或输出视图数据。 

流程完毕。

前言:CakePHP is great rapid development php framework. CakePHP allows you to create applications with ease. But in case you CakePHP lover need to create simple sites or applcations, maybe you considering to use one of the CakePHP based CMS than developed yourself from scratch.

1、Wildflower

Wildflower内容管理系统和应用平台的基础是CakePHP的框架和jQuery的 Javascript库,是标准的开放源代码和用户友好界面。

Features特征

  • 评论完全与Akismet垃圾邮件的检查。
  • 更多文章和评论模型单元测试。
  • 包括最新的CakePHP的- r7117。
  • 网页中包含的内容修改和工作预览。
  • 增强错误修正。

2、Croogo

Croogo is a CakePHP powered Content Management System.

croogo-600x394

特征

  • 内容类型:您可以创建自己的内容类型
  • 博客
  • 节点
  • 所见即所得编辑器
  • 附件(用于图像和文件上传)
  • 评论
  • 嵌套评论
  • 电子邮件通知
  • Moderation 缓和
  • 垃圾邮件防护(需要Akismet API密钥)
  • captcha(需要Recaptcha API密钥)
  • 聚合:RSS资讯
  • 个别内容类型
  • 所有推广项目
  • 搜索引擎优化
  • 搜索引擎友好的URL
  • 完全控制meta标签
  • 自定义字段
  • 菜单管理器
  • 支持块
  • 联系方式
  • 邮件归档
  • 文件管理器
  • 多用户
  • ACL的管理(权限)
  • 主题
  • 基于Web的管理
  • MIT许可证

3、CupCake CMS

CupCake CMS is an Open Source Content Management System built using CakePHP. 其目的是提供一个简单的网页设计师和易于部署工具来管理内容中小型无需编程即可完成所有的代码.通过简单易用的界面和所见即所得的编辑器(FCKEditor),内容可以创建和更新单行网站,通过授权的用户无需学习HTML的需要。

对于那些对其他开源CMS应用熟悉,CupCake是一种轻便的设计为导向的内容管理系统,这意味着对网站的快速部署。

4、Lumad CMS

Lumad CMS是一个开放源码的内容管理平台,为开发者提供了一种快速,简单的接口设计,管理小型网站的意思。 伊塔€™š不是一个社区驱动像Drupal,也不是工作流驱动,企业如Typo3 CMS。

  • 发展现状:2 – Pre-Alpha
  • 环境: Web Environment
  • 目标用户: 开发人员 , 最终用户
  • 许可: 麻省理工学院/ X联盟许可证
  • 自然语言: 英语
  • 操作系统: 操作系统无关
  • 编程语言:PHP
  • 主题: 动态内容 , 网站管理

5、OvenCMS

OvenCMS是一个开源的CMS,由CakePHP的框架和jQuery JavaScript库建成。OvenCMS完全模块化,有工作插件(模块)很多。

结束语

本文来自:5 CakePHP based Content Managament System 翻译

来源

Cakephp的很强大的i18n功能就是用来实现本地化和国际化的。他通过使用语言配置文件使得程序能够很好的适应变化进行本地化。通过新建locale/chi/LC_MESSAGES/default.po文件,并指定语言选项为“chi”实现。本文中说的就是如何实现这个本地化过程,当然本文中的poedit并不是必须的,但是他可以使得工作效率更高。
一、关于i18n和L10n
这2个东东其实头一次我看到的时候也是一头雾水,但是经过百度的一通搜索,得出的结论就是,不管是几个n,最终的目的就是实现程序本地化就好了,说白了,就是由很多的语言配置文件,反正我是这么理解的。大家也可以去看看,
http://baike.baidu.com/view/372835.htm
这里有很详细的说明。
二、在Cakephp里面,实现本地化的方法
目前为止,有2种配置方法。
2.1 方法一
在config/core.php中使用configure::write来制定语言文件。
Configure::write(’Config.language’,”chi”);
2.2 方法二
官方说明:
http://book.cakephp.org/view/162/Localizing-Your-Application

貌似很复杂的说哦。
view source

print
?
01.App::import(‘Core’, ‘l10n’);
02.class TestsController extends AppController{
03.  $name=”Tests”;
04.  function test_function(){
05.    $this->L10n->new L10n();
06.    $this->L10n->get(“chi”);
07.    …..
08.  }
09.}
2.3 做上边设置改动后需要做的:
当然在上面做修改后,还需要修改对应的ctp文件等哦,
所有的直接输出字符串,没有返回值的地方像这样:
view source

print
?
1.__(“english”);
间接输出字符串,有返回的地方:
view source

print
?
1.__(“english”,true);
还有input要加个label来使他出现中文。
view source

print
?
1.__(“english”);echo $form->input(‘name’,array(‘label’=>__(‘name’,true)));
2.4 最最重要的一步
就是要编辑这个文件了,locale/chi/LC_MESSAGES/default.po。中间的chi就是语言文件的标志位了。这个文件的格式也很简单,
msgid “Chinese”
msgstr “中国话”
这个的简单重复就行了。
三、使用poedit
使用poedit不是必须的,但是可以使工作变得简单的多。官方网站是:
http://www.poedit.net/

他的主要功用就是使得编辑语言配置文件更加方便和快捷。下面是使用poedit的一些简单的截图和说明。
3.1 头一次使用需要选择界面语言



3.2 新建一个配置文件,就是我们的目的文件po文件了


工程信息这里当然要选择好utf8格式了

路径这里的基本路径填写cakephp的目录,当然这里居然没有浏览功能,真是崩溃。
注意这里要通过下面的新建按钮新建一个名为“.”的路径,这样的话,以后就可以搜索基本路径下面的子目录了。

关键字选项卡里面要填上cakephp的标志性本地化函数“__”。

当然上面那些选项卡设置好之后,还可以通过菜单类目=》设置调出来,从新设置。
3.3 点击那个小地球图标或者类目=》自源更新,开始自动扫描该翻译的文字了



3.4 但是这个时候,你可能会发现扫描出来的字段远远少于你需要的东东,原来这个软件不认识ctp文件。这个步骤的设置是让他能识别ctp文件设置。文件=》首选=》解析器。
本步骤参考了一个意大利程序员的博客文章,在此向他表示感谢先。

http://www.luizz.it/119/cakephp/poedit-e-i-file-ctp


选中php,选择编辑,然后在第2行内输入ctp文件后缀,如下图,但是注意下图的设置是错误的!虽然上面的提示,是用逗号分隔,但是实践证明,用分号才是正确的选择。这个很令人崩溃,大概是poedit的一个小bug吧。会出现错误提示。


但是如果用分号分隔的话,仍然会看到如下错误提示。

需要在下面的解析器命令下面增加个选项 –language=php,注意这里是两个中划线啊。所以这个步骤的要点就是下图所示了。

3.5 这里通过那个地球图标就可以找出所有需要翻译的字段了,当然这个操作的前提是你已经用__函数把所有的字段都标示好了。如果你按这个图标之前进行了部分翻译,这个操作如果发现了新字句,这个软件会根据以前的翻译自己翻译字句的,并用棕色突出显示它自动翻译的词语。当然,一般都是不准确的。所以还是需要进行修改保存操作的说。


3.6 如果这个时候你查看生成的po文件的时候,比自己手写的文件确实多些设置。

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/59571/showart_2055127.html

Q:CakePHP官方文档在哪里

A:http://book.cakephp.org/cn/view/876/The-Manual

Q: 如何替换cake默认的layout(全局模板页)?
A: 把在/cake/libs/view/templates/layouts/default.ctp 复制到 /app/views/layouts/default.ctp ,然后按需修改

Q: 使用UTF8 库时出现乱码(页面和?菘舛际荱TF8,只是显示取出的数据时乱码)?
A: 在1.2x中:在/app/config/databases.php的配置中添加’encoding’ => ‘UTF8′,cake则会在执行SQL前先执行一次SET NAMES $encoding

Q: model/behavior,view/helper,controller/component 之间是什么关系?
A: model view controller是常说的MVC模式,model一般负责数据存储,view负责页面显示(一般是页面模板),controller负责控制调用哪个model以及哪个view来显示结果,其他则是他们各自的辅助部分。

Q: 如何建立一个公共的controller(如何使所有controller都有相同的属性或方法)?
A: 把/cake/app_controller.php 复制到 /app/app_controller.php ,按需修改即可。(为什么是放到/app目录下而不是/app/controllers中呢?)

Q: 如何建立一个公共的model(如何使所有model都有相同的属性或方法)?
A: 把/cake/app_model.php 复制到 /app/app_model.php,按需修改即可。(为什么是放到/app目录下而不是/app/moclels中呢?)

Q: 如何建立一个公共的helper(如何使所有helper都有相同的属性或方法)?
A: 同上,推理可得。

Q: 如何使controller不自动加载model(建立一个不需要model的controller)?
A: 在controller中添加一个空值属性:var $uses = ”;

Q: 如何建立不需要读取数据库的model?
A: 添加属性声明:var $useTable = false;

Q: 如何在controller中调用多个model?
A: 添加属性声明:var $uses = array(‘Model1′, ‘Model2′);

Q: 如何在controller中临时(手工)调用其他model?
A: How to properly create a Model instance manually
Creating Reusable Elements with requestAction

Q: 在controller中如何调用component?
A: 在controller中声明:var $components = array(‘Mycomponent’);,然后就可以在方法中通过 $ths->Mycomponent 来调用

Q: 如何在component中访问controller
A: 在1.1.x中可以这样:
class RequestComponent extends Object
{
var $controller;
function startup(&$controller)
                                {
                                 $this->controller = &$controller;
                                }

}

Q: 如何使controller的方法不能直接通过URL访问?
A: 在方法名前加个_,如:function _test()

Q: 在controller的一个方法中,如何调用另一个方法的输出结果?
A: $this->render(‘另一个方法名’);,相关的还有$this->requestAction,详细见手册。

Q: 如何让view可以使用其他helper?
A: 在controller中声明:var $helpers = array(‘Form’,'Text’); (注:html是默认就有的,在1.2x中不需要再包含进去)

Q: 怎样在cake中使用smarty?
A:

Q: 如何获取由$form->input(‘var’)提交的数据?
A: 在controller中通过$this->params['url']['data'][$this->controller->modelClass]['var'] 取得

Q: 如何取得URL中如/store/buy/12 的参数值?
A: 在controller中通过$this->params['pass'][0] 取得

Q: 如何在cake中使用AJAX?

Q: 如何映射一个controller(不建立controller但可以使不同的URL指向同一个controller)?

Q: 如何在一个model中调用其他model?

Q: 如何使controller的action不调用它的view(没有view的action)?

Q: 如何动态关闭cakeSqlLog?
A: /app/config/core.php中,将Configure::write(‘debug’, 2);修改为Configure::write(‘debug’, 0);

Q: 如何在一个helper中调用另一个helper?
A: 设置var $helpers = array(‘Myhelper’); ,然后就可以在类中用$this->Myhelper来调用(注意属性大小写)

下一页 »