注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天上人间*bobo之家

有阳光的时段,就有他(她)的博客文章。也许天气并非晴空万里,博主的“博物钟”却是

 
 
 

日志

 
 

hook vs xclass  

2009-11-20 17:13:35|  分类: typo3 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

Hook vs. XCLASS

1.       共同点

2.       不同点

 

共同点

       Hook XCLASS 都是被用于拓展TYPO3 系统功能的。

 

不同点

1、  Hook 是对某个方法拓展,XCLASS 是对TYPO3中某个类的拓展。

2、  XCLASS 拓展TYPO3中的类会将被拓展的类全部替换。Hook则不会,Hook会在被拓展的函数中加入相应的拓展功能。

3、  XCLASS 方式拓展如果你对TYPO3中同一个类进行拓展那么最后只有一个类会被执行。Hook 方式则不一样他会执行所有你定义好的Hook方法。

4、  在更新的时候,由于Hook 方式的调用需要在调用Hook的地方添加代码,所以在更新TYPO3的时候以前定义的Hook有可能会失效。XCLASS并没有在原文件中添加代码所以更新TYPO3时不影响XCLASS方式拓展。



Hook

 

1.         介绍

2.         使用

3.         Hook的两种实现方式

 

介绍

   Hook被用于在不改变原函数代码的情况下,修改现有的功能

 

使用

       Hook的使用将以 TIMTAB Weblog 的实现,进行说明

 // Hooks to tt_news  添加display项

$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['tt_news']['what_to_display'][$_EXTKEY.'_NEWS'] = array('BRAND_NEWS_LIST', 'BRAND_NEWS_LIST', null );

hook方法:

function processSelectConfHook(&$pObj, &$selectConf) {

if ($pObj->theCode == 'BRAND_NEWS_LIST') {

。。。//code

}

}

 public function extraCodesProcessor(&$pObj) {       //必需,用于template
  /* @var $pObj tx_ttnews */
  return ($pObj->theCode == 'COLLECT_NEWS_LIST' ? $pObj->displayList() : '');
 }

ext_localconf.php添加对应hook

$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['tt_news']['selectConfHook'][$_EXTKEY] = 'EXT:sr_feuser_extend/class.tx_srfeuserextendttnews_hooks.php:&tx_srfeuserextendttnews_hooks';

$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['tt_news']['extraCodesHook'][$_EXTKEY] = 'EXT:sr_feuser_extend/class.tx_srfeuserextendttnews_hooks.php:&tx_srfeuserextendttnews_hooks';

 

1、  Hook配置 (  {TYPO3_HOME}/typo3conf/ext/timtab/ext_localconf.php  )//registering for several hooks

$TYPO3_CONF_VARS['EXTCONF']['tt_news']['extraItemMarkerHook'][]        = 'tx_timtab_fe';

$TYPO3_CONF_VARS['EXTCONF']['tt_news']['userDisplayCatmenuHook'][]     = 'tx_timtab_catmenu';

$TYPO3_CONF_VARS['EXTCONF']['ve_guestbook']['extraItemMarkerHook'][]   = 'tx_timtab_fe';

$TYPO3_CONF_VARS['EXTCONF']['ve_guestbook']['preEntryInsertHook'][]    = 'tx_timtab_fe';

$TYPO3_CONF_VARS['EXTCONF']['ve_guestbook']['postEntryInsertedHook'][] = 'tx_timtab_fe';

$TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['processDatamapClass'][] = 'tx_timtab_be';

这里定义了 6 Hook

 

2、  使用HookpostEntryInsertedHook->链接ve_guestbook 提交留言的Hook

{TYPO3_HOME}\typo3conf\ext\ve_guestbook\pi1\class.tx_veguestbook_pi1.php 文件第769

if (is_array($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['ve_guestbook']

['postEntryInsertedHook'])) {

                                                 foreach($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['ve_guestbook']

 ['postEntryInsertedHook'] as $_classRef) {

                     $_procObj = & t3lib_div::getUserObj($_classRef);

                     $_procObj->postEntryInsertedProcessor($this);

       }

}

这里是在 ve_guestbook 中调用了 timtab 里定义好的 ‘postEntryInsertedHook’ Hook

 

3、  定义Hook (postEntryInsertedHook)

 

总结:

1、  Hook配置(一般Hook 都配置在插件的 ext_localconf.php 文件中)

l         $TYPO3_CONF_VARS['EXTCONF']

$TYPO3_CONF_VARS['EXTCONF'][ extension_key ][ sub_key ] = value

l         $TYPO3_CONF_VARS['SC_OPTIONS']

$TYPO3_CONF_VARS['SC_OPTIONS'][ main_key ][ sub_key ]

[ index ] = function_reference

l         $TYPO3_CONF_VARS['TBE_MODULES_EXT']

$TBE_MODULES_EXT[ backend_module_key ][ sub_key ] = value

Hook可以配置到上面列出的三个全局变量中,格式如蓝色字体所列。例如:

TIMTAB Weblog插件中对 postEntryInsertedHook 配置

 

$TYPO3_CONF_VARS['EXTCONF']['ve_guestbook']

['postEntryInsertedHook'][] = 'tx_timtab_fe';

 

2、Hook的使用

 

if (is_array($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['ve_guestbook']

['postEntryInsertedHook'])) {

                                                 foreach($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['ve_guestbook']

 ['postEntryInsertedHook'] as $_classRef) {

                     $_procObj = & t3lib_div::getUserObj($_classRef);

                     $_procObj->postEntryInsertedProcessor($this);

       }

}

这里就是 TIMTAB Weblog postEntryInsertedHook 的调用,这里首先判断了Hook是否存在,如果存在则用foreach 遍历所以配置好的Hook,然后调用相应的方法。


$content = 10;

if (is_array($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['extensionkey']['hook'])) {

   foreach ($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['extensionkey']['hook'] as $_classRef) {

      $_procObj = &t3lib_div::getUserObj($_classRef);

      $_procObj->main($content, $this);

   }

}

return $content;

解释: 如果设置Hook GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['extensionkey']['hook'], 将打开一个循环, 使得每个Hook都能通过 (能最终多次使用)

Hook的两种实现方式

1、  getUserObj

2、  callUserFunction

两种实现方法配置类似,使用的时候会有一定变化。

getUserObj 方式-- t3lib_div::getUserObj()

// Hook for preprocessing of the content for formmails:

if (is_array($this->TYPO3_CONF_VARS['SC_OPTIONS']['tslib/class.tslib_fe.php']

['sendFormmail-PreProcClass'])) {

foreach($this->TYPO3_CONF_VARS['SC_OPTIONS']['tslib/class.tslib_fe.php']

['sendFormmail-PreProcClass'] as $_classRef) {

$_procObj = &t3lib_div::getUserObj($_classRef);

$EMAIL_VARS = $_procObj->sendFormmail_preProcessVariables($EMAIL_VARS,

$this);

}

}

 

callUserFunction 方式--t3lib_div::callUserFunction()

// Call post processing function for constructor:

if (is_array($this->TYPO3_CONF_VARS['SC_OPTIONS']['tslib/class.tslib_fe.php']

['tslib_fe-PostProc'])) {

$_params = array('pObj' => &$this);

foreach($this->TYPO3_CONF_VARS['SC_OPTIONS']['tslib/class.tslib_fe.php']

['tslib_fe-PostProc'] as $_funcRef) {

t3lib_div::callUserFunction($_funcRef,$_params,$this);

}

}

XCLASS请点击:

http://omail.blog.163.com/blog/static/374380542009101653527599/

  评论这张
 
阅读(245)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018