用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有着一系列强大的Helper,比如:Html,Javascript, Form (Form是在1.2后才从Html Helper中分离出来的)。当然您也可以自己写Helper来简化CakePHP项目中对View层的操作。
其中Form(表单)Helper中有一个方法为“radio”,其使用方法如下 View层:
$form->radio($fieldName, $options = array(), $attributes = array());
$fieldName为字段名称,比如:News.title
$options Radio项数组,比如:array(‘1′ => ‘Radio1′)。这样生成的单选按钮名字为Radio1值为1的单选按钮。
$attributes Radio按钮的属性,比如:array(‘legend’ => false):去除Legend边框;array(‘value’ => 1):选中值为1的单选按钮;array(’separator’ => ‘ ’):单选按钮间用空格分隔…
用CakePHP form radio生成的单选按钮很容易造成Radio值丢失,也就是在Post数据的时候,明明选中了某个间选按钮了。可是传过来的数据却是空的。这种情况多发生在用$form->radio多次生成相同FieldName的单选按钮的情况下。
在做一个淘宝网手机的项目中就出现过这种情况。后台管理那里出现的,现在也不便展示,如果您希望看就看看前台吧:http://www.xgto.cn
相应的解决办法:
当使用$form->radio()生成的单选按钮,CakePHP默认会加入一个Hidden域形如:<input type=”hidden” name=”data[News][title]” id=”NewsTitle_” value=”" />
解决办法相对简单,去除第二次,第三次…使用Radio时生成的Hidden域即可。避免生成Hidden域CakePHP并没有提供开关控制(具有研究所知)。
简单的字符串操作去除即可。str_replace或是其它的…
近来好像写有关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+sqlite。说起sqlite我还真的不是很懂,不过cakephp很强大,不用我去写数据驱动即可以完美的使用它。Show一下吧:http://www.chenyang.com。
类似的项目还有很多,比如:优酷网在线看电视剧 – http://www.9966.info,也是用的CakePHP程序,不过数据库为MySQL。
简要的说一下晨阳集团吧:晨阳集团是国内数一数二的水性漆生产企业,曾经参与过2008年奥运工程。年交税过亿的私人企业。
好了,切入正题:主要记录一下PHP环境中如何开启(配置)SQLite数据库支持。
用CakePHP一般都是进行一些普通的查询操作,当涉及到唯一性查询的时候着时记我费了一些头脑,找了很多资料都没能解决,国内更是一些有价值的资料没有。还是在国外的网站上找到了些蛛丝马迹。
假如项目中用的是findAll查询,若要查询唯一记录可以这样写:
$this->Model->findAll(null, ‘DISTINCT Model.*’);
若项目中用了CakePHP1.2的paginate组件,查询唯一记录可以这样写:
$this->paginate['fields'] = array(‘DISTINCT Model.*’);
$this->set(‘contents’, $this->paginate());
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是一个多数据库支持的优良的PHP框架。它内置多种数据库驱动程序,比如:Mysql、PostgreSQL、SQLite、ADOdb…使用中可以任意选择,只需要配置database.php文件,无需更改其它任何程序代码。这篇文章之前我也介绍过几篇CakePHP的文章,假如你真的想试一下这个完美的框架的话,你可以去CakePHP官方欣赏一翻(CakePHP官方)。
下面介绍一下CakePHP如何使用SQLite数据库,及其中应该注意的事项:
我现在使用的CakePHP版本为:1.1.20.7692。为什么要提到CakePHP的版本呢?原因很简单,就是CakePHP 1.2之前的版本对于SQLite来说,只支持SQLite2。假如你的SQLite版本为3的话,那也不是没有办法,你需要下载几个数据库驱动程序,可以参考这里:SQLite 3 support。
要用SQLite数据库的话,首先您要修改一下App/config目录下的database.php文件。如下: