傻鸵鸟的沙丘
该日志由 xm 发表于 2009-04-19
1。导入框架css文件代码
- <!-- Framework CSS -->
- <link rel="stylesheet" href="../../blueprint/screen.css"
- type="text/css" media="screen, projection">
- <link rel="stylesheet" href="../../blueprint/print.css"
- type="text/css" media="print">
- <!--[if IE]><link rel="stylesheet"
- href="../../blueprint/ie.css" type="text/css"
- media="screen, projection"><![endif]-->
2。对于页面,应该整个置入一个class为container的div中,如下
- <div class="container">
- //其余代码在里面,container包含所有的页面元素
- </div>
3。布局参考
blueprint默认定制了下面一些class,帮助实现布局。
该日志由 xm 发表于 2009-03-28
Input类在thinkphp官方帮助中提到得很少(根据我走马观花式的学习,似乎没有提到),因此,一直不大清楚它的用途是什么,如何使用。在学习yblog的过程中,发现它确实是一个很实用的东西,值得掌握。
Input类的建立大概是基于这样一个现实:在网页上显示、网络上传输(如url编码)、后台存储过程中,经常需要做一些转义。而Input类封装了一些常见的提供转义功能的函数(都是静态方法)。
以下是{thinkphp目录}/Lib/Think/Util/Input.class.php中,对于Input类有相关的注释:
- /** 输入数据管理类
- * 使用方法
- * $Input = Input::getInstance();
- * $Input->get('name','md5','0');
- * $Input->session('memberId','','0');
- *
- * 下面总结了一些常用的数据处理方法。以下方法无需考虑magic_quotes_gpc的设置。
- *
- * 获取数据:
- * 如果从$_POST或者$_GET中获取,使用Input::getVar($_POST['field']);,从
- * 数据库或者文件就不需要了。
- * 或者直接使用 Input::magicQuotes来消除所有的magic_quotes_gpc转义。
- *
- * 存储过程:
- * 经过Input::getVar($_POST['field'])获得的数据,就是干净的,可以直接保存。
- * 如果要过滤危险的html,可以使用 $html = Input::safeHtml($data);
- *
- * 页面显示:
- * 纯文本显示在网页中,如文章标题<title>$data</title>:
- * $data = Input::forShow($field);
- * HTML 在网页中显示,如文章内容:无需处理。
- * 在网页中以源代码方式显示html或者作为标签的属性值:
- * $vo = Input::forShow($html);
- * 纯文本或者HTML在textarea中进行编辑:
- * $vo = Input::forEdit($value);
- *
- * 特殊使用情况:
- * 字符串要在数据库进行搜索: $data = Input::forSearch($field);
- */
在yblog的源代码中,可以看见,基本上都是在view里使用这个函数的。
例如:
- <meta name="keywords"
- content ="{$options.sitekeywords|Input::forTag}">
- <meta name="description"
- content ="{$options.blogdescription|Input::forTag}">
- <a href="{$options.siteurl|Input::forTag}/">
- <li id="blogdes">{$options.blogdescription|Input::forShow}</li>
相关学习:
该日志由 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>
该日志由 xm 发表于 2009-03-22
yblog建立了一个完成基础功能的BaseAction,其他aciton继承于它。通过利用php的继承机制,大大简化了开发过程。
BaseAction里面有些什么内容呢?
1. 这个action是这样定义的
- class BaseAction extends Action
个人觉得:用抽象类更好。
2. 其下有 保存配置;
- protected $options;
3. 空操作
- function _empty()
- {
- $this->error("请求的页面不存在");
- }
具体在子类BlogAction里面有个非常好的重定向:
- function _empty()
- { //用来显示单篇日志或页面的空操作
- $where = array();
- $where["post_status"] = "publish";
- //访问的日志或页面必须是已发布的
- if(is_numeric(ACTION_NAME))
- $where["ID"] = ACTION_NAME;
- else if(ACTION_NAME == "post")
- $where["ID"] = $_GET["ID"];
- else
- $where["post_name"] = ACTION_NAME;
- $this->show($where);
- }
4.初始化操作 function _initialize()。例如,初始化$options
思考:是不是可以将rbac就通过action继承机制实现呢?
该日志由 xm 发表于 2009-03-22
既然是要把一个项目分割成一些小工程,必然需要工程间互相调用。yblog是怎么做到的呢?
如前文,在总目录里放置了公用的数据库等配置文件,在各个项目里如何共享这些内容呢?
以blogapp为例,打开其下Conf/config.php,可以看见以下内容:
- <?php
- $db_config = require 'db_config.php';
- $user_config = require 'user_config.php';//首先引入公用的配置文件
- $sys_config = array(
- 'ROUTER_ON'=>true,
- 'DEFAULT_MODULE'=>'Blog',
- 'THINK_PLUGIN_ON'=>true,
- 'DEBUG_MODE'=>false,
- 'USER_AUTH_KEY'=>'yblog_admin_id'
- ); //定义自己的配置
- return array_merge($db_config,$user_config,$sys_config);
- //将不同的内容合并,应该注意顺序,后面的覆盖前面的,并返回
- ?>
这样,只需要调用C()函数,就可以获得最后的配置了!
不过值得注意的是,所有的路径都是以入口文件为标准进行表述的!
2.工程间的跳转
本工程间的链接,yblog使用的是url()函数,例如:
- <a href="{:url('feed','Blog')}" target="_blank">
- <img alt="订阅RSS" src="../Public/Images/rss.gif">
- </a>
没有用最新的U()函数。还是喜欢用U()。
工程间的链接处理,yblog是直接写网址进行调用。如果用U()函数应该更好吧。