本文實例總結了cakephp常見知識點。分享給大家參考,具體如下:
1. 呼叫其他控制器的模板,重定向
方法一:
在此呼叫/views/tasks/tasks下的hello.ctp模板
$this -> viewPath = 'tasks'; $this -> render('hello');
方法二(帶參):
$this ->redirect(array('controller'=>'users','action'=>'welcome',urlencode($this->data['姓名'].'haha')));
2. 查詢
直接使用sql:
$this->PostContent->query("select * from user"); find(): $clue = $this->clue->find('all', array( 'fields' =>array( 'id', 'title', 'content' ), 'order' => 'id ASC', 'conditions' => array('id' => '1'), ) );
find的參數,第一個可以是all、first、count,第二個參數為一數組,數組的key可以是:conditions、fields、order、limit、offset、joins。
新增:
$this->clue->create(); $this->clue->save($this->data);
修改:
$this->clue->create(); $this->clue->save($this->data);
刪除:
$this->clue->delete($id)
3. 不需要公共樣式時
$this->layout = false;
$this->autoRender = false;
4.定義公共的方法/類別
##方法一:
可以在/app/Controller/AppController.php中定義公共的方法
呼叫
#$this->test();
方法二:
在/app/controllers/components中建立UtillComponent.php
#<?php class UtillComponent extends Object { function juanstr ($str) { return $str.'+juanstr'; } } ?>
var $components = array('Utill'); $digit1 = $this->Utill->juanstr($digit1);
5.定義提示訊息
$this->Session->setFlash(__('The user has been saved')); <p class="wrong"><?php echo $this->Session->flash();?></p>
$this->Session->write('Message.auth',array('message'=>__('The user has been saved.',true),'element'=>'','params'=>array())); <p class="wrong"><?php echo $this->Session->flash('auth');?></p>
6. session設定
可參考://m.sbmmt.com/
檢查Session中是否已有$name為鍵值的資料項目.<br/>
#del(string $name);
刪除$name 指定的Session 變數。
valid當Session有效時回傳true,最好在read()操作前用它來決定你要存取的會話是否確實有效.
傳回$name 變數值。
renew
透過建立新的seesion ID,刪除原有的ID,將原有Session中資訊更新到新的Session中。
#將變數$name,$value寫入會話.
error
傳回最近由Cake Session Component 產生的錯誤,常用於偵錯。
7. 表單<?php echo $this->Form->create('Subject',array( 'type' => 'post', 'inputDefaults'=>array( 'p'=>false, 'label'=>false ), 'url'=>array( 'controller'=>'subjects', 'action'=>'edit' ), 'onsubmit'=>'return validateCallback(this, dialogAjaxDone);' //提交前验证 ) ); echo $this->Form->input('id',array('type'=>'hidden')); echo $this->Form->input('uid',array('type'=>'hidden')); ?> <ul class="usr_info_basic"> <li> <p class="ti">下拉单选(编辑页面会自动判断选中)</p> <p class="ce"> <?php echo $this->Form->input('type',array('type'=>'select' ,'class'=>'ipt','options' => array(0=>'文章',1=>'专题', 2=>'图组')));?> </p> </li> <li> <p class="ti">多选</p> <p class="ce"> <?php echo $this->Form->input('pushtype', array('type'=>'select', 'options' => $pushtype,//所有选项 'multiple'=>'checkbox', 'selected' => $pushtypes,//选中的项 )); ?> </p> </li> </ul> <p class="btns_3"> <button class="btn3" type="submit"><span>保存</span></button> <button class="btn3 btn3_1 close"><span>取消</span></button> </p> <?php echo $this->Form->end();?>
#8. 日誌$this->log();
在controller直接呼叫:
$this->log('Something brok2',LOG_DEBUG);
#或view裡呼叫:
日誌的類型大致上有以下幾種:
$levels = array( LOG_WARNING=> 'warning', LOG_NOTICE=> 'notice', LOG_INFO=> 'info', LOG_DEBUG=> 'debug', LOG_ERR=> 'error', LOG_ERROR=> 'error' );
#日誌檔案都保存在/app/tmp/logs目錄。
在/app/config/core.php檔案中有日誌的設定選項:
#define('LOG_ERROR', 2);
9.渲染路徑
echo APP . 'webroot' . DS; //D:\wamp\www\cakephp\app\webroot\ echo APP . 'webroot' ; 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 ,就可以透過//m.sbmmt.com/ 來存取。
改變靜態頁面的標題使用pages controller時如果想改變頁面標題,只需在view中加入以下程式碼:
<? $this->pageTitle = 'Title of your page.'; ?>
在靜態頁面中向layout發送資料
#如果需要向layout傳遞資料(例如表示導覽列中哪個部分應該會高亮顯示的變數),可以在view中加入下面的程式碼:
<? $this->_viewVars['somedata'] = array('some','data'); ?>
#這個陣列就可以在layout中透過$somedata來存取。
快速建立後台管理如果你需要建立後台管理程序,並且希望所有管理action都位於某個特定資料夾下,那麼開啟config/core. php 並將下面這一行的註解去掉:
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中添加以下代码以隐藏调试信息:
#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中我找到了这篇关于高级验证的文章,其中提到了一些十分有用的高级验证方法。
记录错误日志
$this->log('Something broke');
这样可以将错误记录到 /tmp/logs/ 中(我最初以为会记录到apache的错误日志中)。
让controller使用其他model
如果你的controller需要调用来自不同model的数据,只要在controller开头使用如下代码:
class yourController extends AppController { var $uses = array('Post','User'); }
这样controller就能访问Post和User model了。
创建不使用数据库表的model
我需要创建一个不使用任何表的model。例如,我想通过$validate数组方便底验证输入数据,保持model逻辑的正确性。但创建model时对应的表不存在,CakePHP就会报错。通过在model中加入以下代码可以解决这个问题:
var $useTable = false;
你也可以通过这种方法改变model对应的表名。
var $useTable = 'some_table';
重定向之后记得exit()
对于有经验的人来说这应当是理所当然的事儿,调用 $this->redirect() 之后,剩下的代码如果不想运行要exit()。我也这样做,但以前曾经认为 $this->redirect() 会为我调用exit(实际上不会)。
高级model函数
翻翻API就能发现很多你不知道的非常有用的函数。我强烈推荐至少阅读一遍 Model 类的参考手册。下面是以前我没注意到的几个重要函数:
① generateList()
- 主要用于生成选择框(
再次强烈推荐阅读整个model类参考,你会为你学到的东西赞叹的。
如何正确插入多行
我需要遍历一个列表,并将其中的每个元素都插入到数据库中。我发现如果在一次插入完成后立即进行下一次插入,那么第二次插入的内容完全不会被插入,而是会被更新到第一次插入的行中。例如:
$items = array('Item 1','Item 2','Item 3'); foreach ($items as $item) { $this->Post->save(array('Post' => array('title' => $item))); }
这段代码将在posts表中插入仅一行:“Item 3”。CakePHP首先插入“Item 1”,但马上将其更新为“Item 2”,再更新为“Item 3”,因为$this->Post->id保存的是上一次插入成功的行的id。通常这个特性很有用,但在这个例子中反而帮了倒忙。其实只要在每次插入之后设置 $this->Post->id = false 就可以解决这个问题。
更新:有人发邮件告诉我,正确的做法是调用create()初始化model,再set/save新数据。
在controller函数之前或之后插入逻辑
假设你需要在controller渲染的每个view中都设置一个颜色数组,但你不希望在每个action中都定义它。可以通过 beforeRender() 回调函数来实现:
function beforeRender() { $this->set('colors',array('red','blue','green'); }
这样该controller渲染的所有view都可以访问$colors变量。beforeRender()函数在controller逻辑结束后、view被渲染之前执行。同样,beforeFilter()和afterFilter()函数会在每个controller action执行的前后执行。更多信息请阅读手册的models一节。
为CakePHP添加所见即所得编辑器
这里有一篇非常好的教程教你如何在CakePHP中使用TinyMCE。基本上你只需在页面上链接tiny_mce.js文件,然后添加一些初始化代码以设置将哪个textarea变成TinyMCE编辑器即可。
自定义HABTM关系的SQL语句
我曾试图在自定义的SQL语句上定义一个HABTM关系(has-and-belongs-to-many),却遇到了问题。根据本文撰稿时的文档,应当先在自己的model中设置finderSql,但从CakePHP的源代码来看,应该设置finderQuery。这只是文档中的一个小问题,但指出问题却能为他人节约时间。Trac ticket在这里。
发送邮件
我在wiki中找到两篇教程:发送邮件和通过PHPMailer发送邮件。强烈推荐后者,通过PHPMailer发送邮件更安全,而且不需要自己处理邮件头,减少许多麻烦。
自定义Helper生成的HTML
我需要修改调用$html->selectTag()时生成的
建立 /app/config/tags.ini.php,然后添加以下的内容:
; Tag template for a input type='radio' tag. radio = "<input type="radio" name="data[%s][%s]" id="%s" %s /><label for="%3$s">%s</label>" ; Tag template for an empty select option tag. selectempty = "<option value="" %s>-- Please Select --</option>"
你可以从/cake/config/tags.ini.php中获得完整的标签列表。但我不建议修改该文件,否则升级CakePHP时可能会让你的修改丢失。
自定义404页面
如果你需要自定义404页面,只需创建 /app/views/errors/error404.thtml。
更多cakephp知识点汇总相关文章请关注PHP中文网!