= 自定义传票字段 = Trac支持向传票模型中添加自定义的字段. 使用自定义的字段, 你可以向传票中添加项目特有的属性. == 配置 == 自定义传票字段是在[wiki:ZhTracIni trac.ini]文件中配置的. 所有字段定义应位于`[ticket-custom]`段中. 字段定义的语法: {{{ FIELD_NAME = TYPE (FIELD_NAME.OPTION = VALUE) ... }}} === 可用字段类型和选项 === * '''text''': 简单文字字段(一行). * label: 描述性标签. * value: 默认值. * order: 排序位置.(在表单中决定与其他定制字段的相对位置) * '''checkbox''': 复选框(布尔值). * label: 描述性标签. * value: 默认值 (0 或 1). * order: 排序位置. * '''select''': 下拉选择框(值的列表). * label: 描述性标签. * options: 值的列表, 用'''|'''分隔. * value: 默认值 (条目号, 从0开始). * order: 排序位置. * '''radio''': 单选按钮, 实质上跟'''select'''一样. * label: 描述性标签. * options: 值的列表, 用'''|'''分隔 * value: 默认值 (条目号, 从0开始). * order: 排序位置. * '''textarea''': 多行文本字段. * label: 描述性标签. * value: 默认文本. * cols: 列宽. * rows: 行高. * order: 排序位置. === 配置范例 === {{{ [ticket-custom] test_one = text test_one.label = Just a text box test_two = text test_two.label = Another text-box test_two.value = Just a default value test_three = checkbox test_three.label = Some checkbox test_three.value = 1 test_four = select test_four.label = My selectbox test_four.options = one|two|third option|four test_four.value = two test_five = radio test_five.label = Radio buttons are fun test_five.options = uno|dos|tres|cuatro|cinco test_five.value = 1 test_six = textarea test_six.label = This is a large textarea test_six.value = Default text test_six.cols = 60 test_six.rows = 30 }}} '''注意''': 要使`select`类型的字段可输入文字, 需要在`fieldname.options`选项中加上前导的`|` === 与报表相关的自定义字段 === 自定义报表字段存储在`ticket_custom`表中, 而不是在`ticket`表中. 因此, 要在报表中显示自定义字段的值, 你将需要联合2个表. 让我们用自定义字段`progress`举例说明. {{{ #!sql SELECT p.value AS __color__, id AS ticket, summary, owner, c.value AS progress FROM ticket t, enum p, ticket_custom c WHERE status IN ('assigned') AND t.id = c.ticket AND c.name = 'progress' AND p.name = t.priority AND p.type = 'priority' ORDER BY p.value }}} '''注意''' 这将仅仅显示有progress字段的传票, 跟'''显示所有传票不同'''. 如果你创建此自定义传票字段在你的已有传票''之后'', 这些传票将没有此字段, 因此它们将不会出现在查询结果中. 如果你返回并修改这些传票, 将生成此字段, 也就会出现在查询结果中. 如果这是你想要的结果, 那你做到了. 然而, 如果你想显示所有传票(有或没有progress字段), 你需要在查询中为每个自定义字段使用`JOIN`. {{{ #!sql SELECT p.value AS __color__, id AS ticket, summary, component, version, milestone, severity, (CASE status WHEN 'assigned' THEN owner||' *' ELSE owner END) AS owner, time AS created, changetime AS _changetime, description AS _description, reporter AS _reporter, (CASE WHEN c.value = '0' THEN 'None' ELSE c.value END) AS progress FROM ticket t LEFT OUTER JOIN ticket_custom c ON (t.id = c.ticket AND c.name = 'progress') JOIN enum p ON p.name = t.priority AND p.type='priority' WHERE status IN ('new', 'assigned', 'reopened') ORDER BY p.value, milestone, severity, time }}} 特别注意此处的`LEFT OUTER JOIN`. === 更新数据库 === 如上所述, 在自定义字段被定义之前创建的所有传票都没有此字段的值. 这里有一些SQL(用SQLite测试过), 可以直接在Trac数据库上运行, 来设置自定义字段的初始值. 所有没有自定义字段'request_source'值的传票插入缺省值'None': {{{ #!sql INSERT INTO ticket_custom (ticket, name, value) SELECT id AS ticket, 'request_source' AS name, 'None' AS value FROM ticket WHERE id NOT IN ( SELECT ticket FROM ticket_custom ); }}} 如果你在不同时间点增加了多个自定义字段, 你应该通过在查询中增加此自定义字段名, 以{{{ticket}}}表的子查询中更具体指定: {{{ #!sql INSERT INTO ticket_custom (ticket, name, value) SELECT id AS ticket, 'request_source' AS name, 'None' AS value FROM ticket WHERE id NOT IN ( SELECT ticket FROM ticket_custom WHERE name = 'request_source' ); }}} ---- 原文版本: TracTicketsCustomFields[[BR]] 相关信息: [ZhTracTickets Trac传票], [ZhTracIni Trac配置][[BR]] See also: TracTickets, TracIni