数据调用可以增加网站数据调用的灵活性,让其它网站也能够调用论坛的数据信息(外部数据调用)
数据调用使用:
进入后台 -- 门户 -- 模块管理 --数据调用
然后,添加调用 。添加成功之后,管理员可以选择:内部调用、外部调用,两种方式。
内部调用:如,<!--{block/314}--> 用将这样的代码放入到模板中即可,在浏览的时候,程序会自动处理
外部调用:如:<script type="text/javascript" src="http://localhost/x2zs/api.php?mod=js&bid=314"></script> 将这种代码放到想要展示的地方。注意:如果将js代码放置在论坛之外的程序中,由于没有样式控制,展示会混乱。因此需要管理员在调用js代码的地方添加样式、或者在添加调用模块的时候,直接在模板中定义样式控制
如:- <div class="module cl xl xl1">
- <style type="text/css">
- ul {
- list-style:none;
- }
- </style>
- <ul>
- [loop]
- <li><a href="{url}" title="{title}"{target}>{title}</a></li>
- [/loop]
- </ul>
- </div>
复制代码 外部调用的链接是不会被伪静态化,原因:discuz!伪静态原理是将模版输出前的链接替换,js是调用输出的数据是不被伪静态化
数据调用原理:
内部调用: 将<!--{block/314}-->这种代码放置到模板中的时候,在模板被解析的时候
打开:class_template.php
$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 模块显示,具体过程这里不做分析
外部调用:
<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- header('Expires: '.gmdate('D, d M Y H:i:s', time() + 60).' GMT');
- if(!defined('IN_API')) {
- exit('document.write(\'Access Denied\')');
- }
- loadcore();
- include_once libfile('function/block');
- loadcache('blockclass');
- $bid = intval($_G['gp_bid']);
- block_get_batch($bid);
- $data = block_fetch_content($bid, true);
- $search = "/(href|src)\=("|')(?![fhtps]+\:)(.*?)\\2/i";
- $replace = "\\1=\\2$_G[siteurl]\\3\\2";
- $data = preg_replace($search, $replace, $data);
- 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数据,
输出到浏览器
|