2008-12-24

在admin generator中加入复杂的自定义列

类归于: symfony — 标签:, maker @ 12:56

在admin generator的list动作中, 我们可能希望在列表上加入自定义的列, symfony 1.2直接或间接的为我们提供了一些方法.

  1. 插入一个字段(field)
  2. 插入一个”虚拟字段”
  3. 插入局部模板(partial)
  4. 插入组件(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图片, 当然图片是要上传的, 至于如何上传图片不在本文的讨论范围之内, 可以搜索本站的其他文章.

评论暂缺 »

还没有任何评论。

这篇文章上的评论 RSS feed TrackBack URL

留下评论

WordPress 所驱动