2006年10月23日
Model 練習與測試工具.
平常都要自己查一下Model 的回傳等等,常常會覺得挺麻煩的。
下面是自己寫的一個小工具,直接在畫面上填入要測試Model,然後輸入要 Run 的 Command ...
就可以了。
(目前無法做 save 的相關動作。)
Controller
程式碼:
<?php
class DemoController extends AppController
{
//var $scaffold;
var $name = 'Demo';
var $uses = array();
var $helpers = array('Html', 'Form' );
function index(){
if(!empty($this->data)){
$command_str = '$model = new '.$this->data['Test']['model'].";\n";
$command_str .= '$result = $model->'.$this->data['Test']['Command'].';';
eval($command_str);
$this->set('command_str',$command_str);
$this->set('result',$result);
}
}
}
?>
View:
程式碼:
<form action="<?=$html->url('/demo/')?>" method="post">
<label>Model Name</label>
<?=$html->input('Test/model',array('size'=> '40'))?>
<label>Function</label>
<?=$html->input('Test/Command',array('size'=> '40'))?>
<?=$html->submit();?>
</form>
<h1>Code</h1>
<?
if(isset($command_str)){
highlight_string($command_str);
}
?>
<h1>Result</h1>
<?
if(isset($result)){
pr($result);
}
?>
...繼續閱讀
下面是自己寫的一個小工具,直接在畫面上填入要測試Model,然後輸入要 Run 的 Command ...
就可以了。
(目前無法做 save 的相關動作。)
Controller
程式碼:
<?php
class DemoController extends AppController
{
//var $scaffold;
var $name = 'Demo';
var $uses = array();
var $helpers = array('Html', 'Form' );
function index(){
if(!empty($this->data)){
$command_str = '$model = new '.$this->data['Test']['model'].";\n";
$command_str .= '$result = $model->'.$this->data['Test']['Command'].';';
eval($command_str);
$this->set('command_str',$command_str);
$this->set('result',$result);
}
}
}
?>
View:
程式碼:
<form action="<?=$html->url('/demo/')?>" method="post">
<label>Model Name</label>
<?=$html->input('Test/model',array('size'=> '40'))?>
<label>Function</label>
<?=$html->input('Test/Command',array('size'=> '40'))?>
<?=$html->submit();?>
</form>
<h1>Code</h1>
<?
if(isset($command_str)){
highlight_string($command_str);
}
?>
<h1>Result</h1>
<?
if(isset($result)){
pr($result);
}
?>
...繼續閱讀
2006年07月29日
在 Element 中使用 model
在做網站的時候常常會用到重複使用的區塊。
這個時候我們會用到 view 的 element 來做這類的東西,像是選單拉,一些廣告區拉等等。
但是若在 Element 中想要用Model去取得資料庫中的資料(例如製作動態選單)該怎麼做呢?
事實上作法很簡單。
例如我要呼叫Post這個Model,只要 就好了,這樣你就可以直接在這個 Element 中使用這個 Post model 。
這個時候我們會用到 view 的 element 來做這類的東西,像是選單拉,一些廣告區拉等等。
但是若在 Element 中想要用Model去取得資料庫中的資料(例如製作動態選單)該怎麼做呢?
事實上作法很簡單。
例如我要呼叫Post這個Model,只要 就好了,這樣你就可以直接在這個 Element 中使用這個 Post model 。
2006年07月24日
利用 hasAny 找出有沒有重複值
請參考http://wiki.cakephp.org/tutorials:duplicate_record_validation?s=hasany
你可以在 model 中加入類似這樣的自訂 function (範例為帳號名稱檢查)
class User extends AppModel
{
function isUnique($userName)
{
$userNames['User.username'] = $userName;
if ($this->hasAny($userNames))
{
$this->invalidate('userNameExists');
return false;
}
else
{
return true;
}
}
}
而 view 中則加入這個errorTag
$html->tagErrorMsg('User/userNameExists', '帳號已經註冊過囉,請重新選額一個帳號.')
你可以在 model 中加入類似這樣的自訂 function (範例為帳號名稱檢查)
class User extends AppModel
{
function isUnique($userName)
{
$userNames['User.username'] = $userName;
if ($this->hasAny($userNames))
{
$this->invalidate('userNameExists');
return false;
}
else
{
return true;
}
}
}
而 view 中則加入這個errorTag
$html->tagErrorMsg('User/userNameExists', '帳號已經註冊過囉,請重新選額一個帳號.')
CakePHP 進階資料檢驗..
一般來說 CakePHP 中,在 model->save() 的時候,會自動根據$model->validate 的陣列進行檢查,若是沒通過則不會 Save 會丟回來一個 false 。
但是我們若是只想要檢查而沒有要存檔呢?
又或者我們自訂 errorTag 要怎麼顯示呢?
第一個問題可以從 Model 的 function 中找到解答
你可以用 $model->validates($data_array) 進行檢查。
而檢查完成後也是從 $controller->validateErrors($this->Model) 來assign 指定的 model 的錯誤檢查錯誤訊息回報。
另外若是有特殊的 errorTag 則可以用 $model->invalidate('tag_name') 來指定顯示...下面是一個檢查使用者帳號重複後的指定範例。
if ($this->find("username = '".$data['Member']['username']."'")) {
$this->invalidate('username_inuse');
return false;
}
2006年07月20日
in Big5 Link 變成亂碼
因為我目前都是直接 svn Cakephp 來使用的。
在昨天更新後,解決了 data 的欄位無法正確帶入值得問題,但是卻發生了原來正常的Link變成了亂碼∼
因為那些Link都是用 $html->link(); 去產生的,所以立刻就懷疑 cakephp 的 helper 有做了修改。
在 /cake/libs/view/helpers/html.php 中大約第 160 行的地方可以看到.....
function link($title, $url = null, $htmlAttributes = null, $confirmMessage = false, $escapeTitle = true, $return = false)
接著我又去查了 svn log 看最近 html.php 有那些修改...
--- html.php (revision 33)
+++ html.php (local)
@@ -159,12 +159,12 @@
*/
function link($title, $url = null, $htmlAttributes = null, $confirmMessage = false, $escapeTitle = true, $return = false) {
if ($escapeTitle) {
- $title = htmlspecialchars($title, ENT_QUOTES);
+ $title = htmlentities($title, ENT_QUOTES);
}
$url = $url ? $url : $title;
if ($confirmMessage) {
- $confirmMessage = htmlspecialchars($confirmMessage, ENT_NOQUOTES);
+ $confirmMessage = htmlentities($confirmMessage, ENT_NOQUOTES);
$confirmMessage = str_replace("'", "'", $confirmMessage);
$confirmMessage = str_replace('"', '"', $confirmMessage);
$htmlAttributes['onclick']="return confirm('{$confirmMessage}');";
真糟糕..他竟然把escapeTitle 從 htmlspecialchars 改成用 htmlentities ...
看樣子只有幾個方法解決..不是自己改回來...
或是替htmlentities 加入語系參數了...
補充: Big5 才會這樣子....
在昨天更新後,解決了 data 的欄位無法正確帶入值得問題,但是卻發生了原來正常的Link變成了亂碼∼
因為那些Link都是用 $html->link(); 去產生的,所以立刻就懷疑 cakephp 的 helper 有做了修改。
在 /cake/libs/view/helpers/html.php 中大約第 160 行的地方可以看到.....
function link($title, $url = null, $htmlAttributes = null, $confirmMessage = false, $escapeTitle = true, $return = false)
接著我又去查了 svn log 看最近 html.php 有那些修改...
--- html.php (revision 33)
+++ html.php (local)
@@ -159,12 +159,12 @@
*/
function link($title, $url = null, $htmlAttributes = null, $confirmMessage = false, $escapeTitle = true, $return = false) {
if ($escapeTitle) {
- $title = htmlspecialchars($title, ENT_QUOTES);
+ $title = htmlentities($title, ENT_QUOTES);
}
$url = $url ? $url : $title;
if ($confirmMessage) {
- $confirmMessage = htmlspecialchars($confirmMessage, ENT_NOQUOTES);
+ $confirmMessage = htmlentities($confirmMessage, ENT_NOQUOTES);
$confirmMessage = str_replace("'", "'", $confirmMessage);
$confirmMessage = str_replace('"', '"', $confirmMessage);
$htmlAttributes['onclick']="return confirm('{$confirmMessage}');";
真糟糕..他竟然把escapeTitle 從 htmlspecialchars 改成用 htmlentities ...
看樣子只有幾個方法解決..不是自己改回來...
或是替htmlentities 加入語系參數了...
補充: Big5 才會這樣子....
CakePHP 安裝方法重點
參考 http://manual.cakephp.org/chapter/3 的建議安裝方式..
安裝方式基本上有分下面幾種.
1. 一般安裝.
2. Production Setup
3. Advanced Setup: Alternative Installation Options
1. 只要將 cakephp 放在 DocumentRoot 即可.
2. 只要將 DocumentRoot 指到 cakephp_install_path/app/webroot/ 即可.
3. 最麻煩但是也最安全.
3.1 建立 /usr/local/lib/cake
3.2 將 cake_install_path/cake 複製到 /usr/local/lib/cake/
3.3 利用 bake.php 建立 project 例如放在 /home/me/cake_site/myproject
3.4 將 /home/me/cake_site/myproject/webroot/* 複製到 DocumentRoot
3.5 修改 DocumentRoot/index.php
代碼:
if (!defined('ROOT'))
{
define('ROOT', '/home/me/cake_site/');
}
if (!defined('APP_DIR'))
{
define ('APP_DIR', 'myproject');
}
if (!defined('CAKE_CORE_INCLUDE_PATH'))
{
define('CAKE_CORE_INCLUDE_PATH', '/usr/local/lib/cake/');
}
3.6 開啟瀏覽器檢視網頁.看是否可以正確執行你的cakephp囉.
安裝方式基本上有分下面幾種.
1. 一般安裝.
2. Production Setup
3. Advanced Setup: Alternative Installation Options
1. 只要將 cakephp 放在 DocumentRoot 即可.
2. 只要將 DocumentRoot 指到 cakephp_install_path/app/webroot/ 即可.
3. 最麻煩但是也最安全.
3.1 建立 /usr/local/lib/cake
3.2 將 cake_install_path/cake 複製到 /usr/local/lib/cake/
3.3 利用 bake.php 建立 project 例如放在 /home/me/cake_site/myproject
3.4 將 /home/me/cake_site/myproject/webroot/* 複製到 DocumentRoot
3.5 修改 DocumentRoot/index.php
代碼:
if (!defined('ROOT'))
{
define('ROOT', '/home/me/cake_site/');
}
if (!defined('APP_DIR'))
{
define ('APP_DIR', 'myproject');
}
if (!defined('CAKE_CORE_INCLUDE_PATH'))
{
define('CAKE_CORE_INCLUDE_PATH', '/usr/local/lib/cake/');
}
3.6 開啟瀏覽器檢視網頁.看是否可以正確執行你的cakephp囉.
CakePHP 的 admin 設定
新版的 Cakephp 的 core.php 中多了滿多東西。
其中有個
/**
* Uncomment the define below to use cake built in admin routes.
* You can set this value to anything you want.
* All methods related to the admin route should be prefixed with the
* name you set CAKE_ADMIN to.
* For example: admin_index, admin_edit
*/
// define('CAKE_ADMIN', 'admin');
只要設定了這個後,就可以使用 http://domain/admin/controller/action 去呼叫
controller 中的 admin_action 作為 管理用的 action .
其中有個
/**
* Uncomment the define below to use cake built in admin routes.
* You can set this value to anything you want.
* All methods related to the admin route should be prefixed with the
* name you set CAKE_ADMIN to.
* For example: admin_index, admin_edit
*/
// define('CAKE_ADMIN', 'admin');
只要設定了這個後,就可以使用 http://domain/admin/controller/action 去呼叫
controller 中的 admin_action 作為 管理用的 action .
使用Bake
bake.php 是 cakephp 中的一隻 command line script
用途是來快速建立 app, model, controller, view 樣版
bake.php 的位置在 /[cake_install_dir]/cake
/scripts/bake.php
執行方式 php cake/scripts/bake.php
當然你也可以 chmod 755 cake/scripts/bake.php
這樣以後就直接 cake/scripts/bake.php
我個人是比較懶, 所以多設了個
alias bake=[path_to_cakephp_install]/cake/scripts/bake.php
這樣以後就 bake 就好了
也可以參考 http://cakephp.org/pages/screencasts 的
Building the Bakery: Part 1
1. 建立 project 基本環境
bake -project 目錄絕對位置
若是初期開發,可以直接這樣
bake -project /[path_to_cakephp_install]/myprj
接下來 bake 會跑一下..然後你就會在
/[path_to_cakephp_install]/ 看到 myprj 目錄, 裏面有預先建立的環境
接下來的指令都要用
bake -app myprj (他會自動去找/[path_to_cakephp_install]/myprj/)
2. 設定資料庫
第一次跑 bake -app myprj 的時候,bake 會提示你他無法找到資料庫.
所以會請你設定資料庫,預設是使用 MySQL .
依照對話設定 mysql 的 username, password, database name
確認後就會自動存檔.
3. 建立 model
完成後就會進入3個選擇 分別是 1 models, 2 controllers, 3 views
先選擇 1, models
bake 會自動連上資料庫取得資料庫目前的資料表,並且列表出來供選擇.
選擇了你要建立的 model 後就是一連串的問答。
當中會包括, 欄位資料檢查方式, 資料關聯檢查(基本上會自動偵測,
但是也會有出槌找錯或是找不到的情況)
最後確認建立就可以了.
4. 建立 controller
再次執行 bake -app myprj
選擇 建立 controller
他會請你輸入 Controller 名稱.
接下來也是一堆的問達.
比較重要的在於他會問你要不要幫你建立基本的
index, view, edit, add, delete
一般來說我都是選 yes, 然後之後再手動改 controller
5. 建立 view
這部份就很簡單,
他只會問你兩個問題...
第二個是問你要不要建立 index.thtml, view,thtml, add,thtml, view.thtml
就給他選 yes 吧...
備註: 建立 model, controller, view 的時候最後都會問你要不要建立 test 環境
不過由於我沒用 test 環境,所以都直接選 no .
用途是來快速建立 app, model, controller, view 樣版
bake.php 的位置在 /[cake_install_dir]/cake
/scripts/bake.php
執行方式 php cake/scripts/bake.php
當然你也可以 chmod 755 cake/scripts/bake.php
這樣以後就直接 cake/scripts/bake.php
我個人是比較懶, 所以多設了個
alias bake=[path_to_cakephp_install]/cake/scripts/bake.php
這樣以後就 bake 就好了
也可以參考 http://cakephp.org/pages/screencasts 的
Building the Bakery: Part 1
1. 建立 project 基本環境
bake -project 目錄絕對位置
若是初期開發,可以直接這樣
bake -project /[path_to_cakephp_install]/myprj
接下來 bake 會跑一下..然後你就會在
/[path_to_cakephp_install]/ 看到 myprj 目錄, 裏面有預先建立的環境
接下來的指令都要用
bake -app myprj (他會自動去找/[path_to_cakephp_install]/myprj/)
2. 設定資料庫
第一次跑 bake -app myprj 的時候,bake 會提示你他無法找到資料庫.
所以會請你設定資料庫,預設是使用 MySQL .
依照對話設定 mysql 的 username, password, database name
確認後就會自動存檔.
3. 建立 model
完成後就會進入3個選擇 分別是 1 models, 2 controllers, 3 views
先選擇 1, models
bake 會自動連上資料庫取得資料庫目前的資料表,並且列表出來供選擇.
選擇了你要建立的 model 後就是一連串的問答。
當中會包括, 欄位資料檢查方式, 資料關聯檢查(基本上會自動偵測,
但是也會有出槌找錯或是找不到的情況)
最後確認建立就可以了.
4. 建立 controller
再次執行 bake -app myprj
選擇 建立 controller
他會請你輸入 Controller 名稱.
接下來也是一堆的問達.
比較重要的在於他會問你要不要幫你建立基本的
index, view, edit, add, delete
一般來說我都是選 yes, 然後之後再手動改 controller
5. 建立 view
這部份就很簡單,
他只會問你兩個問題...
第二個是問你要不要建立 index.thtml, view,thtml, add,thtml, view.thtml
就給他選 yes 吧...
備註: 建立 model, controller, view 的時候最後都會問你要不要建立 test 環境
不過由於我沒用 test 環境,所以都直接選 no .
CakePHP 命名規則
資料表:
表格名稱 英文小寫,用復數表示,以底線分格單字 (posts,forums,tags)
第一個欄位 命名需為 id, 數值, 自動編號, Primary Key (id)
與其他表格對應的 key 以 modelname_id, 數值, Index Key (forum_id)
多對多對應關係 (hasAndBelongsToMeny) 中間資料表以 posts_tags 命名
一樣要設定 primary key (id)
內部索引值命名法同上.(post_id,tag_id)
Model: (/CakeAppDir/models/)
檔名 英文小寫,以資料表名稱(單數型)命名 (post.php,forum.php,tag.php)
Model名稱以資料表名稱(單數型)命名,英文單字字首大寫 (Post,Forum,Tag)
Model 注意像是 post_forums 的表格名稱 則以 PostForum 命名 Model
也就是去掉底線,單字字首大寫
Controller: (/CakeAppDir/controlls/)
檔名:
直接對應 Model : Model名稱加上s加上 _controller.php
(posts_controller.php)
一般的話
"Controller 名稱"加上 _controller.php (home_controller.php)
物件命名: 名稱(英文字首大寫)+Controller (PostsController)
View: (/CakeAppDir/views/)
若無指定 View 則 Controller 會自動找 Action 同名的 .thtml
/CakeAppDir/views/[controller
_name]/[action_name].thtml
Layout: (/CakeAppDir/view/layouts/)
若 controller 未指定,則使用 default.thtml 為預設 layout
flash.thtml 則為 controller 呼叫 flash 方法的時候的預設 layout
表格名稱 英文小寫,用復數表示,以底線分格單字 (posts,forums,tags)
第一個欄位 命名需為 id, 數值, 自動編號, Primary Key (id)
與其他表格對應的 key 以 modelname_id, 數值, Index Key (forum_id)
多對多對應關係 (hasAndBelongsToMeny) 中間資料表以 posts_tags 命名
一樣要設定 primary key (id)
內部索引值命名法同上.(post_id,tag_id)
Model: (/CakeAppDir/models/)
檔名 英文小寫,以資料表名稱(單數型)命名 (post.php,forum.php,tag.php)
Model名稱以資料表名稱(單數型)命名,英文單字字首大寫 (Post,Forum,Tag)
Model 注意像是 post_forums 的表格名稱 則以 PostForum 命名 Model
也就是去掉底線,單字字首大寫
Controller: (/CakeAppDir/controlls/)
檔名:
直接對應 Model : Model名稱加上s加上 _controller.php
(posts_controller.php)
一般的話
"Controller 名稱"加上 _controller.php (home_controller.php)
物件命名: 名稱(英文字首大寫)+Controller (PostsController)
View: (/CakeAppDir/views/)
若無指定 View 則 Controller 會自動找 Action 同名的 .thtml
/CakeAppDir/views/[controller
_name]/[action_name].thtml
Layout: (/CakeAppDir/view/layouts/)
若 controller 未指定,則使用 default.thtml 為預設 layout
flash.thtml 則為 controller 呼叫 flash 方法的時候的預設 layout