用CakePHP做了个小项目,项目中支持更换模板功能,所以这就要求每套模板都要有一个自己的文件夹,假设为“aaa”。aaa文件夹中存储aaa模板的所有action的View文件,还有就是Elements文件。
这里只说一个Elements文件,aaa模板的Elements统一放在aaa/elements文件中。这时在View层就不能单纯的利用$this->element(‘elementName’)方法来调用Elements了,因为路径不对。。。
时间比较紧,也没有找到更好的方法,所以就修改了一下。cake/libs/view/view.php文件。
在第329行后添加:
if (isset($params['paths'])) array_unshift($paths, $params['paths']);
这时您的CakePHP就支持Elements定义路径了。使用方法:
$this->element(‘elementName’, array(‘paths’ => ELEMENT_PATH));
有几个CakePHP项目部署在了Centos+Nginx服务器上,才知道原来Nginx的Rewrite规则并不是由Apache的.htaccess来实现的。Nginx有自己的Rewrite规则。
确实想体验一下Nginx服务器的,所以就花心思转换了一下。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>
近来好像写有关CakePHP的文章比较多一些。搞的多了,难免会虚伪一下。这次刚写了一个小网站,顺便把新研究出来的有关CakePHP的知识共享一下。
这次程序方面没做太多的研究,主要考虑了一下网站优化,更确切的说是有关CakePHP Url地址的优化。
参考网站:中药材百科 – http://www.yaocai123.com
设置Url的文件为:app\config\routes.php
首页就不多说了,没有更改routes.php文件。
由栏目层说起:
中药材大全 - http://www.yaocai123.com/zhongyao/
中药种植 - http://www.yaocai123.com/zhongzhi/
中药处方 - http://www.yaocai123.com/chufang/
这三个地址,如果是用常规的CakePHP来写的话为三个Controller。分别为:zhongyao, zhongzhi, chufang。而现在这个项目只用到了一个Controller – MedicineController。在Routes.php中只需要要Controller和Action的名字隐藏掉,而貌似Controller的zhongyao只是MedicineController Index动作的参数而已。
注:测试的CakePHP版本为当前最新的稳定版本-CakePHP 1.2.5。
本来想将网站的首页Cache一下。结果按照CakePHP官方文档测试了半天也没能成功。研究代码也一无所获。所以就放弃了。将几个对MySQL数据库操作大的Element缓存了一下。
CakePHP Element Cache缓存使用方法(View层代码,Element层也可以使用):
$this->element(‘ElementName’, array(‘cache’ => ‘+1 Hours’));
将ElementName缓存1小时。缓存文件会以文本的方式存入App\tmp\cache\views\中。
为了使搜索引擎每天都认为我的网站更新了一次。特意为网站首页加了一个缓存,缓存时间为一天。提取一条新闻,并摘取300个左右的字显示在主页某一块中。我管它叫做(随机消息)
用Sql语句可以直接写如下语句来获取随机记录:
SELECT * FROM table_name ORDER BY rand() LIMIT 5;
CakePHP获取随机记录要变通一下,研究了一下CakePHP生成SQL语句才搞明白。原来只需要这样:
$this->{ModelName}->findAll(
null,
array(‘ModelName.id’, ‘rand() as oo‘) ,
array(‘oo’),
5
);
如此而已…
用CakePHP一般都是进行一些普通的查询操作,当涉及到唯一性查询的时候着时记我费了一些头脑,找了很多资料都没能解决,国内更是一些有价值的资料没有。还是在国外的网站上找到了些蛛丝马迹。
假如项目中用的是findAll查询,若要查询唯一记录可以这样写:
$this->Model->findAll(null, ‘DISTINCT Model.*’);
若项目中用了CakePHP1.2的paginate组件,查询唯一记录可以这样写:
$this->paginate['fields'] = array(‘DISTINCT Model.*’);
$this->set(‘contents’, $this->paginate());
CakePHP的框架默认的.htaccess不能完美支持Godaddy主机空间。也不是Godaddy空间的Htaccess有问题,而是我们没有写好.htaccess。您可以参考如下代码来配置您的CakePHP项目。
CakePHP框架会把urls重写对自己的友好的urls,适合MVC项目的实施。假如有某一目录不需要CakePHP重写,假如没有重新定义.htaccess将无法访问此目录。假如配置环境为php fastCGI可能会出现:No input file specified.错误。
这时可以自己为.htaccess加一段代码,告诉服务器不转发此子目录即可,这时需要注意的是,此子目录的名称不能为CakePHP Controller的名称(name值)。
修改网站主目录中.htaccess如下(本人使用的CakePHP版本为,最新的CakePHP稳定版:1.2.2.8120 Stable):
# 不重写subdirectory目录
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} ^/subdirectory/(.*)$
RewriteRule ^.*$ - [L]
</IfModule><IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /
RewriteRule ^$ app/webroot/ [L]
RewriteRule (.*) app/webroot/$1 [L]
</IfModule>
很多站长会将自己的网站加上一个Google网站管理员工具,假如用CakePHP开发的项目,也需要对主目录的.htaccess加以修改。代码如下:
CakePHP中View层有一个方法为:$this->requestAction(url)。望文生意,此方法可以解释为:请求Action。使用此方法可以大大的减少项目中的冗余代码。
比如我们有一个商品管理的Controller为StoreController,一个文章管理的Controller为PostController。以前当文章中需要调用最新的商品时我们可能会这样写:
class PostController extends AppController {
var $name = ‘Post’;
var $uses = array(‘Post’, ‘Store’);
var $layout = ”;var $paginate = array(
‘limit’ => 10,
‘order’ => array(‘Post.created DESC’),
);function index() {
$this->set(‘posts’, $this->paginate());// 调用最新的商品
$this->set(‘newStores’,
$this->Store->findAll(
array(‘Store.display’ => 1),
null,
array(‘Store.created DESC’),
10
)
);
}
}
这样项目中的冗余代码会变的很多,不利于管理。合理的利用requestAction是最明智的选择。
使用requestAction后$uses可以不用加载Model: Store,认真看一下代码就明白了。
备注:报导的晚了些,CakePHP 1.2.2.8120于2009.03.19日发布。
此版本修正了很多严重的错误,比如Paginator的链接问题,官方建议升级到最新版本。
站内报导:http://www.phplamp.org/tag/cakephp/
官方新闻:http://bakery.cakephp.org/articles/view/release-1-2-2-8120