uchome二次开发基础

UCHome 二次开发: uchome 文件体系介绍

本期主要介绍UCHOME 的体系结构开始,一步一步教大家理解UCHOME 。

UCHOME 安装后的主要目录与文件介绍:

admin/       管理后台
api/      API 函数[ 插件开发与模板等的修改不需要动此文件 ]
attachment/ 附件目录

data/    缓存目录,此目录要有777 权限,系统相关缓存基本上都在这里了
data/tpl_cache/ 模板缓存目录,注意,如果你的UCH 白屏了,无法进入后台跟新缓存,通过FTP 手工删除此目录下的所有文件即可相当于模板缓存的更新
image/   图片目录
language/    语言目录 ,跳转提示语言等
source/  PHP 源程序目录
template/   模板目录
theme/ 个人主页目录
uc_client/ ucenter 客户端 [ 插件开发与模板等的修改不需要动此文件 ]
以下是UCHOME 根目录下常用文件【不常用的不在介绍】

admincp. php    后台管理入口文件
common.php   通用文件,所有的文件都要包含这个文件,在上篇已详细解释了内容
config.php   基本配置文件
cp.php      编辑日志、相册、活动等等相关编辑操作基本上都从这个文件入口
do.php    登录、注册、找回密码、相册批量上传、在需要密码的情况下才能查看日志相册、验证码、发送邮件、统计、邮件验证等行为的入口文件
editor.php   编辑器的入口文件,强烈建议您不用动他
magic.php   道具入口文件

network.php 随便看看等入口文件
space.php    个人空间、日志、相册、活动等入口文件

我们一般修改UCH 主要涉及的入口文件有space.php  network.php  do.php  cp.php 这四个,那么我们如何根据你访问的URL 判断涉及到那些PHP 文件和模板文件,方便您的进一步修改!

好了,现在我们以最简单的do.php 入口文件来分析下,
举个列子,如果我们使用找回密码功能,通常链接如下:do.php?ac=lostpasswd ,而注册的链接一般分两种,一种是do.php?ac= 后台自定义登录识别名
另一种是do.php?ac= 随机
好了,我们进入do.php 文件中继续看看:

include_once(’./common.php’); 上节说了,这个是公用文件,在上篇已详细解释了内容

// 获取方法
$ac = empty($_GET['ac'])?”:$_GET['ac']; // 获取do.php?ac 中ac 的值

// 自定义登录
if($ac == $_SCONFIG['login_action']) {
//
这里的全局变量$_SCONFIG['login_action'] 就是ac= 自定义标示名或那个随机串,如果相同则把原来的do.php?ac=XXXX 抓换成类似效果 do.php?ac=login
$ac = ‘login’;
} elseif($ac == ‘login’) {
$ac = ”;
}
if($ac == $_SCONFIG['register_action']) {
// 这里的全局变量
$_SCONFIG['register_action']
// 就是ac= 就是后面的自定义标示名或那个随机串,如果相同则把原来的do.php?ac=XXXX 抓换成类似效果
do.php?ac=register
$ac = ‘register’;
} elseif($ac == ‘register’) {
$ac = ”;
}

// 允许的方法
// 这里很重要,login 对应的是登录,register 定义的是注册,lostpasswd 定义的是找回密码,与上面访问的URL 是否是对应上了
// 对应上面的do.php?ac=login,do.php?ac=register,do.php?ac=lostpasswd, 其他类似!如果ac 后的参数不在下面的数组中,则为非法。跳转到首页
$acs = array(’login’, ‘register’, ‘lostpasswd’, ’swfupload’, ‘inputpwd’,
‘ajax’, ’seccode’, ’sendmail’, ’stat’, ‘emailcheck’);
if(empty($ac) || !in_array($ac, $acs)) {
showmessage(’enter_the_space’, ‘index.php’, 0);
}

// 链接
$theurl = ‘do.php?ac=’.$ac;
//
这是包含文件的意思,继续执行一下文件的意思,
// 其中S_ROOT 是UCHOME 安装目录的常量
// 根据下面的语句,我们可以这样判断,如果链接是do.php?ac=lostpasswd 的话,程序继续执行source/do_lostpasswd.php 文件!
include_once(S_ROOT.’./source/do_’.$ac.’.php’);

不知道大家是否能理解,不理解多看几遍!

好了,我们找到source/do_lostpasswd.php 文件看下,这个文件代码较多,我们不用管他,最主要的是我们要找到其对应的模板,
查找下include template 这个语句【注:在其他php 文件中可能有多个结果,那是因为不同条件下包含不同的模板】。你就会发现在末尾找到

