SCMLife.com

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3098|回复: 0

[推荐] 如何做禅道二次开发(4):如何登记菜单

[复制链接]
发表于 2016-9-14 16:05:06 | 显示全部楼层 |阅读模式
扩展禅道遇到的一个问题就是如何将自己增加的功能登记到菜单中,本篇文章来讲述如何来实现这个功能。
& `1 g+ u- b+ i0 G$ B% F' r: j% N3 P, k
一、菜单的组成2 f- C# |! m5 _$ h) A" D3 d+ x
禅道的导航菜单分为三个部分,顶部菜单、模块菜单、功能菜单。
% i; C8 m; t: O2 }$ E* m9 |4 ?
" q/ e% c. Q- P) x
, }, \, c" A+ N! F5 U二、菜单的定义
$ {5 E; B% I; l0 J菜单的代码定义是在zentao/module/common/lang/zh-cn语言文件中。我们来看下主菜单的定义。- Z% n' c, |8 C, n; q
2.1 主导航菜单的定义
- u! S8 D- u2 z- p4 L80 $lang->menu->my = ' 我的地盘|my|index';
; D4 u- J! X3 n) Y81 $lang->menu->product = '产品视图|product|index';
7 Z! T& E9 `0 [: |! X6 Q82 $lang->menu->project = '项目视图|project|index';2 O5 s  n  d0 _8 h
83 $lang->menu->qa = '测试视图|qa|index';
" y9 A! z, v+ w2 @1 r6 E/ q; a我们来看下代码的含义:83 $lang->menu->qa = '测试视图|qa|index';
+ ]. `0 Q4 p" V8 s这行代码定义了测试视图的代码,其中的menu->qa定义的是菜单的键值,可以根据实际的模块定义。后面是使用竖线分开的三个参数,分别是菜单的文本,对应到模块和方法。这句话就表示要定义一个顶级菜单,文本是“测试视图”,链接到qa模块的index方法。
% N, y; c. _7 m# T& O( `
, s* U% C5 m- l' ?0 D: d' q  g2.2 模块菜单的定义) H) k* \, e( g9 _& F9 ~" N3 Q: [
我们以产品视图的模块菜单为例:' F1 F! ?+ ~2 q8 B. `
144 $lang->product->menu->list = '%s';' x" g  p% ~. V7 b
145 $lang->product->menu->story = array('link' => '需求|product|browse|productID=%s', 'subModule' => 'story');) }# J& ^2 w/ ]' m- m, a
155 $lang->product->menu->create = array('link' => ' 新增产品|product|create', 'float' => 'right');
. ?  a: N2 F1 @( e' k158 $lang->productplan->menu = $lang->product->menu;4 p2 S9 H8 O6 f7 w! Y* L* C5 W8 {
159 $lang->release->menu = $lang->product->menu;. P0 ^# o$ _9 n
这几行代码定义了产品视图模块的模块菜单,这里面出现了一些新的定义方法:
/ l& T* }& U7 C( `4 D2 O' x$ u2.2.1 使用数组来定义链接
! I7 g! i, u. \- t/ b/ L/ [( u145 $lang->product->menu->story = array('link' => '需求|product|browse|productID=%s', 'subModule' => 'story');: r4 C* \% D: ]
这行代码对链接进行定义的时候,使用了数组,分别定义了两个元素,link和subModule。其中link多增加了一个参数字段:productID=%s,代表产品视图的“需求”菜单会链接到product模块的browse方法,传递的参数是productID=%s,其中的%s会被替换成当前的产品id。& ~( ?! {9 i8 C; l& ~; z
2.2.2 使用subModuel来定义子模块8 x9 C5 @5 c# l1 ?9 f0 I  F
145 $lang->product->menu->story = array('link' => '需求|product|browse|productID=%s', 'subModule' => 'story');5 b% W: B: u2 P% a/ W7 W, V
subModule定义的是它的子模块,这个需要是用来保持菜单高亮使用。这样当访问到story模块的时候,还会保持“产品视图”这个定义菜单高亮。2 s; Q" H( {' z6 s  c/ e
2.2.3 使用alias来定义方法别名
: \' b/ F0 y1 [" G$ z! R151 $lang->product->menu->view = array('link' => '概况|product|view|productID=%s', 'alias' => 'edit');
* ?' X. L& v/ z# Y这个地方的alias代表product的edit页面和product的view页面是相同的,这样当编辑产品的时候,“概况”菜单还是会保持高亮的。
7 K  d9 V0 Z, \& n/ j! Y2.2.4 定义菜单的位置
! S5 Y- ?$ L4 t# C所有的菜单默认都是显示在左侧的,如果需要将菜单显示在右侧,则需要定义它的float参数。
" G" Z' F2 h5 L2 N( _6 n' ?; m. T3 r155 $lang->product->menu->create = array('link' => ' 新增产品|product|create', 'float' => 'right');3 b/ `" A( Y& @$ g
通过设置float参数,可以定义这个新增产品的链接显示在页面的右侧。; c: c# A# Z4 Q5 v8 d

& t& U( q. d( k: H' h6 F9 K3 a2.3 功能菜单的定义# \$ a$ E2 [8 U2 ^6 j
功能菜单是在每一个模块的视图文件里面打印的,其扩展方法和视图的扩展相同,后面会讲到这一点。$ @0 p; U2 x  ~* A

+ s  ~' k9 m- j9 F三、菜单顺序的定义2 l2 M0 u) c# ~9 z. ~/ |
前面讲述的是禅道菜单的定义,下面来讲下禅道菜单顺序的定义。在common/lang/下面有一个menuOrder.php的文件,在这个文件中定义了每个菜单的显示顺序。
) a  y4 w7 ~; @( [7 B/* Sort of main menu. */
( J3 e( B5 Y) ?- A' P! k; W2 C$lang->menuOrder[5] = 'my';: y+ i4 Y, K* k, f: {2 D( V  T
$lang->menuOrder[10] = 'product';
+ P" b; S+ n6 N$lang->menuOrder[15] = 'project';$ }" d: P3 L  Y& D2 J
$lang->menuOrder[20] = 'qa';' M" |# c& B: N- F5 _
$lang->menuOrder[25] = 'doc';- }# X, Q9 u( ?6 l$ _
$lang->menuOrder[30] = 'report';
' a% I3 Z( P# i! |: M' k$lang->menuOrder[35] = 'company';
2 \2 {# Q, p/ _! g$lang->menuOrder[40] = 'admin';5 m4 A: r! U) _9 L* }4 O
/* index menu order. */
$ v* _, c. o* {6 ]/ P8 }0 |( \$lang->index->menuOrder[5] = 'product';( G# b$ ]0 A* R) R  n6 P0 G
$lang->index->menuOrder[10] = 'project';% e: r0 [# |/ x- i

3 z4 P# H. {* ]' y四、如何将自己的页面登记到菜单中0 U/ G2 V0 R) z4 ]9 i! L6 \* G
了解了禅道的菜单机制之后,做扩展就非常容易了。我们来说下步骤:' |7 O2 I, @- l, X6 D
1. 在module/common/ext/lang/zh-cn/下面创建一个文件,比如叫做abc.php(文件名可以任意定义)
3 x2 n2 P6 H- a+ |  Z2. 在这个文件中加上自己的菜单就好了,比如禅道专业版本中的版本库菜单:
+ ?, Z9 v, E" y  s; m7 r$lang->menu->repo = '版本库|repo|browse';
: ?& ?- U" m/ `$lang->menuOrder[21] = 'repo';
9 U4 g6 [1 E: \$ L3 Z" z6 H6 E$ u$lang->repo->menu->list = '%s' . $lang->arrow;4 g1 ~, X, j$ w: g3 N1 `% J3 Q# t. a
$lang->repo->menu->browse = array('link' =>'浏览|repo|browse|repoID=%s', 'alias' => 'diff, log, view, revision, showsynccomment');
. ]6 P" G. @5 v) S' y/ F0 a/ a4 U$lang->repo->menu->settings = '设置|repo|settings|repoID=%s';
% Q! [+ Z( T) C; z) g( o0 |( h$lang->repo->menu->delete = array('link' => '删除|repo|delete|repoID=%s', 'target' => 'hiddenwin');/ ]2 {0 }' A. O
$lang->repo->menu->create = array('link' => '新增版本库|repo|create|', 'float' => 'right');
# u8 g  v0 C6 X9 X
. }0 ?2 U0 S6 [% T& z2 s: w4 t

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

SCMLife推荐上一条 /4 下一条

QQ|小黑屋|手机版|无图版|SCMLife.com ( 京ICP备06056490号-1 )

GMT+8, 2019-10-15 15:29 , Processed in 0.065949 second(s), 8 queries , Gzip On, MemCache On.

Powered by SCMLife X3.4 Licensed

© 2001-2017 JoyShare.

快速回复 返回顶部 返回列表