查看: 1614|回复: 0

[PHP学习] cakephp常见知识点汇总

发表于 2017-12-13 08:00:02

本文实例总结了cakephp常见知识点。分享给大家供大家参考,具体如下:

1. 调用其他控制器的模板,重定向

方法一:

在此调用/views/tasks/tasks下的hello.ctp模板

  1. $this -> viewPath = 'tasks';
  2. $this -> render('hello');
复制代码

方法二(带参):

$this->redirect(array('controller'=>'users','action'=>'welcome',urlencode($this->data['姓名'].'haha')));

2. 查询

直接使用sql:

  1. $this->PostContent->query("select * from user");
  2. find():
  3. $clue = $this->clue->find('all',
  4. array(
  5. 'fields' =>array(
  6. 'id',
  7. 'title',
  8. 'content'
  9. ),
  10. 'order' => 'id ASC',
  11. 'conditions' => array('id' => '1'),
  12. )
  13. );
复制代码

find的参数,第一个可以是all、first、count,第二个参数为一数组,数组的key可以是:conditions、fields、order、limit、offset、joins。

添加:

  1. $this->clue->create();
  2. $this->clue->save($this->data);
复制代码

修改:

  1. $this->clue->create();
  2. $this->clue->save($this->data);
复制代码

删除:

  1. $this->clue->delete($id)
复制代码

3. 不需要公共样式时

  1. $this->layout = false;
复制代码

不用渲染任何view

  1. $this->autoRender = false;
复制代码

4. 定义公共的方法/类

方法一:

可以在/app/Controller/AppController.php中定义公共的方法

调用

  1. $this->test();
复制代码

方法二:

在/app/controllers/components中创建UtillComponent.php

  1. <?php
  2. class UtillComponent extends Object
  3. {
  4. function juanstr ($str) {
  5. return $str.'+juanstr';
  6. }
  7. }
  8. ?>
复制代码

调用:

  1. var $components = array('Utill');
  2. $digit1 = $this->Utill->juanstr($digit1);
复制代码

5. 定义提示信息

  1. $this->Session->setFlash(__('The user has been saved'));
  2. <p class="wrong"><?php echo $this->Session->flash();?></p>
复制代码

或者

  1. $this->Session->write('Message.auth',array('message'=>__('The user has been saved.',true),'element'=>'','params'=>array()));
  2. <p class="wrong"><?php echo $this->Session->flash('auth');?></p>
复制代码

6. session设置

可参考:http://www.jb51.net/article/106557.htm

check(string $name);

检查Session中是否已有$name为键值的数据项.

del(string $name);
delete(string $name);

删除$name 指定的 Session 变量。

valid当Session有效时返回true,最好在read()操作前用它来确定你要访问的会话是否确实有效.

read(string $name);

返回 $name 变量值。

renew

通过创建新的seesion ID,删除原有的ID,将原有Session中信息更新到新的Session中。

write(string $name, mixed $value);

将变量 $name,$value写入会话.

error

返回最近由 Cake Session Component 产生的错误,常用于调试。

7. 表单

  1. <?php echo $this->Form->create('Subject',array(
  2. 'type' => 'post',
  3. 'inputDefaults'=>array(
  4. 'div'=>false,
  5. 'label'=>false
  6. ),
  7. 'url'=>array(
  8. 'controller'=>'subjects',
  9. 'action'=>'edit'
  10. ),
  11. 'onsubmit'=>'return validateCallback(this, dialogAjaxDone);' //提交前验证
  12. )
  13. );
  14. echo $this->Form->input('id',array('type'=>'hidden'));
  15. echo $this->Form->input('uid',array('type'=>'hidden'));
  16. ?>
  17. <ul class="usr_info_basic">
  18. <li>
  19. <div class="ti">下拉单选(编辑页面会自动判断选中)</div>
  20. <div class="ce">
  21. <?php echo $this->Form->input('type',array('type'=>'select' ,'class'=>'ipt','options' => array(0=>'文章',1=>'专题', 2=>'图组')));?>
  22. </div>
  23. </li>
  24. <li>
  25. <div class="ti">多选</div>
  26. <div class="ce">
  27. <?php
  28. echo $this->Form->input('pushtype', array('type'=>'select',
  29. 'options' => $pushtype,//所有选项
  30. 'multiple'=>'checkbox',
  31. 'selected' => $pushtypes,//选中的项
  32. ));
  33. ?>
  34. </div>
  35. </li>
  36. </ul>
  37. <div class="btns_3">
  38. <button class="btn3" type="submit"><span>保存</span></button>
  39. <button class="btn3 btn3_1 close"><span>取消</span></button>
  40. </div>
  41. <?php echo $this->Form->end();?>
复制代码

8. 日志$this->log();

在controller直接调用:

  1. $this->log('Something brok2',LOG_DEBUG);
复制代码

或view里调用:

  1. <?php $this->log('Something brok2',LOG_DEBUG); ?>
复制代码

日志的类型大致有以下几种:

  1. $levels = array(
  2. LOG_WARNING=> 'warning',
  3. LOG_NOTICE=> 'notice',
  4. LOG_INFO=> 'info',
  5. LOG_DEBUG=> 'debug',
  6. LOG_ERR=> 'error',
  7. LOG_ERROR=> 'error'
  8. );
复制代码

日志文件都保存在/app/tmp/logs目录。

在/app/config/core.php文件中有日志的配置选项:

  1. define('LOG_ERROR', 2);
复制代码

9. 渲染路径

  1. echo APP . 'webroot' . DS;
  2. //D:\wamp\www\cakephp\app\webroot\
  3. echo APP . 'webroot' ;
  4. D:\wamp\www\cakephp\app\webroot
复制代码

附:CakePHP必知的21条技巧

