设为首页收藏本站

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 181|回复: 0

discuzx数据调用工作原理

[复制链接]
发表于 2013-3-8 03:27:58 | 显示全部楼层 |阅读模式
数据调用可以增加网站数据调用的灵活性,并可减少网站模板的冗余代码,让其它网站也能够调用论坛的数据信息(外部数据调用)

数据调用使用:
进入后台 -- 门户 -- 模块管理 --数据调用
然后,添加调用 。添加成功之后,管理员可以选择:内部调用、外部调用,两种方式。
内部调用:如,<!--{block/314}--> 用将这样的代码放入到模板中即可,在浏览的时候,程序会自动处理
外部调用:如:<script type="text/javascript" src="http://localhost/x2zs/api.php?mod=js&bid=314"></script&gt; 将这种代码放到想要展示的地方。注意:如果将js代码放置在论坛之外的程序中,由于没有样式控制,展示会混乱。因此需要管理员在调用js代码的地方添加样式、或者在添加调用模块的时候,直接在模板中定义样式控制
如:
  1. <div class="module cl xl xl1">

  2. <style type="text/css">

  3. ul {

  4. list-style:none;

  5. }

  6. </style>

  7. <ul>

  8. [loop]

  9. <li><a href="{url}" title="{title}"{target}>{title}</a></li>

  10. [/loop]

  11. </ul>

  12. </div>
复制代码
外部调用的链接是不会被伪静态化,原因:discuz!伪静态原理是将模版输出前的链接替换,js是调用输出的数据是不被伪静态化

数据调用原理:

内部调用: 将<!--{block/314}-->这种代码放置到模板中的时候,在模板被解析的时候
打开:class_template.php
  1. $template = preg_replace("/[\n\r\t]*\{block\/(\d+?)\}[\n\r\t]*/ie", "\$this->blocktags('\\1')", $template);
复制代码
这里将 <!--{block/314}-->这样的代码进行替换 ,最终得到的是类似这样的代码:<?php block_display('$bid');?>

block_display函数的功能:等同于block_display_batch 模块显示,具体过程这里不做分析

外部调用:
  1. <script type="text/javascript" src="http://localhost/x2zs/api.php?mod=js&bid=314"></script>
复制代码
从这段代码中可以看出,访问的是接口api.php
从 api.php?mod=js可以分析出: 最终进入到文件,api\javascript\javascript.php
  1. header('Expires: '.gmdate('D, d M Y H:i:s', time() + 60).' GMT');

  2. if(!defined('IN_API')) {

  3. exit('document.write(\'Access Denied\')');

  4. }

  5. loadcore();

  6. include_once libfile('function/block');

  7. loadcache('blockclass');

  8. $bid = intval($_G['gp_bid']);

  9. block_get_batch($bid);

  10. $data = block_fetch_content($bid, true);

  11. $search = "/(href|src)\=("|')(?![fhtps]+\:)(.*?)\\2/i";

  12. $replace = "\\1=\\2$_G[siteurl]\\3\\2";

  13. $data = preg_replace($search, $replace, $data);

  14. echo 'document.write(\''.preg_replace("/\r\n|\n|\r/", '\n', addcslashes($data, "'\")).'\');';
复制代码
首先加载核心库,然后 加载 blockclass缓存, 是用block_get_batch函数(function_block.php文件中)批量处理 block数据
最终使用block_fetch_content 函数(function_block.php文件中)返回html数据,
输出到浏览器(编辑整理:IT618资讯网)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|小黑屋|BC Morning Website ( Best Deal Inc. 001 )  

GMT-8, 2025-12-12 22:31 , Processed in 0.013743 second(s), 16 queries .

Supported by Best Deal Online X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表