include template(’do_lostpasswd’);

这就是模板名,这个记住规则,do_lostpasswd 对应的模板是do_lostpasswd.htm 名。那么这个文件在哪个位置呢?
我们系统目录template/ 下有 默认的default,blue,green 这,对三个文件夹应不同的风格,如果你安装了其他风格,可能还有其他目录。
系统是如何查找do_lostpasswd.htm 呢?
大家记得在后台有一个模板选择的下拉表吗?系统会在你选择的模板风格文件夹下查找do_lostpasswd.htm ,如果找不到则在去default 目录下查找。

注意: 为了提供效率,模板并不是每次都编译的,严格的来说,UCHOME 会先判断对应的模板是否被解析过了【查找data/tpl_cache/ 目录下是否有对应的模板缓存】
如果没有的话才会去按上面的规则去查找。

基本上,按照以上思路就可以根据链接找到匹配的程序文件和模板文件了
下节我们将会介绍几个制作模板中实用的诀窍及模板的解析原理。如如何修改程序让UCHOME 每次都重新解析模板,而不生成缓存!

UCenter Home 二次开发基础

前言
本文将就UCH 二次开发这个核心主题,以各种实现的代码为主,辅助部分说明概略的讲解如何针对UCH 进行二次开发。过段时间UCH 就开源了,准备到时候再详细的写篇UCH 机制分析。

顺便说下,这篇文件写在大约两周以前,但是一直没有时间整理发布,今天听说UCH 会在最近一段时间开源,到时候再发反而对大家帮助不大,所以决定不再整理,虽然文中一些说明还不详细,但是已经基本成文。

数据调用
这里的数据调用是使用UCenter Home 内置的数据调用,在后台的“ 高级应用” 里有“ 数据调用” 管理,以下代码都是在模板中添加,然后调用数据。
1. 站内数据调用
<!–{template data/blocktpl/1}–>

2. 站外JS 调用
<script language=”java script” type=”text/java script” src=”http://www.ccvita.com/js.php ?id=1″></script>

block 的使用
这个block 数据调用和前面的讲的数据调用,从数据来源和生成来说是基本类似的,。
<!–block 模块调用演示 –>
<!–{block/sql/SELECT%20%2A
%20FROM%20uchome_blog%20ORDER%20BY%20dateline%20DESC%20LIMIT%200%2C 8/cachename/test/cachetime/0}–>
<!–{loop $_SBLOCK['test'] $value}–>
<li><a href=”space.php?uid=$value[uid]&do=blog&id=$value[blogid]“>$value[subject]</a></li>
<!–{/loop}–>

eva l 的使用
合理的使用Ucenter Home 模板语法中的eva l 语法,会在一定程序上降低二次开发的难度。比如:
1. 通过eva l 语法在模板内执行PHP 语句
<!–eva l 用法演示 –>
<!–{eva l echo ‘<li><a href=”do.php?ac=demo”><strong> 最新日志演示</strong></a> ‘;}–>

2. 通过eva l 语法引入一个外部PHP 文件
引入外部文件
<!– 用eva l 来include 外部文件 –>
<!–{eva l include ‘demo.php’}–>

备注:通过在模板中引入外部文件,你可做任何你想做的事情。

直接外部文件
do.php 的扩展
1. 首先,在do.php 文件中添加允许的新方法
即在
$acs = array(’login’, ‘comment’, ‘wall’, ‘register’, ‘lostpasswd’, ’swfupload’, ‘inputpwd’,
’sns’, ‘viewspace’, ‘relatekw’, ‘ajax’, ’seccode’);

之后添加
$acs[] = ‘demo’;

2. 然后,在source 目录下新建do_demo.php 文件,调用地址就是 do.php?ac=demo
虽然UCH 发布的文件是加密信息,但是我们从其已经开源的文件中可以得出进行UCH 二次开发宝贵的信息。

比如/source/cron 这个目录下以及source/class_mysql .php 文件都是开源的,我们可以从中找出,对UCH 进行二次开发非常有用的一些信息,比如如何进行SQL 查询,通过分析,我们可以写出以下文件。
< ?php
!defined(’IN_UCHOME’) && exit(’Access Denied’);

$query = $_SGLOBAL['db']->query(’SELECT * FROM ‘.tname(’blog’).’ ORDER BY dateline DESC LIMIT 10′);
$bloglist = array();
while ($value = $_SGLOBAL['db']->fetch_array($query)) {
$bloglist[] = $value;
}
include template(’do_demo’);
?>

