discuzx数据调用分析

来源:互联网 发布:齐鲁商品软件下载 编辑:程序博客网 时间:2024/04/29 05:49
数据调用可以增加网站数据调用的灵活性,并可减少网站模板的冗余代码,让其它网站也能够调用论坛的数据信息(外部数据调用)

数据调用使用:
进入后台 -- 门户 -- 模块管理 --数据调用
然后,添加调用  。添加成功之后,管理员可以选择:内部调用、外部调用,两种方式。
内部调用:如,<!--{block/314}--> 用将这样的代码放入到模板中即可,在浏览的时候,程序会自动处理
外部调用:如:<script type="text/javascript" src="http://localhost/x2zs/api.php?mod=js&bid=314"></script> 将这种代码放到想要展示的地方。注意:如果将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

$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
  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数据,
输出到浏览器
0 0
原创粉丝点击