Discuz!官方免费开源建站系统

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

数据调用分析

[复制链接]
evenzhou 发表于 2011-9-5 22:49:51 | 显示全部楼层 |阅读模式
数据调用可以增加网站数据调用的灵活性,让其它网站也能够调用论坛的数据信息(外部数据调用)

数据调用使用:
进入后台 -- 门户 -- 模块管理 --数据调用
然后,添加调用  。添加成功之后,管理员可以选择:内部调用、外部调用,两种方式。
内部调用:如,<!--{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数据,
输出到浏览器
64243354 发表于 2011-9-5 22:59:31 | 显示全部楼层
先顶后看啊 E大
回复

使用道具 举报

onehua 发表于 2011-9-6 12:53:08 | 显示全部楼层
都是好文章啊。
回复

使用道具 举报

benls 发表于 2011-9-7 00:16:06 | 显示全部楼层
太高深了,实在看不懂
回复

使用道具 举报

柏杉 发表于 2011-9-7 11:52:21 | 显示全部楼层
内部调用可以伪静态吗?
回复

使用道具 举报

非一般感觉 发表于 2011-9-7 11:55:06 | 显示全部楼层
学习了啊
回复

使用道具 举报

1130310230 发表于 2011-9-7 15:30:48 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

89txt小说下载网 发表于 2011-9-7 23:34:04 | 显示全部楼层
报道我来
回复

使用道具 举报

icried 发表于 2011-9-8 21:49:34 | 显示全部楼层
非常非常good
回复

使用道具 举报

新品棋 发表于 2011-9-10 09:12:00 | 显示全部楼层
中秋快乐
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2024-11-16 12:34 , Processed in 0.029977 second(s), 2 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

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