模板文件templates/default/do_demo.htm 内容为
<!–{template header}–>

<div>
<div>
<div>
<ul>
<!–{loop $bloglist $value}–>
<li>
<div>
<h4><a href=”space.php?uid=$value[uid]&do=blog&id=$value[blogid]“>$value[subject]</a></h4>
<a href=”space.php?uid=$value[uid]“>$value[username]</a> <span><!–{date(’Y-m-d H:i’,$value[dateline])}–></span>
</div>
<div>
<!–{if $value[viewnum]}–><a href=”space.php?uid=$value[uid]&do=blog&id=$value[blogid]“>$value[viewnum] 次阅读
</a><span>|</span><!–{/if}–>
<!–{if $value[replynum]}–><a href=”space.php?uid=$value[uid]&do=blog&id=$value[blogid]#comment”>$value[replynum] 个评论</a><!–{else}–> 没有评论
<!–{/if}–>
</div>
</li>
<!–{/loop}–>
</ul>
</div>
</div>
</div>

<!–{template footer}–>

总结
当前的UCH 是在模板界面完全可修改,合理利用上述数据调用机制的情况下,鲜有我们不能实现的页面效果和数据调用要求。

UCHome 二次开发:common.php 文件解析使用UCHome 插件的用户越来越多,但所有的站都使用同样的同样的程序,没有自己的特色是很难推广开的。同时不同的站需要不同的功能,同时同一个站在不同的时期也有不同的功能需求,鉴于此,本人通过多款插件的开发经验,对UCHome 程序也有了一定的认识。为了感谢广大站长对我的插件的关心,本人开贴,对UCHome 程序进行全面解析。主要分为程序篇和模板篇。请希望学习UCHome 的会员关注此贴。

今天晚上准备第一章,
index.php 文件第一行就是包含了
include_once(’./common.php’);
文件所以先对common.php 文件解析:

<?php
/*
[UCenter Home] (C) 2007-2008 Comsenz Inc.
$Id: common.php 10981 2009-01-14 03:05:20Z liguode $
*/
//
定义一个常量,用来在其他页面中,防止被恶意用户直接调用其他PHP 文件。
@define(’IN_UCHOME’, TRUE);
//
定义一个常量,这个常量表示版本号
define(’X_VER’, ‘1.5′);
//
这个也是一个常量,次版本号
define(’X_RELEASE’, ‘20090114′);
/*
定义程序的调试模式,在我们调试程序的时候将常量值设为1 ,这样程序出错的时候会在页面显示错误信息。
在调试完毕正常投入使用后设为0 ,这样程序出错不会显示给用户。
*/
define(’D_BUG’, ‘0′);
//
通过D_BUG 常量值指定错误报告类型。其中error_reporting() 的参数是错误报告类型,相关参数可查询PHP 手册
D_BUG?error_reporting(7):error_reporting(0);
//
这下面都是定义的全局变量。具体的会在后面使用的时候一一介绍
$_SGLOBAL = $_SCONFIG = $_SBLOCK = $_TPL = $_SCOOKIE = $_SN = $space = array();
//
定义程序目录常量。其中DIRECTORY_SEPARATOR 是路径分隔符,linux 上就是’/’ windows 上是 ’/’
define(’S_ROOT’, dirname(__FILE__).DIRECTORY_SEPARATOR);

// 加载基本的配置文件,用了@ 符号,达到找不到该文件时在页面不提示错误信息
if(!@include_once(S_ROOT.’./config.php’)) {
//
如果找不到的话则重定向到安装文件
header(”Location: install/index.php”);
exit();
}

// 通用函数文件,具体函数在介绍时间会一一解释
include_once(S_ROOT.’./source/function_common.php’);
//
时间microtime() 获取含毫秒的时间
$mtime = explode(’ ‘, microtime());
$_SGLOBAL['timestamp'] = $mtime[1];
//$mtime[0]
为UNIX 时间戳(整形), $mtime[0] 为毫秒
$_SGLOBAL['supe_starttime'] = $_SGLOBAL['timestamp'] + $mtime[0];

//get_magic_quotes_gpc 检测PHP.INI 配置中的魔术引号功能是否打开
$magic_quote = get_magic_quotes_gpc();
if(empty($magic_quote)) {
//
如果自动过滤每打开,则对传入的参数进行转义
$_GET = saddslashes($_GET);
$_POST = saddslashes($_POST);
}

