傻鸵鸟的沙丘
该日志由 xm 发表于 2009-03-22
widget很棒,但是以前不知道怎么做。老版本的yblog就有widget支持,好像是自写的,不过当时没有仔细看。今天研究了下最新版的yblog,发现是使用的技术基于thinkphp最新的widget类,很容易就实现了。
1. 在yblog中,所有的widget都放在Lib/Widget目录下,每个widget都有.class.php和同名的html。
2. 以LinksWidget.class.php为例,可以看见:
- <?php
- class LinksWidget extends Widget
- {
- function render($data=array())
- {
- $linkList = S("linkList");
- if(!$linkList)
- {
- $Dao = D("Links");
- $linkList = $Dao->order("link_rating ASC")->findAll();
- S("linkList",$linkList);
- }
- $this->assign("linkList",$linkList);
- return $this->renderFile();
- }
- }
- ?>
可见:所有widget类都是继承自Widget基类,并重载render函数。
而html文件写入此widget的view。
如Links.html:
- <tagLib name="cx,html" />
- <div id="links" class="widget widget_links">
- <h2 class="sidebartitle">链接</h2>
- <ul>
- <volist name="linkList" id="link">
- <li><a href="{$link.link_url|Input::forTag}"
- title="{$link.link_description|Input::forTag}"
- target="{$link.link_target|Input::forTag}">
- {$link.link_name|Input::forShow}
- </a></li>
- </volist>
- </ul>
- </div>
那么,在主视图如何调用此widget呢?
3. 要在界面上显示,首先应由action控制。yblog是把它放在BaseAction里面了。
- /*取出widget并按保存的顺序调用挂载函数*/
- $onWidget = S("widgets");
- if($onWidget===false)
- {
- $pluginDao = D("PlugIn");
- $plugins = $pluginDao->where("status=1")
- ->field("name,file,type")->order("priority ASC")->findAll();
- // 缓存启用的插件数据
- $content = '';
- $onWidget = array();
- foreach($plugins as $plugin) {
- if($plugin['type']=='plugin')
- $content .= php_strip_whitespace($plugin['file']);
- else if($plugin['type']=='widget')
- $onWidget[] = $plugin['name'];
- //按照YBlog的Widget命名规范,所调用的Widget的name字段是相同的 }
- file_put_contents(APP_PATH."/Temp/~plugins.php",$content);
- S("widgets",$onWidget);
- //缓存更新成功,重新显示页面
- header("location: ".$_SERVER["REQUEST_URI"]);
- }
- $this->assign("widgets",$onWidget);
总的来说,从数据库中取出每个widget的相关信息,并assign到视图中。
可以考虑就在文件夹中加一个文件保存相关信息,那么就可以复制即生效的效果,和wordpress等相同。
4. 主视图中调用非常容易。
- <volist name="widgets" id="widget">
- {~W($widget)}
- </volist>