建立、讀取、更新和刪除 (CRUD) 是應用程式中資料物件的四個基本操作。由於實作 CRUD 操作在開發 Web 應用程式時非常常見,Yii 提供了一些名為 Gii 的程式碼產生工具,可以自動化此流程(也稱為scaffolding)來幫助我們。
注意: Gii 自 1.1.2 版本起可用。在此之前,您必須使用 yiic shell 工具 來達成相同的任務。
在接下來的內容中,我們將描述如何使用此工具來為我們的部落格應用程式中的文章和留言實作 CRUD 操作。
我們首先需要安裝 Gii。開啟檔案 /wwwroot/blog/protected/config/main.php
並加入以下程式碼
return array(
......
'import'=>array(
'application.models.*',
'application.components.*',
),
'modules'=>array(
'gii'=>array(
'class'=>'system.gii.GiiModule',
'password'=>'pick up a password here',
),
),
);
上述程式碼安裝了一個名為 gii
的模組,這使我們能夠透過在瀏覽器中訪問以下 URL 來存取 Gii 模組
http://www.example.com/blog/index.php?r=gii
系統將提示您輸入密碼。輸入我們先前在 /wwwroot/blog/protected/config/main.php
中設定的密碼,您應該會看到一個頁面,其中列出了所有可用的程式碼產生工具。
注意: 在生產機器上執行時,應移除上述程式碼。程式碼產生工具應僅在開發機器上使用。
我們首先需要為每個資料庫表格建立一個 模型 類別。模型類別將允許我們以直觀的物件導向方式存取資料庫,我們將在本教學稍後看到。
點擊 Model Generator
連結以開始使用模型產生工具。
在 Model Generator
頁面上,在 Table Name
欄位中輸入 tbl_user
(使用者表格名稱),在 Table Prefix
欄位中輸入 tbl_
,然後按下 Preview
按鈕。將會顯示一個預覽表格。我們可以點擊表格中的連結來預覽要產生的程式碼。如果一切正常,我們可以按下 Generate
按鈕來產生程式碼並將其儲存到檔案中。
資訊: 由於程式碼產生器需要將產生的程式碼儲存到檔案中,因此需要 Web 程序具有建立和修改相應檔案的權限。為了簡化起見,我們可以給予 Web 程序對整個
/wwwroot/blog
目錄的寫入權限。請注意,這僅在使用Gii
的開發機器上才需要。
針對其餘的資料庫表格重複相同的步驟,包括 tbl_post
、tbl_comment
、tbl_tag
和 tbl_lookup
。
提示: 我們也可以在
Table Name
欄位中輸入星號字元*
。這將一次性為每個資料庫表格產生一個模型類別。
在此階段,我們將擁有以下新建立的檔案
models/User.php
包含從 CActiveRecord 擴展而來的 User
類別,可用於存取 tbl_user
資料庫表格;models/Post.php
包含從 CActiveRecord 擴展而來的 Post
類別,可用於存取 tbl_post
資料庫表格;models/Tag.php
包含從 CActiveRecord 擴展而來的 Tag
類別,可用於存取 tbl_tag
資料庫表格;models/Comment.php
包含從 CActiveRecord 擴展而來的 Comment
類別,可用於存取 tbl_comment
資料庫表格;models/Lookup.php
包含從 CActiveRecord 擴展而來的 Lookup
類別,可用於存取 tbl_lookup
資料庫表格。建立模型類別後,我們可以使用 Crud Generator
來產生程式碼,以實作這些模型的 CRUD 操作。我們將對 Post
和 Comment
模型執行此操作。
在 Crud Generator
頁面上,在 Model Class
欄位中輸入 Post
(我們剛才建立的文章模型類別的名稱),然後按下 Preview
按鈕。我們將看到將產生更多檔案。按下 Generate
按鈕來產生它們。
針對 Comment
模型重複相同的步驟。
讓我們看一下 CRUD 產生器產生的檔案。所有檔案都產生在 /wwwroot/blog/protected
下。為了方便起見,我們將它們分組為 控制器 檔案和 視圖 檔案
控制器檔案
controllers/PostController.php
包含 PostController
類別,它是負責所有關於文章的 CRUD 操作的控制器;controllers/CommentController.php
包含 CommentController
類別,它是負責所有關於留言的 CRUD 操作的控制器;視圖檔案
views/post/create.php
是顯示 HTML 表單以建立新文章的視圖檔案;views/post/update.php
是顯示 HTML 表單以更新現有文章的視圖檔案;views/post/view.php
是顯示文章詳細資訊的視圖檔案;views/post/index.php
是顯示文章列表的視圖檔案;views/post/admin.php
是在表格中顯示帶有管理命令的文章的視圖檔案。views/post/_form.php
是嵌入在 views/post/create.php
和 views/post/update.php
中的部分視圖檔案。它顯示用於收集文章資訊的 HTML 表單。views/post/_view.php
是 views/post/index.php
使用的部分視圖檔案。它顯示單篇文章的簡要視圖。views/post/_search.php
是 views/post/admin.php
使用的部分視圖檔案。它顯示一個搜尋表單。我們可以透過訪問以下 URL 來測試我們剛剛產生的程式碼所實作的功能
http://www.example.com/blog/index.php?r=post http://www.example.com/blog/index.php?r=comment
請注意,產生的程式碼所實作的文章和留言功能是完全獨立的。此外,在建立新文章或留言時,我們需要輸入資訊,例如 author_id
和 create_time
,這些資訊在實際應用程式中應該由程式設定。別擔心。我們將在下一個里程碑中修正這些問題。目前,我們應該相當滿意,因為這個原型已經包含了我們需要為部落格應用程式實作的大部分功能。
為了更好地理解上述檔案是如何使用的,我們在下面展示了在部落格應用程式中顯示文章列表時發生的工作流程
http://www.example.com/blog/index.php?r=post
;PostController
的實例並執行它;PostController
實例透過呼叫其 actionIndex()
方法來執行 index
動作。請注意,如果使用者未在 URL 中指定要執行的動作,則 index
是預設動作;actionIndex()
方法查詢資料庫以取回近期文章列表;actionIndex()
方法使用文章資料呈現 index
視圖。發現錯字或您認為此頁面需要改進?
在 github 上編輯 !
給那些無法 crud 文章和留言的人
當執行 "crud Post" 和 "crud Comment" 時,我卡在 scaffolding 部分。
我意識到我的模型資料夾中有 "tblPost" 和 tlbComment",而不是 "Post" 和 "Comment"。我忘記在我的 config/main.php 檔案的 components db 陣列區段中加入 'tablePrefix'=>'tbl_',正如本部落格教學的前一章所提到的
https://yii.dev.org.tw/doc/blog/prototype.database
如果您有 'tablePrefix'=>'tbl_' 行,那麼在使用 "model *" 命令產生模型時,它將從表格名稱中移除 "tbl_" 前綴。
您也可以在 Qiang 回覆另一位忘記在其 config/main.php 檔案中加入 tablePrefix 行的人的回覆中讀到這一點。
https://yii.dev.org.tw/forum/index.php?/topic/7545-help-yii-configuration-on-mac/page__view__findpost__p__38330
也許可以將關於此事的提醒添加到本部落格教學章節中,因為如果其他人忘記編輯他們的 main.php 檔案,他們也可能會遇到這個問題。
yii-1.0.6.r1102 上的 webapp 問題
我正在嘗試執行 shell 並建立模型。
cmd 下出現錯誤
Fatal error: Cannot redeclare class Yii in path-to-app\lib\yii-1.0.6.r1102\framework\yii.php on line 29
我哪裡做錯了嗎?
YII 如何決定在表單中標記為 REQUIRED 的欄位
如果您好奇那些小的 "REQUIRED" 星號 (*) 如何出現在文章或留言的 Web 表單上的某些欄位旁邊,那是由您匯入以建立部落格資料庫的 SQL 檔案中的資料結構決定的。在 MySQL 的情況下,資料庫中任何使用 NOT NULL 關鍵字定義的欄位都會變成表單中的 REQUIRED 欄位。
註冊 或 登入 以發表評論。