Scaffolding
Create, read, update and delete (CRUD) are the four basic operations of persistent storage. In our blog application, the major task is to implement the CRUD operations for both posts and comments. In this section, we will use the yiic tool to accomplish this task. This process is also known as scaffolding.
Open a command window and run the following commands:
% /wwwroot/yii/framework/yiic shell /wwwroot/blog/index.php Yii Interactive Tool v1.0 Please type 'help' for help. Type 'exit' to quit. >> model User ...... >> model Post ...... >> model Tag ...... >> model Comment ...... >> crud Post ...... >> crud Comment ...... >> exit
Info: Some PHP installations may use a different
php.inifile for command line (CLI) PHP parser. As a result, when running the aboveyiiccommands, you may encounter errors like "YiiBase::include(PDO.php): failed to open stream..." or "...could not find driver". Please double check your CLI PHP configuration by executing the following command:php -r "phpinfo();"The result of the above command will show which
php.inifile is being used and which extensions are loaded. If a wrongphp.inifile is used, you may use the following command to explicitly specify the correctphp.inito use:php -c php.ini /wwwroot/yii/framework/yiic.php shell /wwwroot/blog/index.php
The commands above accomplish two tasks. First, the model commands generate a model class file for each database table. Second, the crud commands generate the code needed by the CRUD operations for the Post and Comment models.
We can test the generated code by accessing the following URLs:
http://www.example.com/blog/index.php?r=post http://www.example.com/blog/index.php?r=comment
Notice that the post and comment features implemented by the generated code are completely independent of each other. Also, when creating a new post or comment, we are required to enter information, such as authId and createTime, which in real application should be set by the program. Don't worry. We will fix these problems in the next milestones. For now, we should be fairly satisfied as this prototype already contains most features that we need to implement for the blog application.
To prepare for the next milestones, let's take a closer look at the files generated by the above commands. All the files are generated under /wwwroot/blog/protected. For convenience, we group them into model files, controller files and view files:
- model files: - models/User.phpcontains the- userclass that extends from CActiveRecord and can be used to access the- Userdatabase table;
- models/Post.phpcontains the- Postclass that extends from CActiveRecord and can be used to access the- Postdatabase table;
- models/Tag.phpcontains the- Tagclass that extends from CActiveRecord and can be used to access the- Tagdatabase table;
- models/Comment.phpcontains the- Commentclass that extends from CActiveRecord and can be used to access the- Commentdatabase table;
 
- controller file: - controllers/PostController.phpcontains the- PostControllerclass which is the controller in charge of all CRUD operations about posts;
- controllers/CommentController.phpcontains the- CommentControllerclass which is the controller in charge of all CRUD operations about comments;
 
- view files: - views/post/create.phpis the view file that shows an HTML form to create a new post;
- views/post/update.phpis the view file that shows an HTML form to update an existing post;
- views/post/show.phpis the view file that displays the detailed information of a post;
- views/post/list.phpis the view file that displays a list of posts;
- views/post/admin.phpis the view file that displays posts in a table with administrative commands.
- views/post/_form.phpis the partial view file that displays the HTML form for collecting post information. It is embedded in the- createand- updateviews.
- a similar set of view files are also generated for comment.
 
In order to understand better how the above files are used, we show in the following the workflow that occurs in the blog application when displaying a list of posts:
- The entry script is executed by the Web server which creates and initializes an application instance to handle the request;
- The application creates an instance of PostControllerand executes it;
- The PostControllerinstance executes the requestedlistaction by calling itsactionList()method;
- The actionList()method queries database to bring back the list of recent posts;
- The actionList()method renders thelistview with the post data.