Submitted by gouki on 2010, June 13, 1:42 PM
typecho 插件之:内容分页SplitArchivePage
当你的文章内容很长时,可以考虑用此插件来给文章进行简单的分页
 
//原本考虑主动在post和page页插入分页符的,经友情提示,这些可以去除。
//因为如果不这样,我要考虑很多东西,比如richEdit编辑器,但这种编辑器太多了。所以直接根据友情提示而放弃主动插入
//如果你不用richEdit,这两行注释可以打开。
//        Typecho_Plugin::factory('admin/write-post.php')->content = array('SplitArchivePage_Plugin', 'render');
//        Typecho_Plugin::factory('admin/write-page.php')->content = array('SplitArchivePage_Plugin', 'render');
 
0.1.5 原有的程序只支持一个GET变量,现在已修正,只要是GET变量都支持【如果使用了typecho 插件:搜索来源关键字高亮0.1.2版本,请务必更新到此版本】
0.1.4 修正了Rewrite规则下,还会自动加上index.php的BUG,目前在Rewrite规则下去除了index.php
0.1.3 修正了内容页中如果没有插入分页符内容不能显示的BUG(疏忽)
0.1.2 基本功能实现
下载地址为:
【0.1.5】splitarchivepage.rar
【0.1.4】splitarchivepage.rar
【0.1.3】splitarchivepage.rar
 
Tags: typecho, splitarchive
PHP | 评论:14
 | 阅读:47995
Submitted by gouki on 2010, June 13, 10:16 AM
看typecho第二天了,不过我还是没有仔细查看源码,只是根据一些其他插件的应用来写自己的应用。
比如,看了Akismet插件后,知道了 Typecho_Widget_Helper_Form 对象还有一个 addRule 方法,用来对数据进行验证。
昨天看了一下源码,并对应我昨天的方法了解Typecho页面中可以被注入对象的地方,在插件的activate中写了两个方法,可以让插件在全局被应用。
        Typecho_Plugin::factory('index.php')->begin = array('DbBackup_Plugin', 'backup');
        Typecho_Plugin::factory('admin/common.php')->begin = array('DbBackup_Plugin', 'backup');
嗯。是准备考虑备份的。前后台都有。正在尝试。如果并未按照我预想的情况运行的话,可能只考虑前台触发了。
加了三个参数:
        $rate = new Typecho_Widget_Helper_Form_Element_Text('rate', NULL, '1', _t('备份频率'),_t('备份数据的频率(最小单位为天,请使用整数)'));
        $form->addInput($rate->addRule('isInteger',_t('请输入整数')));
        $email = new Typecho_Widget_Helper_Form_Element_Text('email', NULL, '', _t('备份发送到'),_t('发送邮件地址。'));
        $form->addInput($email->addRule('email',_t('请输入正确的邮箱地址')));
        $lastbackup = new Typecho_Widget_Helper_Form_Element_Text('lastbackup', NULL, '', _t('上次备份时间'),_t('无需设置,由程序自动生成'));
        $form->addInput($lastbackup);
但是isInteger,这个验证方法是验证is_numeric,其实我是希望是一个正整数。现在,先将就一下下喽。离完成还早,顺便附上两个昨天写的垃圾插件,敬请测试(主要是官方论坛我注册后收不到邮件,所以无法登录。过会我再换个邮箱试试)
文章分页:已经删除,请移步typecho  插件:内容分页SplitArchivePage 进行下载 【演示地址】
高亮搜索引擎来源关键字:highlightsearchkeywords.rar 【这个,在这现在这个博客上测试成功,但是在typecho上没有办法测试,因为没有数据,google搜索不到。。。】
 
Tags: typecho, 笔记, 插件
PHP | 评论:6
 | 阅读:31184
Submitted by gouki on 2010, June 12, 11:14 AM
关于插件这个问题,可以查看这篇JianHua  Zhang的Typecho阅读笔记三:插件机制,我想说的就是链接文章里的最后一句。
在Typecho_Plugin的__call魔术方法里把当前设置到的component全部打印在页面上,对于插件开发人员来说是一件非常好的事情,因为这样,你可以了解到,有哪些地方是你可以注入你的插件对象的。

