在admin generator的list动作中, 我们可能希望在列表上加入自定义的列, symfony 1.2直接或间接的为我们提供了一些方法.
- 插入一个字段(field)
- 插入一个”虚拟字段”
- 插入局部模板(partial)
- 插入组件(component)
在generator.yml中, 我们可以修改list动作中列表显示的数据.
// 请将"."替换成" " list: ..sort: [id, asc] ..display: [id, =name, _partial, ~component] ..max_per_page: 10 ..object_actions: ....first_action: ......label: "first action" ......action: first ......params: class=className ...._edit: - ...._delete: -
sort项是list的动作的默认排序方式, display是行表行中要显示的基本数据, object_actions定义可以对该对象执行的操作.
这里我们重点讲解display, display定义要在list行中显示的对象属性或者自定义内容, 其元素可以是以”_”开头的局部模板名, 也可以是以”~”开头的组件名, 或者是一个字段名, 字段名前面也可以以”=”开头, 表示该字段是一个指向编辑页面的链接.
我们所说的字段名, 其实并不是真正意义上的数据库字段, 而是对象中的getter方法, 也就是说, 我们要显示在list中的字段, 并不一定要在数据库中真是存在.
下面看一个例子:
__ schema.yml __
propel:
..shop:
....__attributes: { phpName: Shop }
....id:
....name: { type: varchar(60), required:true }
__ generator.yml __
list: ..sort: [id, asc] ..display: [id, =name, description] ..max_per_page: 10 ..object_actions: ...._edit: - ...._delete: -
在generator.yml的list动作的display项中, description字段是在数据库中并不存在的, 所以我们要在shop对象中添加如下方法:
__ /lib/model/Shop.php __
// 被注释掉的代码是标准的getter和setter应该有的部分, 但并不是我们例子中必须的.
public function getDescription()
{
// return $this->description;
return "some description";
}
//public function setDescription($value)
//{
// $this->description = $value;
//}
这样, 我们就在shop/list的每一行都加了一个内容为”some description”的列.
可能很多人象bobhero一样, 不想去创建一个模板, 其实我也不想, 但我更不想多写很多代码, 因为我比较懒, 所以我使用了下面的方法来实现和上面一样的功能.
__ generator.yml __
list: ..sort: [id, asc] ..display: [id, =name, ~description] ..max_per_page: 10 ..object_actions: ...._edit: - ...._delete: -
~description, 前面说过以”~”开头的元素是一个组件, 那么我们建立下面的组件.
__ /apps/app/modules/shop/actions/components.class.php __
<?php
class shopComponents extends sfComponents
{
public function executeDescription(sfWebRequest $request)
{
echo "some description";
return sfView::NONE;// 这句为了使组件不调用模板, 因为组件和动作一样, 会自动调用相应的模板.
}
}
虽然上面的方法都达到了相同的效果, 但实际上还是有很大区别的, 组件更适合用于复杂的逻辑处理, 而getter却显得很吃力.
有了描述之后, 可能我们还想给商店加个图标, 我们可以使用局部模板来实现, 修改generator.yml如下.
__ generator.yml __
list: ..sort: [id, asc] ..display: [_logo, id, =name, description] ..max_per_page: 10 ..object_actions: ...._edit: - ...._delete: -
之后我们创建模板/apps/app/modules/shop/templates/_logo.php
__ /apps/app/modules/shop/templates/_logo.php __
<?php echo img_tag($shop->getId().".gif");?>
这样我们在每列的id前面加入了一个以id命名的gif图片, 当然图片是要上传的, 至于如何上传图片不在本文的讨论范围之内, 可以搜索本站的其他文章.