// 货主站点的URL ,其中getsiteurl() 是用来获取当前站点的域名
if(empty($_SC['siteurl'])) $_SC['siteurl'] = getsiteurl();

// 链接数据库
dbconnect();

// 打开缓存文件
foreach (array(’config’, ‘app’, ‘userapp’, ‘ad’) as $value) {
if(!@include_once(S_ROOT.’./data/data_’.$value.’.php’)) {
//
如果缓存文件打开失败重建缓存,function_cache.php 是包含建立缓存的函数文件
include_once(S_ROOT.’./source/function_cache.php’);
$cache_func = $value.’_cache’;
//
调用相应的函数来生成缓存。
$cache_func();
}
}

// 获取COOKIE 前缀的长度,$_SC['cookiepre'] 是在config.php 中定义的COOKIE 函数的前缀名称,$_COOKIE 是存放COOKIE 的数据全局变量数组
$prelength = strlen($_SC['cookiepre']);
foreach($_COOKIE as $key => $val) {
//
判断当前域名下的COOKIE 中属于UCHome 的 COOKIE
if(substr($key, 0, $prelength) == $_SC['cookiepre']) {
// 对COOKIE 值进行转义

$_SCOOKIE[(substr($key, $prelength))] = empty($magic_quote) ? saddslashes($val) : $val;
}
}

// 是否启用GIP 压缩传输,这个是用来提高PHP 传输速度的。
if ($_SC['gzipcompress'] && function_exists(’ob_gzhandler’)) {
ob_start(’ob_gzhandler’);
} else {
ob_start();
}

// 初始化
$_SGLOBAL['supe_uid'] = 0; // 初始化当前用户的 UID
$_SGLOBAL['supe_username'] = ”; // 初始化当前用户的用户名

$_SGLOBAL['inajax'] = empty($_GET['inajax'])?0:intval($_GET['inajax']); // 这个是用来在页面中控制一些弹出框,在模板篇会介绍
$_SGLOBAL['ajaxmenuid'] = empty($_GET['ajaxmenuid'])?”:$_GET['ajaxmenuid'];
$_SGLOBAL['refer'] = empty($_SERVER['HTTP_REFERER'])?”:$_SERVER['HTTP_REFERER']; //
获得上一页的URL ,用来跳转

// 登录注册防灌水机
/*
在登录或者注册的时候看到形如:do.php?ac=750e45d29d276b2f 86f 1445627c
08f

99的链接
后面的750e45d29d276b2f 86f 1445627c08f99就是用下面的来获取的。
*/
if(empty($_SCONFIG['login_action'])) $_SCONFIG['login_action'] = md5(’login’.md5($_SCONFIG['sitekey']));
if(empty($_SCONFIG['register_action'])) $_SCONFIG['register_action'] = md5(’register’.md5($_SCONFIG['sitekey']));

// 整站风格,检查站点模板的路径。此处是default 目录,就是我们常用黄色风格的模板路径
if(empty($_SCONFIG['template'])) {
$_SCONFIG['template'] = ‘default’;
}
//
在首页由下角可以自行选择风格的实现就是通过这段。
if($_SCOOKIE['mytemplate']) {
$_SCOOKIE['mytemplate'] = str_replace(’.',”,trim($_SCOOKIE['mytemplate']));
if(file_exists(S_ROOT.’./template/’.$_SCOOKIE['mytemplate'].’/style.css’)) {
$_SCONFIG['template'] = $_SCOOKIE['mytemplate'];
} else {
ssetcookie(’mytemplate’, ”);
}
}

// 处理REQUEST_URI ,查询(query )的字符串(URL 中第一个问号 ? 之后的内容)。 如为空则为当前页面。
if(!isset($_SERVER['REQUEST_URI'])) {
$_SERVER['REQUEST_URI'] = $_SERVER['PHP_SELF'];
if(isset($_SERVER['QUERY_STRING'])) $_SERVER['REQUEST_URI'] .= ‘?’.$_SERVER['QUERY_STRING'];
}

// 判断用户登录状态
checkauth();

// 用户菜单
getuserapp();

// 处理UC 应用,这个是漫游相关菜单,在此不用解释
$_SGLOBAL['appmenus'] = $_SGLOBAL['appmenu'] = array();
if($_SGLOBAL['app']) {
foreach ($_SGLOBAL['app'] as $value) {
if($value['open']) {
if(empty($_SGLOBAL['appmenu'])) {
$_SGLOBAL['appmenu'] = $value;
} else {
$_SGLOBAL['appmenus'][] = $value;
}
}
}
}

?>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值