CakePHP程序員必須知道的21條技巧

快速建立靜態頁面 我想創建幾個頁面,它們僅包含靜態數據,使用默認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。
相關文章
相關標籤/搜索