blueprint框架学习笔记

该日志由 xm 发表于 2009-04-19

1。导入框架css文件代码

  1.   <!-- Framework CSS --> 
  2. <link rel="stylesheet" href="../../blueprint/screen.css" 
  3.  type="text/css" media="screen, projection"> 
  4. <link rel="stylesheet" href="../../blueprint/print.css"   
  5. type="text/css" media="print"> 
  6. <!--[if IE]><link rel="stylesheet"   
  7. href="../../blueprint/ie.css" type="text/css"   
  8. media="screen, projection"><![endif]--> 

2。对于页面,应该整个置入一个class为container的div中,如下

  1. <div class="container"> 
  2. //其余代码在里面,container包含所有的页面元素  
  3. </div> 

3。布局参考

blueprint默认定制了下面一些class,帮助实现布局。

  • span-N        占用N个宽度。N可以从1到24。数字越大,宽度越大。
  • append-N    其后有N个宽度空开。
  • prepend-N   其前空开N个宽度。
  • last              右对齐。
  • push-N和pull-N 

该日志标签: blueprint, css, 学习

yblog学习——Input类的使用

该日志由 xm 发表于 2009-03-28

   Input类在thinkphp官方帮助中提到得很少(根据我走马观花式的学习,似乎没有提到),因此,一直不大清楚它的用途是什么,如何使用。在学习yblog的过程中,发现它确实是一个很实用的东西,值得掌握。

   Input类的建立大概是基于这样一个现实:在网页上显示、网络上传输(如url编码)、后台存储过程中,经常需要做一些转义。而Input类封装了一些常见的提供转义功能的函数(都是静态方法)。

  以下是{thinkphp目录}/Lib/Think/Util/Input.class.php中,对于Input类有相关的注释:

  1. /** 输入数据管理类 
  2.  * 使用方法 
  3.  *  $Input = Input::getInstance(); 
  4.  *  $Input->get('name','md5','0'); 
  5.  *  $Input->session('memberId','','0'); 
  6.  * 
  7.  * 下面总结了一些常用的数据处理方法。以下方法无需考虑magic_quotes_gpc的设置。 
  8.  * 
  9.  * 获取数据: 
  10.  *    如果从$_POST或者$_GET中获取,使用Input::getVar($_POST['field']);,从
  11. * 数据库或者文件就不需要了。 
  12.  *    或者直接使用 Input::magicQuotes来消除所有的magic_quotes_gpc转义。 
  13.  * 
  14.  * 存储过程: 
  15.  *  经过Input::getVar($_POST['field'])获得的数据,就是干净的,可以直接保存。 
  16.  *  如果要过滤危险的html,可以使用 $html = Input::safeHtml($data); 
  17.  * 
  18.  * 页面显示: 
  19.  *    纯文本显示在网页中,如文章标题<title>$data</title>: 
  20.  *       $data = Input::forShow($field); 
  21.  *    HTML 在网页中显示,如文章内容:无需处理。 
  22.  *    在网页中以源代码方式显示html或者作为标签的属性值: 
  23.  *       $vo = Input::forShow($html); 
  24.  *    纯文本或者HTML在textarea中进行编辑:  
  25.  *       $vo = Input::forEdit($value); 
  26.  * 
  27.  * 特殊使用情况: 
  28.  *    字符串要在数据库进行搜索: $data = Input::forSearch($field); 
  29.  */ 

 在yblog的源代码中,可以看见,基本上都是在view里使用这个函数的。

 例如:

  1. <meta name="keywords"   
  2.       content ="{$options.sitekeywords|Input::forTag}">  
  3. <meta name="description"   
  4.       content ="{$options.blogdescription|Input::forTag}">  
  5. <a href="{$options.siteurl|Input::forTag}/">  
  6. <li id="blogdes">{$options.blogdescription|Input::forShow}</li>  

 


相关学习:

  1. http://thinkphp.cn/Blog/26
  2. http://thinkphp.cn/Blog/27

该日志标签: yblog, thinkphp, 学习

yblog学习——widget的实现

该日志由 xm 发表于 2009-03-22

     widget很棒,但是以前不知道怎么做。老版本的yblog就有widget支持,好像是自写的,不过当时没有仔细看。今天研究了下最新版的yblog,发现是使用的技术基于thinkphp最新的widget类,很容易就实现了。

    1.  在yblog中,所有的widget都放在Lib/Widget目录下,每个widget都有.class.php和同名的html。

widget.jpg

