Gallery:主题:参考:回调

来自站长百科
跳转至: 导航、​ 搜索

Callback主要用于读取外观主题区块中的数据。

一般来说,callback用于模板文件(.tpl)的数据读取。因为大部分模板文件显示的数据都被外观主题(themes/*/theme.inc)或视图所读取了,因此callback主要用于区块的数据读取。

举例[ ]

  • 模块/exif/模板/区块/ExifInfo.tpl 为某一特定图片显示并格式化EXIF信息。
  • ExifInfo.tpl使用callback呼叫为图片读取EXIF数据:
 {g->callback type="exif.LoadExifInfo" itemId=$item.id}
  • {g->callback }标签指示Gallery调用一个callback
  • type=exif.LoadExifInfo 指示Gallery callback的实际请求。形式总是为moduleId . CallbackName
    • 这种情况,moduleIdexif – 它指示Gallery在modules/exif/Callbacks.incs中查询callback名称。
    • 这种情况,CallbackNameLoadExifInfo
  • 你可以向callback函数传送任意多的参量。这种情况下,我们传送itemId=$item.id来指示callback为特定id的项目读取EXIF数据。
  • 最后,callback被调用,它处理请求并按约定将结果存储在$block.moduleId.CallbackName的一个模板变量中,$block.exif.LoadExifInfo
  • 在模板中(ExifInfo.tpl),我们可以使用被读取的数据,例如通过显示$block.exif.LoadExifInfo.exifData

现有Callback[ ]

  • albumselect.LoadAlbumData [albumTree=true]
    • 将相册树载入$block.albumselect.LoadAlbumData(keys tree,titles,params)中
    • 如果albumTree 参量被传送,也会为此tree(key albumTreeName)生成唯一的id
  • cart.LoadCart
    • 将cart数据载入$block.cart.ShowCart (keys unique,total)中
  • comment.AddComment [itemId=..]
    • 准备Add Comment表单
  • comment.LoadComments [itemId=..] [show=..]
    • 将comment(评论)载入$block.comment.LoadComments(keys comments,commenters,can,item,totalComments)中
    • itemId = 为此项目读取评论
    • show = 评论读取的最大限数
  • core.LoadLanguageSelector
    • 激活语言并载入$block.core.LanguageSelector(keys list,language)中
  • core.ShouldShowEmergencyEditItemLink [permissions=..] [checkBlocks=..]
    • 通过为core.ItemLinks区块检查各定义区块列表,设置$block.core.ShouldShowEmergencyEditItemLink为true/false;如未找到就设置flag为true
    • 旧的checkSidebarBlocks/checkAlbumBlocks/checkPhotoBlocks参量被弃用;使用类似checkBlocks="sidebar,album"的参量
  • core.LoadPeers [item=..] [windowSize=..] [loadThumbnails=..] [addEnds=..]
    • 将peer数据(window around given item plus first/last if addEnds is true)载入i$block.core.LoadPeers(keys peers,peerCount,thisPeerIndex,parent)
    • windowSize默认为7,loadThumbnails默认为false,addEnds默认为true
  • core.LoadValidationPlugins [level=..] [key=..]
    • 为已注册的ValidationPlugins(captcha)将模板数据载入$blocks.core.ValidationPlugins
    • 如果忽略level那么核心模块的validation.level参量就会被使用
    • 当可能使用中级别安全等级时,就需要key(密钥)(此验证请求的唯一字串)
  • customfield.LoadCustomFields [itemId=..]
    • 为给定项目将'细节'自定义字段载入$block.customfield.LoadCustomFields.fields
  • exif.LoadExifInfo
    • 为给定项目将EXIF数据载入$block.exif.LoadExifInfo(keys exifData,mode)
    • 是否读取摘要或细节信息是由检查存储在对话中的flag来决定的
  • imageblock.LoadImageBlock [parameters..]
    • 将图片区块数据载入$ImageBlockData(keys blocks,show等)
    • 参见Image Block Site Admin(图片区块站点管理)中的可用参量列表
    • repeatBlock=.. 重复给定区块参量相应的次数(如blocks=recentImage|recentImage与blocks=recentImage repeatBlock=2是一样的)
  • keyalbum.LoadKeywords [onlyPublic=..] [maxCloudFontEnlargement=..]
    • 为gallery中所有关键词将数据载入$block.keyalbum.keywords
    • 结果将被缓存1日
    • onlyPublic作为boolean来决定是载入读取关键词还是仅从公共项目读取
    • maxCloudFontEnlargement则为最常见关键词的字体像素尺寸(结果中"weight"的最大值)
  • members.LoadMembers
    • 将会员数据载入$block.members.LoadMembers(keys canViewList,count)
  • quotas.LoadQuotas
    • 将quota和disk usage信息载入$block.quotas.LoadQuotas
  • rating.LoadRating [itemId=..]
    • 为给定项目将rating数据载入$block.rating.RatingData and $block.rating.RatingValues
  • rss.FeedList [number=..]
    • 将RSS feed数据载入$block.rss

新Callback的创建[ ]

现在让我们在example上做个扩展,来更近一些看看实际处理callback的代码。

  • 按照约定,在modules/exif/Callbacks.inc中声明的类别必须为ExifCallbacks,其形式总是为moduleIdCallbacks
  • callback类别被期望实现单个函数来对所有callback呼叫进行处理:
  /**
   * @param array $params 传送到callback的参量(在我们的例子中仅定义了$params['itemId'])
   * @param object GallerySmarty $smarty smarty对象的参照
   * @param string $callback callback的名称(在我们的例子中是''LoadExifInfo'')
   * @param int $userId 动作用户的userId(在权限检查中使用此userId)
   * @return object GalleryStatus(在函数末尾返回null;)
   */
  function callback($params, &$smarty, $callback, $userId=null) { ... }
  • callback(...)函数中的代码具有如下典型的用处:
    • 识别准确的callback名称,因为callback函数可被exif.LoadExifInfo或exif模块的其他任何callback所呼叫。
    • 读取被请求的数据
    • 将被请求的数据指派给一个模板变量
  • 这里有一个简略的例子:
class ExifCallbacks {
  function callback($params, &$smarty, $callback, $userId=null) {
      /* 1. 识别准确的callback名称 */
      switch ($callback) {
	case 'LoadExifInfo':
            /* 2. 读取被请求的数据 */
	    GalleryCoreApi::requireOnce('modules/exif/classes/ExifHelper.class');
            $exifData = ExifHelper::getExifData($params['itemId']);

            /* 3. 将被请求的数据指派给一个模板变量 */
            $block =& $smarty->_tpl_vars['block'];
            /* By convention, put the data into $block[$moduleId] (in this case, moduleId is 'exif') */
	    $block['exif']['LoadExifInfo'] = array('exifData' => $exifData,
						   'randomNumber' => rand()); // You can put any data into the template variable...
	    break;
	case 'SomeOtherCallbackName':
            ...
      }

      return null;
  }
}
  • 切记,在这里exifLoadExifInfo仅作为$moduleId和$callback的示例。请在你的代码中将这些值改为你自己的moduleId或callback名称。