問:開發中,程序通常設定debug爲2,如何在某一個特定的action中關閉debug?
答:Configure::write('debug', 0);
問:如何靜態化某個action渲染的視圖?
答:過程就是先得到渲染的內容,再生成靜態文件,這裏看看如何得到渲染後的內容,大體兩個方法:
1. 能夠使用ob函數。
2. 在控制器裏$this->requestAction('/controller/action/param', array('return'));
問:如何改變模型間的關係,生成高效的SQL語句?
答:在使用CakePHP開 發的過程當中,必須儘量保證DEBUG設置在2,時刻注意CakePHP幫你生成的SQL語句是否正常。這裏就會經常使用到recursive和 unbindModel。這裏須要注意的是,若是使用的是$this->model->read()的話,則能夠 用$this->model->recursive = N;來調整級聯數,若是使用的是$this->model->find() / $this->model->findAll()的話,他們的最後一個形參就是控制級聯數的。
find( $conditions,
$fields,
$order,
$recursive);
string $conditions;
array $fields;
string $order;
int $recursive;
findAll( $conditions,
$fields,
$order,
$limit,
$page,
$recursive);
string $conditions;
array $fields;
string $order;
int $limit;
int $page;
int $recursive;
問:CakePHP程序和其餘PHP程序的session不能統一?
答:這是由於缺省狀態下,CakePHP修改了Cookie的名字,因此不能和其餘PHP相對應,只要修改core.php文件對應選項即 可:define('CAKE_SESSION_COOKIE', ini_get('session.name'));缺省爲PHPSESSID。
問:CakePHP程序中,URL大體有幾種形式?
答:大體有三種形式。
第一種,藉助mod_rewrite的能力,其URL大體如http://xxx/controller/action/param,只要開啓Apache的重寫模塊便可。
第二種,是PATH_INFO形式,其URL大體如http://xxx/index.php/controller/action/param,若是想 使用這樣的形式,只要修改core.php中對應行便可:define ('BASE_URL', env('SCRIPT_NAME'));
第三種形式,是傳統的URL形式,其URL大體如http://xxx/index.php?url=/controller/action/param,至於爲啥能夠這樣,你只要看看CakePHP的.htaccess文件寫法就知道了。
問:若是CakePHP程序中,僅僅是顯示一些靜態頁面,怎樣處理?
答:使用缺省的/pages控制器,缺省就帶有幾個例子。
問:經常使用動做如何統一命名?
答:經常使用動做統一命名,有助於標準化處理,所謂經常使用動做指的是CRUD常見操做,如:
class ExampleModel extends AppController
{
var $name = 'Example';
function index()
{
}
function add()
{
}
function edit($id)
{
}
function view($id)
{
}
function remove($id)
{
}
}
問:CakePHP1.2中如何設置input標籤,並驗證?
答:在CakePHP1.2中,已經不在推薦使用html助手,而使用新的form助 手,設置input標籤大概如「<td><?php echo $form->text('Model.field', array('size' => 50)); ?></td>」,驗證錯誤信息大概如「<td><?php echo $form->error('Model.field', 'error msg')?></td>」
問:編輯數據的時候,如何方便的顯示待編輯信息?
答:CakePHP中,只要你使用form助手生成表單,則會自動從控制器的$this->data中提取本身的值。
function edit($id = null)
{
if(! empty($this->data))
{
if($this->Model->create($this->data) && $this->Model->save())
{
$this->flash('msg', '/controller/action/param');
exit();
}
}
$this->Post->id = intval($id);
$this->data = $this->Post->read();
}
問:如何複用一個action?
答:之前bakery裏一篇文章介 紹根據$this->params['requested']來判斷是否return,而後使用requestAction來完成複用,實際這個判 斷方式有bug,當使用$this->requestAction('/controller/action', array('return'))這樣帶有return參數的調用時,會出錯。更好的判斷方式以下:
function view($id = null)
{
$this->Model->id = intval($id);
$this->Model->read();
if(! empty($this->params['return']))
{
return $this->Model->data;
}
$this->set('model', $this->Model->data);
}
問:大部分動做使用Auth組件來控制權限,但少部分不用,如何實現?
答:由於大部分動做都要使用Auth組件來控制權限,因此最好放在AppController裏,大概代碼以下:
class AppController extends Controller
{
var $components = array('Auth');
這樣在組件初始化的時候,會自動判斷權限。
而對於少部分例外,只要在相應的子控制器裏設置allow就能夠了,具體以下(好比咱們想Threads控制器的index,view動做能夠自由訪問,不用Auth控制權限):
class ThreadsController extends AppController
{
var $name = 'Threads';
function beforeFilter()
{
$this->Auth->allow('index', 'view');
}
問:如何實現主題功能,同時提供多種風格界面?
答:CakePHP1.2 已經具有了theme功能,咱們只要在app_controller.php中定義var $view = 'Theme',就會載入theme.php文件,而後會根據咱們的設置(var $theme ='themeName';)定位具體的主題目錄,若是你沒有定義,缺省的主題目錄名字爲themed,而後咱們創建新的目錄(如css,js),就ok了。
問:如何設置並訪問命名的GET變量?
答:通常在CakePHP中,GET變量是不命名的,大致形式如/users/view/123這個樣子,而後參數會被自動帶入方法的形參之中,可是有些 時候,咱們仍是須要使用命名的GET變量的,這個時候大致形式如/users/view/name:value,而後咱們能夠在控制器裏通 過$this->namedArgs數組來訪問命名的GET變量,如$this->namedArgs['name']。
問:如何設置view裏能夠訪問的數據?
答:簡單的說,咱們只要在控制器裏進行$this->set('name', 'value');之類的操做就能夠了,可是實際上,若是你只是想set控制器$this->data中的變量的 話,這樣的set代碼徹底能夠省略,由於控制器的$this->data變量會被複制到視圖的$this->data的變量中,因此你徹底不 必set這樣的變量,只要在視圖文件中直接echo $this->data['Model'][...]就能夠了。固然,有時候咱們不得不set一些變量,這個時候,咱們仍是有一種技巧可讓代碼更 簡單的:
$var1 = 'text';
$var2 = 'text';
$var3 = 'text';
$this->set(compact('var1','var2','var3'));
哈哈,利用compact函數,咱們能夠用一條set語句完成看似要多條才能完成的操做。
問:如何在控制器裏實現責任鏈?
答:控制器裏有一個beforeFilter屬性,若是咱們想讓一個動做執行前先進行若干操做(好比:aaa, bbb, ccc),那麼咱們只須要在控制器類中聲明var $beforeFilter便可:
複製內容到剪貼板
代碼:
class AppController extends Controller
{
var $beforeFilter = array('aaa', 'bbb', 'ccc');
function aaa()
{
// ...
}
function bbb()
{
// ...
}
function ccc()
{
// ...
}
}