首 页IT知识库翔宇问吧收藏本站
当前位置:翔宇亭IT乐园IT知识库WEBPHP

一个Item Render设计模式实例

减小字体 增大字体 作者:Jack Li  来源:riashanghai.com  发布时间:2012-04-04 18:31:01

对于包含多Item的用户界面组件(UI Component)(如Tree, Table, DataGrid等) Item 容器来说,其行为大多固定,需要时常改变的是Item的显示。如果将显示实现放在这些item containers的class内,那么不仅这些classes的可重复利用性受到破坏,代码也难以管理。这时应该考虑将item的显示逻辑分离出来。

具体实现方法: 将item显示逻辑独立出来放到item render class/function中。

这种模式在Java Swing及Flex的API中有大量的使用。在这里举一个PHP的例子。在网站制作时,我们使用如下的HTML代码搭配CSS来显示导航:

<ul>
<li ><a href="A.php">A</a>
<ul><li ><a href="A1.php">A1</a></li><li ><a href="A2.php">A2</a></li></ul>
<li ><a href="B.php">B</a>
<ul><li ><a href="B1.php">B1</a></li><li ><a href="B2.php">B2</a></li></ul>
<li ><a href="C.php">C</a>
<ul><li ><a href="C1.php">C1</a></li><li ><a href="C2.php">C2</a></li></ul>
</ul>

在PHP中,我们使用Node来为如上的tree建模 - 有一个顶级的虚拟Node, 然后回溯打印即可。为了美化页面,这时我们想让第一级的Node显示图片,让其他级的保留使用文字。这时我们使用如下的render function:

// node class中:
public function toHtmlMenu($printThis = true, $printSubItemsLevel = 100, $renderFuncForListItemContent = NULL) {
  if($printThis) {
   $s = "<li>"; 
   if($renderFuncForListItemContent == null) {
     $s .= "<a href=\"$this->path\">" . $this->getLabel(). "</a>";
   }else{
     $s .= call_user_func($renderFuncForListItemContent, $this, $selectIndex, $language, $country);
    }
  }
// recursive print ...
}
 

// in caller script:
function menuItemRenderLevel1AsImage(MenuItem $menuItem) {
  if($menuItem->getLevel() == 1) {
   return "<a href=\"" . $menuItem->getPath() . "\">" . "<img src=\"$menuItem->id.png\">" . "</a>";
  }else{
   return "<a href=\"$this->path\">" . $this->getLabel(). "</a>";
  }
}

$menuCode = $MENU_ROOT->toHtmlMenu(false, 2, "menuItemRenderLevel1AsImage");

知识评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论

用户名: 查看更多评论

分 值:100分 85分 70分 55分 40分 25分 10分 1分

内 容:

            请注意用语文明且合法,不要发布带有攻击性、侮辱性的言论,谢谢合作!

         通知管理员 验证码:

关于本站 | 网站帮助 | 广告合作 | 网站声明 | 友情连接 | 网站地图 | 用户守则 | 联系我们 |
本站大多数内容来自互联网或网站会员发布,如有侵权,请来信告之,谢谢!
Copyright © 2007-2017 biye5u.com. All Rights Reserved.
网站备案号:黑ICP备13005378号-3