Scaffolding
到目前为止,Tor 还没有实现太多功能。它允许人员注册、登录和查看还有哪些人已注册。现在用户需要的功能就是能够将产品输入目录,或查看来自其他用户的产品。立即开始实现此功能的最佳方法就是使用 Scaffolding。
Scaffolding 是 Ruby on Rails 中的一个概念(请参阅 参考资料)。它是一种快速构建一些结构以提供应用程序原型的出色方法,而无需编写大量一次性使用的代码。但是顾名思义,Scaffolding 是应当用于帮助构建应用程序的,而不是用于构建应用程序外围组件的。如果希望 Scaffolding 有不同的表现,就应该放弃它了。
设置产品表
Scaffolding 会检查数据库表,并创建通常与表结合使用的基本类型元素:列表、添加/删除/编辑按钮等等,这些功能通常称为 Create、Read、Update、Delete(CRUD)。首先,需要使用一些表来保存产品信息和经销商信息。
清单 4. 创建保存产品信息的表
CREATE TABLE 'products' (
'id' INT( 10 ) NOT NULL AUTO_INCREMENT ,
'title' VARCHAR( 255 ) NOT NULL ,
'dealer_id' INT( 10 ) NOT NULL ,
'description' blob NOT NULL ,
PRIMARY KEY ('id')
) TYPE = MYISAM ;
CREATE TABLE 'dealers' (
'id' INT( 10 ) NOT NULL AUTO_INCREMENT ,
'title' VARCHAR( 255 ) NOT NULL ,
PRIMARY KEY ('id')
) TYPE = MYISAM ;
|
此外,将一些数据插入 dealers 表中会对此次演示很有帮助。
INSERT INTO dealers (title)
VALUES ('Tor Johnson School Of Drama'), ('Chriswell\'s Psychic Friends')
|
关于 Scaffolding,有一个重要的注意事项:还记得要设置数据库使其外键遵循 singular_id 格式(如 user_id 或 winner_id)吗?在 CakePHP 中,scaffolding 假设以 _id 为结尾的所有字段都是表名加上后缀 _id 形成的外键 — 例如,Scaffolding 认为 dealer_id 是表 dealers 的外键。
设置 product 模型
产品功能需要一整套新的模型、视图和控制器。需要像第 1 部分中一样创建它们。在 app/models/product.php 中创建 product 模型。
清单 5. 创建 product 模型
<?php
class Product extends AppModel
{
var $name = 'Product';
var $belongsTo = array ('Dealer' => array(
'className' => 'Dealer',
'conditions'=>,
'order'=>,
'foreignKey'=>'dealer_id')
);
}
?>
|
请注意 $belongsTo 变量。这就是所谓的模型关联。
模型关联
模型关联(model association) 用于告诉模型以某种方式与另一个模型关联。在模型之间设置正确的关联将允许把实体及其关联模型作为整体来处理,而不是单独处理。在 CakePHP 中,有四种模型关联:
-
hasOne
-
hasOne 关联告诉模型其中的每个实体都在另一个模型中有一个对应的实体。这种关联的示例是与用户实体对应的配置文件实体(假定一个用户仅允许有一个配置文件)。
-
hasMany
-
hasMany 关联告诉模型其中的每个实体都在另一个模型中有若干个对应的实体。这种关联的示例是在 category 模型中许多东西属于同一个类别(邮件、产品等等)。在 Tor 中,一个经销商实体有很多产品。
-
belongsTo
- 这种关联告诉模型其中的每个实体都指向另一个模型中的一个实体。这种关联与 hasOne 刚好相反,因此,一个示例是指向一个对应用户实体的配置文件实体。
-
hasAndBelongsToMany
- 这种关联表示一个实体在另一个模型中有多个对应实体,而且还指向另一个模型中的多个对应实体。这种关联的示例可能是菜谱。很多人可以喜欢一个菜谱,并且菜谱可以有多种成分。
本例中的 belongsTo 变量表示 products 表中的每个产品都 “属于” 一个特定的经销商。
创建 dealer 模型
正如关联所示,还需要一个 dealer 模型。稍后将在 Tor 中使用 dealer 模型来构建定义经销关系的功能。而 product 模型具有指向经销商的 belongsTo 关联,dealer 模型具有指向产品的 hasMany 关联。
清单 6. dealer 模型具有指向产品的 hasMany 关联
<?php
class Dealer extends AppModel
{
var $name = 'Dealer';
var $hasMany = array ('Product' => array(
'className' => 'Product',
'conditions'=>,
'order'=>,
'foreignKey'=>'dealer_id')
);
}
?>
|
现在可以跳过添加数据检验的步骤,但随着应用程序的发展,您可能会希望添加各种检验。
创建 products 控制器
已经构建并关联了用于产品和经销商的模型。现在,Tor 知道如何关联数据。接下来,在 app/controllers/products_controller.php 中构建控制器 — 但是这一次,添加类变量 $scaffold。
清单 7. 在控制器中添加类变量
<?php
class ProductsController extends AppController
{
var $scaffold;
}
?>
|
保存控制器,然后访问 http://localhost/products(是的,不创建任何视图或 dealers 控制器)。应当会看到图 1。
图 1. 空的产品列表
它实际上十分简单。如图所示,现在有了一个用于操作 products 表的界面,允许添加、编辑、删除、列出产品、分段及细化您的产品。
尝试添加一个产品。系统应当会提示您输入产品的名称和描述,还要选择一个经销商。这个经销商列表是不是很眼熟?应当是这样;在创建了 dealers 表后,已将这些经销商插入其中。Scaffolding 在定义表关联时将其识别出来,并自动生成下拉式经销商列表。
现在返回去看一看为实现此功能而编写的代码量。是不是可以更轻松地实现此功能呢?
|