看左上角(看不清的话,请点击看大图)。
Widget_Archive:select
Widget_Archive:handleInit
象这两个,代表了你在插件中就可以写上以下代码来进行注入。
Typecho_Plugin::factory("Widget_Archive")->select = array("插件类名","该类中的方法");
是不是很方便 ?打开每一个页面,你都可以看到类似的代码,有logo,有content,contentEx之类的。了解了这些,在相应的位置上写上你想要的效果,是不是很爽?
顺便,你需要查看一下http://docs.typecho.org/develop/widget。也可以了解一些代码是如何被调用(文中有一点点错误,在看的时候Typecho::widget,应该是Typecho_Widget::widget("xxx"))
 
Tags: typecho, 笔记, 插件注入
PHP | 评论:4
 | 阅读:28773
Submitted by gouki on 2010, June 12, 10:57 AM
文章来自:http://blog.csdn.net/jh_zzz/archive/2010/01/11/5173876.aspx
由于我也正在看  typecho这个玩意所以,就记录下来。虽然我一天下来,也看了不少代码,但毕竟没有深读过。对于流程啥的,还没有开始关心,只是为了写而写。
第三篇:插件机制
以  index.php   为例:
/**  初始化组件  */ 
Typecho_Widget::  widget('Widget_Init' ); 
  
Init   的 execute  中会初始化 Typecho_Plugin ,这里 $options  ->  plugins 是从数据库读出来后反序列化的: 
Typecho_Plugin::  init($options ->  plugins); 
init   中分别将 plugins  中的 activated 和 handles
PHP代码
    - $component  =  $this -> _handle .  ':'  .  $component ;  
 
    - $last = count($args );  
 
    - $args [$last ] = $last > 0 ? $args [0 ] : false ;   
 
    -   
 
    - if (isset (self:: $_plugins ['handles' ][$component ])) {  
 
    -     $args [$last ] = NULL ;  
 
    -     $this -> _signal = true ;  
 
    -     foreach (self:: $_plugins ['handles' ][$component ] as $callback ) {  
 
    -         $args [$last ] = call_user_func_array($callback , $args );  
 
    -     }  
 
    - }   
 
 
 
__call 查找对应  index.php:begin  的 Typecho_Plugin ,如果找到的话,就会调用相应的方法。例如如果找到的是  HelloWorld_Plugin  ,则 HelloWorld_Plugin.render()   会被执行。
  ( 
  [0] => HelloWorld_Plugin 
  [1] => render 
) 
  
简单说一下 Plugin   是如何加载的,在 config.inc.php   中首先设置了包含路径,插件路径也在其中:
/**  设置包含路径  */ 
@  set_include_path(get_include_path()  .   PATH_SEPARATOR .   
__TYPECHO_ROOT_DIR__ .   '/var'  .   PATH_SEPARATOR .   
__TYPECHO_ROOT_DIR__ .   __TYPECHO_PLUGIN_DIR__ ); 
  
HelloWorld_Plugin   此时尚未被加载,所以当执行到 HelloWorld_Plugin.render()   时 , Typecho_Common::__autoLoad 函数被执行,这里会自动加载指定的插件文件: 
@  include_once  str_replace('_' , '/' , $className  ) .   '.php' ; 
例如对于  HelloWorld_Plugin  ,文件就是 HelloWorld\Plugin.php  ,因为 usr/plugin   目录已经在包含的路径中,所以这个文件可以正常加 载。
  
当初我学习 php  的时候还是 php3  ,现在一些新特性我都不知道,这一段我看了半天才搞 清楚,这次读这些代码了解了不少 php  的新特性:)
---EOF---
至此,JianHua Zhang的三篇博客都已经转载完毕,但是对于最后这个插件,我是建议在开发的时候,Typecho_Plugin类的__call方法里加上一行:
echo $component . '<br>';
这样可以在显示页面的时候让你了解你每块区域加载了哪些插件,也就是说,这些插件位置,是可以被你注入代码的。OK。了解了这一点,你可以根据你想要的效果为各个地方加上你的代码。
 
 
 
Tags: typecho, 笔记
PHP | 评论:0
 | 阅读:21718
