天天看點

(轉)CakePHP你必須知道的21條技巧

轉:http://tech.idv2.com/2007/10/19/21-tips-you-must-know-about-cakephp/ 這篇文章可以說是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中加入以下代碼:

pageTitle = 'Title of your page.'; ?> 在靜态頁面中向layout發送資料 如果需要向layout傳遞資料(例如表示導航欄中哪個部分應該高亮顯示的變量),可以在view中添加下面的代碼:

_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() - 主要用于生成選擇框(

  • )所需的資料 query() - 自己寫SQL語句來查詢 findCount() - 傳回滿足指定條件的行數 hasAny() - 當有記錄滿足條件時傳回真 再次強烈推薦閱讀整個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 = " %s " ; Tag template for an empty select option tag. selectempty = "-- Please Select --
  • " 你可以從/cake/config/tags.ini.php中獲得完整的标簽清單。但我不建議修改該檔案,否則更新CakePHP時可能會讓你的修改丢失。 自定義404頁面 如果你需要自定義404頁面,隻需建立 /app/views/errors/error404.thtml。