On this page... (hide)

  1.   1.  背景
  2.   2.  代码示例
  3.   3.  参考资料

1.  背景

网站中经常会用到菜单形式的功能导航,一般的实现形式是当前选中的栏目高亮,而其他栏目则以普通样式显示。常见的实现方法有以下几种:

  • 在每个包含菜单的页面中写死带有高亮选项的菜单。这样虽然实现简单,但是页面前台代码编写量大,一旦需要修改时难以维护。
  • 像编写普通的 TurboGears2 程序一样,依靠 Controller 和 View 层的代码片段配合来实现。这样的实现方式与一般的网站开发流程一致,容易被开发人员所理解,但 View 层中的代码片段会依赖于 Controller 中的数据,容易造成维护困难,并且造成菜单有关的代码在多个 Controller 中多次复制。

本文将动态菜单的实现逻辑完全整合在模板代码片段中,通过 WSGI 的 request 环境变量获知当前被请求的功能,相应处理菜单的高亮显示等效果。这种实现办法的好处在于菜单有关的代码片段非常独立,在 CSS 等静态资源配套的情况下,可以不受 Controller 等其他部分的限制,在需要的页面中利用 Genshi 模板的 include 语法引入动态菜单即可。

2.  代码示例

<!-- request 是 TG2/Pylons 中 Genshi 模板的默认上下文变量之一。 -->
<!-- 如果需要用于判断的不是 GET 参数而是 url 中的访问路径,那么可以与 request.path 进行比较。 -->
<!-- * 比如访问地址是 'http://localhost/blog/article?id=1' ,那么 request.path 取值为 '/blog/article' 。-->
<!-- * 具体可以判断是否 request.path.startswith(tg.url('/groupon')) 。 -->

<!-- 注意:py:with 方式定义的变量是无法被修改的,同一变量名先定义的取值会覆盖后定义的取值。-->
<!-- 下面这一行中 request.GET 是一个字典,当 GET 参数 class_id 不存在时,让 class_id 取默认值 4 。-->
<py:with vars="class_id=int(request.GET.get('class_id', 4))">
  <!-- 下面这一行定义的字典用于切换菜单中选中高亮效果的 CSS 样式。-->
  <py:with vars="in_on_dic={True:'on', False:'in'}">
    <py:for each="item in enumerate(groupon_category)">
      <a href="${tg.url('/groupon',{'class_id':item.class_id})}" class="${in_on_dic[int(class_id) == item.class_id]}">${item.class_name}</a><a class="a2"></a>
    </py:for>
  </py:with>
</py:with>

3.  参考资料

TurboGears2 和 Pylons 的 request 处理都是扩展自 Python PasteWebOb ,因此提供的主要方法也与之相同。

GlossyBlue theme adapted by David Gilbert
Powered by PmWiki