Submitted by gouki on 2010, June 12, 10:49 AM
文章来自:http://blog.csdn.net/jh_zzz/archive/2010/01/11/5173851.aspx,由于我也正在看 typecho这个玩意所以,就记录下来。虽然我一天下来,也看了不少代码,但毕竟没有深读过。对于流程啥的,还没有开始关心,只是为了写而写。
第二篇:数据库访问
这一块比较复杂,我还没有完全理解为什么要把  SQL   语句的组装搞这么复杂。
从一个普通皮肤页面开始 themes\default\index.php  ,代码如下:
PHP代码
    - <?php  while ($this -> next()):  ?>  
 
    -     < div class ="post">  
 
    -        < h2 class ="entry_title">< a href ="<?php $this -> permalink() ?>"><?php $this -> title() ?></ a ></ h2 >  
 
    -        < p class ="entry_data">  
 
    -            < span ><?php _e(' 作者: ' ); ?><?php $this -> author(); ?></ span >  
 
    -            < span ><?php _e(' 发布时间: ' ); ?><?php $this -> date('F j, Y' ); ?></ span >  
 
    -            < span ><?php _e(' 分类: ' ); ?><?php $this -> category(',' ); ?></ span >  
 
    -            < a href ="<?php $this -> permalink() ?>#comments"><?php $this -> commentsNum('No Comments' , '1 Comment' , '%d Comments' ); ?></ a >  
 
    -        </ p >  
 
    -        <?php $this -> content(' 阅读剩余部分 ...' ); ?>  
 
    -     </ div >    
     
    - <?php endwhile ; ?>   
 
 
从上面我们知道这个文件是在 Widget_Archive 执行时被  包含进来的,所以在这里 $this  就是 Widget_Archive , next() 函数具体实现在 Typecho_Widget 中,他只是从 $stack 中取出一行数据返回,然后移向下一行, $stack 中的数据是如何生成的呢? 
  
在 Widget_Archive 的 execute 函数中,有这几行: 
$select   =   $this ->  select()->  where ('table.contents.status = ?' , 'publish' ) 
->  where('table.contents.created < ?' , $this ->  options->  gmtTime); 
… 中间代码略过 … 
$select  ->  order('table.contents.created' , Typecho_Db::  SORT_DESC) 
->  page($this ->  _currentPage, $this ->  parameter->  pageSize); 
$this  ->  db->  fetchAll ($select  , array ($this  , 'push' )); 
  
下面是    Widget_Abstract_Contents::  select()
PHP代码
    - public  function  fetchAll($query , array  $filter  =  NULL )  
 
    - {  
 
    -       
 
    -     $resource = $this -> query ($query , self:: READ);  
 
    -     $result = array ();    
 
    -   
 
    -       
 
    -     if (! emptyempty ($filter )) {  
 
    -         list ($object , $method ) = $filter ;  
 
    -     }  
 
    -   
 
    -       
 
    -     while ($rows = $this -> _adapter-> fetch ($resource )) {  
 
    -           
 
    -         $result [] = $filter ? call_user_func (array (& $object , $method ), $rows ) : $rows ;  
 
    -     }  
 
    -     return $result ;  
 
    - }   
 
 
 
首先执行 query()  , query()  函数会执行:
$resource   =   $this ->  _adapter->  query($query  , $handle  , $op  , $action  ); 
然后将查询的结果返回,根据上面 提到的 config.inc.php ,这里的 _adapter 是 Typecho_Db_Adapter_Mysql ,他其实就是执行了一个 mysql 查询: 
if  ($resource   =   @  mysql_query($query   instanceof  Typecho_Db_Query ?   $query ->  __toString()  :   $query  , $handle  )) { 
     return  $resource  ; 
} 
这里的 $query->__toString()  会返回经过 Typecho_Db_Query 处理后的  最终用来执行的 SQL  语句。
得到查询结果后,上面的 fetchAll 函数就循环调用回调函数将数据回调出去,前面的代码中 Widget_Archive 在调用时指定的是 push ,在 push 函数中返回的每一行数据都被压入 $stack ,这样 $stack 中就有了一行行的数据了。 
 
 
 
Tags: typecho, 笔记
PHP | 评论:0
 | 阅读:21741