解读phpwind的主题定制化设计

最近研究phpwind源码过程中,发现它对发帖主题具有可定制化能力,而不是一概标准贴格式,能够根据具体应用场景定制化属性,让帖子信息结构化起来,具体功能以房屋买卖版块为例,可以分为出租、出售、求购等类型的帖子,如下图所示:

解读phpwind的主题定制化设计_第1张图片

 

发帖的时候,能根据类型,定制各个属性,以出租为例,如下图所示:

 

解读phpwind的主题定制化设计_第2张图片

 

在列表展示页里,也能根据定制化属性,来显示列表,以出租为例:

 

刚开始,我的初步判断是phpwind对这么几个应用广泛的场景单独做了页面,因为在后台配置中,没找到能定制这些参数的地方,但在源码里没找到这些定制化页面,因此我断定是有一套关于主题定制的模型,通过对模型的配置,达到对功能的定制,这引起了我的兴趣,通过对表结构的分析,发现有一组表是专门用来应对主题定制化的,表结构如下图所示:

 

所上图所示,

pw_topiccate为主题分类表,是最上层的抽象,表示在哪些版块里有定制化主题。

pw_topicmodel为主题分类模板信息,对应着各个定制化主题,如上例中的“出租”在里面就对应一项。

pw_topicfield为主题分类模板字段表,对于每个定制化主题所需的定制化字段都在这里配置

pw_topicvalue为定制化字段对应的值,表面后面会跟上一个num,对应modelId,这样每个model都会有一个单独的pw_topicvalue表来存储数据

pw_topictype为版块主题分类,可指定大版块下各个定制化主题的显示规则

根据以上数据表结构设计,就大致能知道如何实现这一套定制化设计了。拿浏览帖子为例,phpwind做了以下事情:

  1. 根据modelId得到定制化数据
    源码:
    $topicvalue = $postTopic->getTopicvalue($read['modelid']); |
    在getTopicvalue方法中,先是得到model信息,然后根据modelId从相应pw_topicvalue表里得到具体数据
    $tablename = GetTopcitable($modelid); $fieldone = $this->db->get_one("SELECT * FROM $tablename WHERE tid=".pwEscape($tid));
    最后根据pw_topicfield表里配置的各个field,把value根据一定规则组装起来
    while ($rt = $this->db->fetch_array($query)) { if (($rt['type'] == 'img' || $rt['type'] == 'upload') && $fieldone[$rt['fieldname']]) { $tmpCount++; $rt['type'] == 'upload' && $fieldone[$rt['fieldname']] = postTopic::getpcurl($fieldone[$rt['fieldname']],1); $flashtopicvalue .= "<div class=/"flash pr/" id=/"Switch_$rt[fieldname]/" style="/" mce_style="/""display:none;/"><img src="/" mce_src="/""{$fieldone[$rt[fieldname]]}/" width=/"240px/"/></div>"; $flash = true; } if($rt['type'] == 'textarea') { $fieldone[$rt['fieldname']] = nl2br($fieldone[$rt['fieldname']]); } $rt['fieldvalue'] = $fieldone[$rt['fieldname']]; if ($rt['fieldvalue'] && $rt['type'] != 'img' && $rt['type'] != 'upload'){ $classname = $i%2 == 0 ? 'two' : ''; $rt['rules'] && $rt['rules'] = unserialize($rt['rules']); list($rt['name1'],$rt['name2']) = explode('{#}',$rt['name']); if ($rt['vieworder'] != $vieworder_mark && $vieworder_mark != 0) $topicvalue .= "</cite></li>"; if ($rt['vieworder'] == 0) { $topicvalue .= "<li class=/"$classname/"><i>$rt[name1]:</i><cite>"; $topicvalue .= $this->getFieldValueHTML($rt['type'],$rt['fieldvalue'],$rt['rules']); $topicvalue .= $rt['name2']."</cite></li>"; $i++; } else { if($vieworder_mark != $rt['vieworder']) { $topicvalue .= "<li class=/"$classname/"><i>$rt[name1]:</i><cite>"; $topicvalue .= $this->getFieldValueHTML($rt['type'],$rt['fieldvalue'],$rt['rules']); $topicvalue .= "$rt[name2]"; $i++; } else { $topicvalue .= "$rt[name1]"; $topicvalue .= $this->getFieldValueHTML($rt['type'],$rt['fieldvalue'],$rt['rules']); $topicvalue .= "$rt[name2]"; } } $vieworder_mark = $rt['vieworder']; } }  
  2. 根据modelId得到搜索版块的html代码
    $initSearchHtml = $postTopic->initSearchHtml($read['modelid']);  
  3. 在模板read.htm里把以上得到的定制化数据显示出来

不过从以上设计发现,这个机制还不够完全定制化,因为对于每个新加的model都需要新加表pw_topicvalue来存储数据,因此phpwind也不能在后台管理功能里放开对这一套的配置,如果真正做到可配置,也许可以考虑放一个n多字段的大表,而不是分表来存定制化数据。

你可能感兴趣的:(html,upload,Flash,存储,query,Class)