大小: 23.77 K
尺寸: 500 x 213
浏览: 5 次
点击打开新窗口浏览全图

    2.  以LinksWidget.class.php为例,可以看见:

  1. <?php 
  2. class LinksWidget extends Widget 
  3.     function render($data=array()) 
  4.     { 
  5.         $linkList = S("linkList"); 
  6.         if(!$linkList
  7.         { 
  8.             $Dao = D("Links"); 
  9.             $linkList = $Dao->order("link_rating ASC")->findAll(); 
  10.             S("linkList",$linkList); 
  11.         } 
  12.         $this->assign("linkList",$linkList); 
  13.         return $this->renderFile(); 
  14.     } 
  15. ?> 

  可见:所有widget类都是继承自Widget基类,并重载render函数。

  而html文件写入此widget的view。

  如Links.html:

  1. <tagLib name="cx,html" /> 
  2. <div id="links" class="widget widget_links"> 
  3. <h2 class="sidebartitle">链接</h2> 
  4. <ul> 
  5. <volist name="linkList" id="link"> 
  6.   <li><a href="{$link.link_url|Input::forTag}" 
  7. title="{$link.link_description|Input::forTag}" 
  8. target="{$link.link_target|Input::forTag}"> 
  9. {$link.link_name|Input::forShow} 
  10. </a></li> 
  11. </volist> 
  12. </ul> 
  13. </div> 

那么,在主视图如何调用此widget呢?

    3.  要在界面上显示,首先应由action控制。yblog是把它放在BaseAction里面了。

  1. /*取出widget并按保存的顺序调用挂载函数*/ 
  2.         $onWidget = S("widgets"); 
  3.         if($onWidget===false) 
  4.         { 
  5.             $pluginDao = D("PlugIn"); 
  6.             $plugins = $pluginDao->where("status=1"
  7. ->field("name,file,type")->order("priority ASC")->findAll(); 
  8.             // 缓存启用的插件数据 
  9.             $content = ''
  10.             $onWidget = array(); 
  11.             foreach($plugins as $plugin) { 
  12.                 if($plugin['type']=='plugin'
  13.         $content .= php_strip_whitespace($plugin['file']); 
  14.                 else if($plugin['type']=='widget'
  15.                 $onWidget[] = $plugin['name'];  
  16. //按照YBlog的Widget命名规范,所调用的Widget的name字段是相同的          } 
  17.     file_put_contents(APP_PATH."/Temp/~plugins.php",$content); 
  18.         S("widgets",$onWidget); 
  19.             //缓存更新成功,重新显示页面 
  20.         header("location: ".$_SERVER["REQUEST_URI"]); 
  21.         } 
  22.         $this->assign("widgets",$onWidget); 

   总的来说,从数据库中取出每个widget的相关信息,并assign到视图中。

   可以考虑就在文件夹中加一个文件保存相关信息,那么就可以复制即生效的效果,和wordpress等相同。

    4.  主视图中调用非常容易。

  1. <volist name="widgets" id="widget"> 
  2. {~W($widget)} 
  3. </volist> 

 

该日志标签: yblog, thinkphp, 学习

yblog学习——action设计

该日志由 xm 发表于 2009-03-22

   yblog建立了一个完成基础功能的BaseAction,其他aciton继承于它。通过利用php的继承机制,大大简化了开发过程。

  BaseAction里面有些什么内容呢?

    1.     这个action是这样定义的

  1. class BaseAction extends Action 

  个人觉得:用抽象类更好。

   2.     其下有  保存配置;

  1. protected $options

   3.    空操作

  1. function _empty()  
  2. {  
  3.     $this->error("请求的页面不存在");  

  具体在子类BlogAction里面有个非常好的重定向:

  1. function _empty()  
  2.     { //用来显示单篇日志或页面的空操作  
  3.         $where = array();  
  4.         $where["post_status"] = "publish";   
  5. //访问的日志或页面必须是已发布的  
  6.         if(is_numeric(ACTION_NAME))  
  7.             $where["ID"] = ACTION_NAME;  
  8.         else if(ACTION_NAME == "post")  
  9.             $where["ID"] = $_GET["ID"];  
  10.         else 
  11.             $where["post_name"] = ACTION_NAME;  
  12.         $this->show($where);  
  13.     } 

    4.初始化操作 function _initialize()。例如,初始化$options


    思考:是不是可以将rbac就通过action继承机制实现呢?

该日志标签: yblog, thinkphp, 学习

yblog学习——工程间调用

该日志由 xm 发表于 2009-03-22

  既然是要把一个项目分割成一些小工程,必然需要工程间互相调用。yblog是怎么做到的呢?

  1.   配置文件的共享

    如前文,在总目录里放置了公用的数据库等配置文件,在各个项目里如何共享这些内容呢?

   以blogapp为例,打开其下Conf/config.php,可以看见以下内容:

  1. <?php  
  2. $db_config = require 'db_config.php';    
  3.  
  4. $user_config = require 'user_config.php';//首先引入公用的配置文件  
  5.  
  6. $sys_config = array(  
  7.     'ROUTER_ON'=>true,  
  8.     'DEFAULT_MODULE'=>'Blog',  
  9.     'THINK_PLUGIN_ON'=>true,  
  10.     'DEBUG_MODE'=>false,  
  11.     'USER_AUTH_KEY'=>'yblog_admin_id' 
  12. );                                      //定义自己的配置  
  13. return array_merge($db_config,$user_config,$sys_config);  
  14. //将不同的内容合并,应该注意顺序,后面的覆盖前面的,并返回  
  15. ?> 

  这样,只需要调用C()函数,就可以获得最后的配置了!

  不过值得注意的是,所有的路径都是以入口文件为标准进行表述的!

      2.工程间的跳转

     本工程间的链接,yblog使用的是url()函数,例如:

  1. <a href="{:url('feed','Blog')}" target="_blank"> 
  2.    <img alt="订阅RSS" src="../Public/Images/rss.gif"> 
  3. </a> 

    没有用最新的U()函数。还是喜欢用U()。

    工程间的链接处理,yblog是直接写网址进行调用。如果用U()函数应该更好吧。

 

该日志标签: yblog, thinkphp, 学习

Total:712Next ›
我要啦免费统计