这篇文章可以说是Cakephp教程中最经典的了。虽然不是完整的手把手系列,但作者将自己使用CakePHP的经验总结了21条,这些尤其是对新手十分有用。

翻译时故意保留了一些CakePHP中特有的词语没有翻译,如controller、model等。相信学过CakePHP的人应该马上就能理解它们的意思吧。

另外,CakePHP的wiki已经失效,取而代之的是一个名为bakery的网站。原文中引用的wiki的链接也都已更新到了bakery上。

快速创建静态页面

我想建立几个页面,它们仅包含静态数据,使用默认layout,不需要任何model。最初我试图创建一个controller并为每个静态页面定义一个action。但这种方法很笨拙,也不适合快速创建静态页面。

实际上只要使用pages controller就可以做到——只要在 views/pages 文件夹下创建一个view,就可以通过 /pages 来访问。例如,我创建了 /views/pages/matt.thtml ,就可以通过http://www.example.com/pages/matt 来访问。

改变静态页面的标题

使用pages controller时如果想改变页面标题,只需在view中加入以下代码:

  1. <? $this->pageTitle = 'Title of your page.'; ?>
复制代码

在静态页面中向layout发送数据

如果需要向layout传递数据(例如表示导航栏中哪个部分应该高亮显示的变量),可以在view中添加下面的代码:

  1. <? $this->_viewVars['somedata'] = array('some','data'); ?>
复制代码

这个数组就可以在layout中通过$somedata来访问。

快速创建后台管理

如果你需要创建后台管理程序,并且希望所有管理action都位于某个特定文件夹下,那么打开 config/core.php 并将下面这一行的注释去掉:

  1. define('CAKE_ADMIN', 'admin');
复制代码

这样所有以"admin_"开头的action都可以通过 /admin/yourcontroller/youraction 来访问。例如,如果在posts controller中创建了名为"admin_add"的action,那么可以通过 www.example.com/admin/posts/add 访问这个action。这样就可以方便地为admin目录设置密码以避免他人随意访问。

查看后台执行的SQL语句

只需改变config/core.php中的DEBUG常量,即可看到后台执行的SQL语句。0为产品级,1为开发级,2为完整调试SQL,3为完整调试SQL并显示对象数据。我通常将DEBUG设置为2,这样每页的底部会显示出一个包含SQL调试信息的表格。

如果页面底部添加的表格会破坏页面布局(特别是使用Ajax获取页面并显示到页面中间而不是底部时),你可以在CSS中添加以下代码以隐藏调试信息:

  1. #cakeSqlLog { display: none; }
复制代码

这样既能保持页面布局,又可以通过查看源代码来看到调试信息。当然最后发布网站时别忘了将调试级别改回0。

获取丰富的开发文档

别总是盯着手册。wiki和API也是无价之宝。wiki中的开发指南十分有用,而API文档初看起来比较难,但你很快就会发现这里的信息对你创建CakePHP网站十分重要。

使用bake.php

Bake是个命令行PHP脚本,可以根据数据库自动生成model、controller和view。在开发的最初阶段,我强烈推荐使用scaffolding让你的原型程序跑起来。但如果你清楚地知道scaffolding不合适,我推荐你使用bake。bake会生成所有的文件并保存到磁盘上,以便你随意修改。这样能节省创建关联、view、基本的CRUD crollder操作的重复工作。

(译者注:CRUD - Create, Read, Update, Delete,数据库应用的四种基本操作,即"增删查改"。)

bake很方便。你只需在数据库中建立一个表,然后到 /cake/scripts/ 目录下执行php bake.php 即可。

如果你通过交互方式来运行bake,它会分几步提示你创建model、controller和view。创建结束之后,我通常会阅读所有生成的代码并做必要的修改。

发布程序时注意权限

有一次我在发布程序时,将整个cake目录打包然后用scp上传到了服务器上。只要一关闭调试信息,就会出现错误——数据库调用无法返回任何数据。我一筹莫展,因为我必须通过调试信息才能调试问题。后来有人告诉我,/app/tmp应当对apache可写。将权限改为777之后问题就解决了。

复杂model验证

我需要进行更复杂的验证,而不仅仅是验证输入框非空或者符合某个正则表达式这样的简单验证。例如,我要验证用户注册时使用的邮件地址是否已被使用。在wiki中我找到了这篇关于高级验证的文章,其中提到了一些十分有用的高级验证方法。

记录错误日志

  1. $this->log('Something broke');
复制代码

这样可以将错误记录到 /tmp/logs/ 中(我最初以为会记录到apache的错误日志中)。

让controller使用其他model

如果你的controller需要调用来自不同model的数据,只要在controller开头使用如下代码:

  1. class yourController extends AppController {
  2. var $uses = array('Post','User');
  3. }
复制代码

这样controller就能访问Post和User model了。

创建不使用数据库表的model

我需要创建一个不使用任何表的model。例如,我想通过$validate数组方便底验证输入数据,保持model逻辑的正确性。但创建model时对应的表不存在,CakePHP就会报错。通过在model中加入以下代码可以解决这个问题:

  1. var $useTable = false;
复制代码

你也可以通过这种方法改变model对应的表名。

  1. var $useTable = 'some_table';
复制代码

重定向之后记得exit()

对于有经验的人来说这应当是理所当然的事儿,调用 $this->redirect() 之后,剩下的代码如果不想运行要exit()。我也这样做,但以前曾经认为 $this->redirect() 会为我调用exit(实际上不会)。

高级model函数

翻翻API就能发现很多你不知道的非常有用的函数。我强烈推荐至少阅读一遍 Model 类的参考手册。下面是以前我没注意到的几个重要函数:

① generateList() - 主要用于生成选择框(



回复

使用道具 举报