2009-04-08

symfony1.2的后台(generate-admin)模板结构

类归于: symfony — 标签:, , , maker @ 17:24

这里所指的后台模块是指由propel:generate-admin生成的后台管理模块,在symfony中可以自动生成一套强大的管理后台,并且可以订制或者重写模块中的动作或者模板,这里我们简单介绍一下模板的组成结构。

比如我们要给Test对象生成一套管理后台,那么我们使用命令

./symfony propel:generate-admin backend Test --module=test

然后我们访问backend/test, 这样你会看到一个自动生成的管理页面, 其程序在cache/app_name/env_name/modules/autoMudule/ 目录下. 我们这里主要分析模板目录templates, symfony1.2生成了以下的模板

indexSuccess.php # 列表页

_assets.php # 载入样式和脚本
_flashes.php # 消息框
_list_header.php # 页首
_list.php # 列表

_list_td_stacked.php
_list_th_stacked.php
_list_th_tabular.php # 列标题
_list_td_batch_actions.php # 复选框
_list_td_tabular.php # 一条记录

_list_field_boolean.php # boolean类型的表示方式

_list_td_actions.php # 对象操作

_list_batch_actions.php # 批量操作

_pagination.php # 分页条
_list_actions.php # 操作, 新建等
_filters.php # 过滤器

_filters_field.php # 过滤器中的一项

_list_footer.php # 页尾

newSuccess.php # 新建页
editSuccess.php # 编辑页和新建页用了同一种结构

_assets.php # 载入样式和脚本
_flashes.php # 消息框
_form.php # 表单

_form_fieldset.php # 一组表单项

_form_field.php # 一个表单项

_form_actions.php # 操作, 提交, 取消等
_form_footer.php # 页尾

上面的缩进代表了调用关系, 为了更直观的表现出模板的结构, 做了下面两个图片

图1, 列表页的组成

index

图2, 新建和修改页的结构

new

本文完.

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图片, 当然图片是要上传的, 至于如何上传图片不在本文的讨论范围之内, 可以搜索本站的其他文章.

2008-12-15

局部模板和全局模板

类归于: symfony — 标签:zhuozi @ 18:47

1.全局模板 放在 myproject/appa/myapp/templates/ 下面
在apps/myapp/config/view.yml 指定layout 就可以了
2.局部模板 放在myapp/module/mymodule/templates/下面
文件名以_开头 e.g. _name
在视图页面 用 进行引用
3.如果局部模板想要直接使用全局变量,在全局模板里面需要把参数传给局部模板

WordPress 所驱动