存档

‘CakePHP’ 分类的存档

5个基于CakePHP的开源CMS

2010年9月7日 Jansfer 没有评论

前言: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 标签: ,

在Cakephp中使用i18n本地化程序实际多语言,并使用poedit编辑语言文件

2010年8月16日 Jansfer 没有评论
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

分类: CakePHP 标签: , , ,

CakePHP FAQ整理

2010年8月4日 Jansfer 没有评论

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来调用(注意属性大小写)

分类: CakePHP 标签: , , ,

CakePHP的一些小技巧

2010年7月22日 Jansfer 没有评论

1. 禁止布局
如果需要在全局禁止布局则在app_controller.php中设置$this->autoLayout = false,其子类可以继承/重写该设置;如果需要有条件,则可以将$this->autoLayout = false放在app_controller.php的before_filter()过滤器中。
如果只是个别的controller/action的话,那么最好是直接在具体的action定义中设定$this->autoLayout = false,而不是在控制器层级设定。

2. HTML助手
在模板里使用图片的时候,最好是使用助手的方式,如:echo $html->image(’pic.gif’),而不是直接手动编写<img>标签,因为如果硬编码的话,一旦网站目录结构出现变化,问题就严重了。同样的情况还出现在链接上,应该使用助手的方式,如:echo $html->url(array(’action’ => ‘foobar’)。

图片链接生成的两种方式:

 

//由$html->image()方法生成,简单而实用。但不够灵活,不能为<a>链接添加额外的属性
 <?=$html->image('/img/icons/review.png',array('alt'=>__('Review',true),'url'=>'/admin/members/review/'.$member['Account']['id']))?>
//由$html->link()生成,可以添加额外的属性,如提示信息。注意其中最后一个参数必须设置为false,否则会将$html->image转义
<?=$html->link($html->image('/img/icons/destroy.png',array('alt'=>__('Trash',true))),
                                  '/admin/members/destroy/'.$member['Account']['id'],
                                  array(),
                                  'Are you sure you want to delete this record?',
                                  false
                    )
?>

3. 分页助手

分页助手一般使用的都是文字链接,但实际上也可以使用图片链接,方法如下:

<?php echo $paginator->prev($html->image('prev.gif', array('border' => 0)), array('escape' => false));?>

类似的,表单提交按钮如果想使用图片的话,方法如下:

<?php $form->submit(‘pic.gif’)?>

注意所有图片文件都被认为是存放在webroot目录下的img文件夹内的。

分页默认是由div包裹,这个是可以自定义的:

 <?=$paginator->prev('« '.__('Previous', true), array(), null, array('class'=>'disabled prev_page','tag'=>'span'));?>

有时候分页时需要通过URL传递一些查询参数,此时应该在模板文件里按如下设置:

<?php $paginator->options(array('url' => $this->passedArgs));?>

4. Form助手

在CakePHP里,Form助手可以说是所有助手里最重要的,也是最复杂的,其中,尤以input方法为甚,比如说文章属于一个目录,那么在录入文章的表单里我们可以这样生成一个目录的下拉菜单:

<?php
$form->input('category_id');
//当然,仅仅这样还不够,还需要在控制器里提供数据才OK
$this->set('categories', $this->Article->Category->find('list'));
?>

相应表有一个name字段用于显示,当然你也可以在模型里设定var $displayField属性。总体来说非常简单,甚至有点奇幻的感觉,这是因为CakePHP在这里做了点小动作,参考form.php文件:

<?php
if (!isset($options['options']) && in_array($options['type'], $types)) {
    $view =& ClassRegistry::getObject('view');
    $varName = Inflector::variable(
        Inflector::pluralize(preg_replace('/_id$/', '', $this->field()))
    );
    $varOptions = $view->getVar($varName);
    if (is_array($varOptions)) {
        if ($options['type'] !== 'radio') {
            $options['type'] = 'select';
        }
        $options['options'] = $varOptions;
    }
}
?>

CakePHP会把表单元素名字中的_id部分去掉,并转换成复数形式,然后在当前视图变量里查找是否已经有了同名的变量,如果有,且未设置成radio单选标签,就把它当做select下拉菜单。

表单助手缺省创建的input会有div包裹,还有label等等修饰,很多时候这和美工设计的页面结构不同,这时:

$form->input(’password’, array(’div’ => false, ‘label’ => false, ‘error’ => false))

输出记得转义,CakePHP提供了h()方法,很简单,但是总容易忘。

这里还有一个技巧,就是在渲染select的时候,如果原来的数据库表里有一个名为name或者title的字段,那么会自动被当做下拉菜单的显示部分。

5. saveAll方法

saveAll方法可以同时保存一对一,一对多的关系。比如说一个question有多个answer,那么在question的表单里,我们就可以这样设定:

<?php
echo $form->input('Question.title');
echo $form->input('Answer.0.content');
echo $form->input('Answer.1.content');
echo $form->input('Answer.2.content');
echo $form->input('Answer.3.content');
?>

经过这样简单的设定后,在question控制器里就可以使用saveAll方法一次性保存所有的数据了。

6. Configure最多支持三级设置

如果超过三级,比如说Configure::write(’A.B.C.D’, ‘…’);这样是无效的,做多A.B.C三级。


7. 通过HTTP_X_FORWARDED_FOR得到客户端IP

如果想通过HTTP_X_FORWARDED_FOR得到客户端IP,必须传递一个false参数:

<?php $this->RequestHandler->getClientIP(false);?>

就是说要传递一个false参数,不过这样做仅适合安全性要求不高的应用。

8. 钩子方法afterFilter并不一定会执行

这是CakePHP的一个硬伤,因为redirect会直接跳转,所以afterFilter有可能会被忽略,这点要注意。

9. Auth组件缺省设置的弊端

缺省实现里,提交表单时,如果有password字段,会自动哈希处理,但是有的时候反倒麻烦,比如说添加用户时,如果验证未通过,再显示出错表单时,密码字段已经被哈希了,已经不是初始值了,再提交就不对了,所以为了屏蔽问题,就不应该再使用password字段名,而应该改名,以注册表单为例:

原始密码:

<?php echo input(’encrypt_password’); ?>

确认密码:

<?php echo input(’confirm_password’); ?>

这样的话,字段值在提交前后始终保持是初始值,就不会再有问题了。

分类: CakePHP 标签:

CakePHP结合AJAX处理时提示缺少视图Missing View

2010年7月19日 Jansfer 没有评论

如果在CakePHP项目中使用AJAX使用AJAX,输出就不需要视图。但程序会提示:Missing View。这个时候只要在方法里加入以下代码:

function someMethod() {
	 $this->autoRender = false;
}

同样如果你开启了debug,在处理AJAX时需要关闭。


function someMethod() {
	 $this->autoRender = false;
	 if ( $this->RequestHandler->isAjax() ) {
		  Configure::write ( 'debug', 0 );
	 }
}
分类: CakePHP 标签: , ,