1、UCHOME 二次开发参考文档书摘要:写在前边,由于看不惯网上卖资料的,用自己的百度辛苦币买到的东西然后根据手头上有的资料做了一个稍微系统的整理,希望大家有自己开发经验的,我会持续更新的,永久免费,好好学习,多多益善,同时感谢做过开发的【枫芸志】其中有些资料版本是 1.5 的,在这一版本中给予改正。版面约定:1. 上下 2.54cm ;左右 1.91cm2. 文字:宋体五号,代码注释小五 courier new 代码为蓝色 ,注释为淡黄色当前版本 v0.2V0.2 :2010-7-1更改布局,可以容纳更多信息,部分注释可以不用换行增加文件调用及功能介绍增加文本约定格式修改模板页面说明为 2.0
2、,但资料有待于完善目录【UCHome 二次开发】uchome 文件体系介绍 .4站点结构图 .4UCHOME 安装后的主要目录与文件介绍 .4文件入口参数列表及详细介绍 .5数据调用图示 .8do.php 入口文件分析 .8【UCHome 二次开发】基础 .10数据调用 .10eval 的使用 .10直接外部文件 do.php 的扩展 11【UCHome 二次开发】common.php 文件解析 .12common.php 文件解析: .12Common.php 文件调用图示: 15【UCHome 二次开发】数据字典 |数据库结构 15【UCHome 二次开发】模板解析 .16【UCHome
3、二次开发】缓存机制解析 .18【UCHome 二次开发】模板语法说明 .21【UCHome 二次开发】模板页面说明 .23【UCHome 二次开发】主要文件说明 .26【UCHome 二次开发】模板修改 .29【UCHome 二次开发】功能修改 .29【UCHome 二次开发】全局变量 .34$_SC:系统全局配置 34$_SCONFIG:个人空间配置 35$_SCOOKIE:Cookie 信息 .39$_COOKIE: Cookie 信息 .39$_SGLOBAL:各类全局信息 .39$_SN:昵称信息 56$_TPL:未知 56$_SBLOCK:未知 .56举例说明: .56【UCHome
4、 二次开发】与 UCenter 的交互解析 .58【UCHome 二次开发】研究 uchome 通用方法 59【UCHome 插件二次开发】 不同于 Manyou 的开发模式 .65基本原则 .66【UCHome 应用】增加 sns 人气的客服秘籍 68【UCHome 二次开发 】uchome 文件体系介绍站点结构图UCHOME 安装后的主要目录与文件介绍目录 文件介绍admin/ 管理后台api/ API 函数插件开发与模板等的修改不需要动此文件attachment/ 附件目录data/ 缓存目录,此目录要有 777 权限,系统相关缓存基本上都在这里了data/tpl_cache/ 模板缓存
5、目录,注意,如果你的 UCH 白屏了,无法进入后台跟新缓存,通过FTP 手工删除此目录下的所有文件即可相当于模板缓存的更新image/ 图片目录language/ 语言目录 ,跳转提示语言等source/ PHP 源程序目录,类文件,分步处理文件template/ 模板目录theme/ 个人主页目录uc_client/ucenter 客户端 插件开发与模板等的修改不需要动此文件Install/ 安装时用到,安装完毕建议删除common.php 通用文件,所有的文件都要包含这个文件config.php 基本配置文件 定义了$_SC 数组和 ucenter 通讯的常量editor.php 编辑器的
6、入口文件,强烈建议您不用动他network.php 随便看看等入口文件 调用 source 文件夹下的 network.php 文件文件入口参数列表及详细介绍文件入口 文件详细动作admincp.php?ac=*后台管理入口文件调用 admin 文件夹下的 php 文件 admincp_ad.php 广告设置 admincp_album.php 相册 admincp_app.php UCenter 应用 admincp_backup.php 数据备份 admincp_block.php 数据调用 admincp_blog.php 日志 admincp_cache.php 缓存更新 adminc
7、p_censor.php 词语屏蔽 admincp_click.php 表态动作 admincp_comment.php 评论/留言 admincp_config.php 站点设置 admincp_credit.php 积分规则 admincp_cron.php 系统计划任务 admincp_doing.php 记录 admincp_event.php 活动 admincp_eventclass.php 活动分类 admincp_feed.php 动态(feed) admincp_hotuser.php 推荐成员设置 默认好友设置 admincp_index.php 管理首页 admincp_
8、ip.php 访问 IP 设置 admincp_log.php 系统 log 记录 admincp_magic.php 道具设置 admincp_magiclog.php 道具记录 admincp_mtag.php 群组 admincp_network.php 随便看看 admincp_pic.php 图片 admincp_poll.php 投票 admincp_post.php 回帖 admincp_privacy.php 隐私设置 admincp_profield.php 群组栏目 admincp_profilefield.php 用户栏目 admincp_report.php 举报 ad
9、mincp_share.php 分享 admincp_space.php 用户管理 admincp_spam.php 防灌水设置 admincp_stat.php 统计更新 admincp_tag.php 标签 admincp_task.php 有奖任务 admincp_thread.php 话题 admincp_userapp.php MYOP 应用 admincp_usergroup.php 用户组cp.php?ac=*编辑日志、相册、活动等等相关编辑操作基本上都从这个文件入口调用 source 文件夹下的操作文件 cp_advance.php 高级管理 cp_album.php 相册管理
10、 cp_avatar.php 我的头像 cp_blog.php 日志管理 包含日志的编辑删除等信息 cp_class.php 日志分类管理 cp_click.php 表态动作的处理 cp_comment.php 评论的操作 cp_common.php 举报违规,在好友的面板上,还有屏蔽通知 cp_credit.php 我的积分 cp_doing.php 删除记录,回复 spacenote cp_domain.php cp_event.php 事件管理,活动管理 cp_feed.php cp_friend.php 好友管理 cp_import.php 日志导入 cp_invite.php 邀请好
11、友 cp_magic.php 道具的赠送购买 cp_mtag.php 群组 cp_password.php 修改密码 cp_pm.php 短消息操作 cp_poke.php 打招呼 cp_poll.php 投票 cp_privacy.php 隐私筛选 cp_profile.php 个人资料 cp_relatekw.php cp_sendmail.php 发送邮件 cp_share.php 分享 cp_space.php 应用隐藏 cp_task.php 任务 cp_theme.php 个性化设置 cp_thread.php 群组处理 cp_top.php cp_topic.php cp_upl
12、oad.php cp_userapp.php cp_videophoto.phpdo.php?ac=*登录、注册、找回密码、相册批量上传、在需要密码的情况下才能查看日志相册、验证码、发送邮件、统计、邮件验证等行为的入口文件调用 source 文件夹下的操作文件 do_ajax.php do_emailcheck.php do_inputpwd.php do_login.php 登陆 do_lostpasswd.php 找回密码 do_register.php 注册 do_seccode.php do_sendmail.php do_stat.php do_swfupload.phpmagic.
13、php?mid=*道具入口文件调用 source 文件夹下的操作文件 magic_anonymous.php magic_attachsize.php magic_bgimage.php magic_call.php magic_color.php magic_detector.php magic_doodle.php magic_downdateline.php magic_flicker.php magic_frame.php magic_friendnum.php magic_gift.php magic_hot.php magic_icon.php magic_invisible.ph
14、p magic_reveal.php magic_superstar.php magic_thunder.php magic_updateline.php magic_viewmagic.php magic_viewmagiclog.php magic_viewvisitor.php magic_visit.phpspace.php?do=*个人空间、日志、相册、活动等入口文件调用 source 文件夹下的相关文件 space_album.php space_blog.php space_doing.php space_event.php space_feed.php space_friend
15、.php space_index.php space_info.php space_mood.php space_mtag.php space_notice.php space_pm.php space_poll.php space_share.php space_tag.php space_thread.php space_top.php space_topic.php space_videophoto.php space_wall.php数据调用图示我们一般修改 UCH 主要涉及的入口文件有 space.php network.php do.php cp.php 这四个,那么我们如何根据你
16、访问的 URL 判断涉及到那些 PHP 文件和模板文件,方便您的进一步修改!do.php 入口文件分析举个例子,如果我们使用找回密码功能,通常链接如下:do.php?ac=lostpasswd,而注册的链接一般分两种,一种是 do.php?ac=后台自定义登录识别名另一种是 do.php?ac=随机好了,我们进入 do.php 文件中继续看看:/这个是公用文件,在上篇已详细解释了内容include_once(./common.php); /获取方法 获取 do.php?ac 中 ac 的值$ac = empty($_GETac)?”:$_GETac; /自定义登录if($ac = $_SCON
17、FIGlogin_action) /这里的全局变量$_SCONFIGlogin_action就是 ac=自定义标示名或那个随机串,如果相同则把原来的do.php?ac=XXXX 抓换成类似效果 do.php?ac=login$ac = login; elseif($ac = login) ac = ;if($ac = $_SCONFIGregister_action) /这里的全局变量$_SCONFIGregister_action/就是 ac=就是后面的自定义标示名或那个随机串,如果相同则把原来的 do.php?ac=XXXX 抓换成类似效果do.php?ac=register$ac = r
18、egister; 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, sendma
19、il, 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.ph
20、p);不知道大家是否能理解,不理解多看几遍!好了,我们找到 source/do_lostpasswd.php 文件看下,这个文件代码较多,我们不用管他,最主要的是我们要找到其对应的模板,查找下 include template 这个语句【注:在其他 php 文件中可能有多个结果,那是因为不同条件下包含不同的模板】。你就会发现在末尾找到include template(do_lostpasswd);这就是模板名,这个记住规则,do_lostpasswd 对应的模板是 do_lostpasswd.htm 名。那么这个文件在哪个位置呢?我们系统目录 template/下有 默认的 default,b
21、lue,green 这三个文件夹,对应不同的风格,如果你安装了其他风格,可能还有其他目录。系统是如何查找 do_lostpasswd.htm 呢?大家记得在后台有一个模板选择的下拉表吗?系统会在你选择的模板风格文件夹下查找do_lostpasswd.htm,如果找不到则在去 default 目录下查找。注意: 为了提供效率,模板并不是每次都编译的,严格的来说,UCHOME 会先判断对应的模板是否被解析过了【查找 data/tpl_cache/目录下是否有对应的模板缓存】如果没有的话才会去按上面的规则去查找。基本上,按照以上思路就可以根据链接找到匹配的程序文件和模板文件了【UCHome 二次开发
22、 】基础本文将就 UCH 二次开发这个核心主题,以各种实现的代码为主,辅助部分说明概略的讲解如何针对 UCH 进行二次开发。过段时间 UCH 就开源了,准备到时候再详细的写篇 UCH 机制分析。顺便说下,这篇文件写在大约两周以前,但是一直没有时间整理发布,今天听说 UCH 会在最近一段时间开源,到时候再发反而对大家帮助不大,所以决定不再整理,虽然文中一些说明还不详细,但是已经基本成文。数据调用这里的数据调用是使用 UCenter Home 内置的数据调用,在后台的“高级应用”里有“ 数据调用”管理,以下代码都是在模板中添加,然后调用数据。1.站内数据调用2.站外 JS 调用block 的使用这
23、个 block 数据调用和前面的讲的数据调用,从数据来源和生成来说是基本类似的。$valuesubjecteval 的使用合理的使用 Ucenter Home 模板语法中的 eval 语法,会在一定程序上降低二次开发的难度。比如:1.通过 eval 语法在模板内执行 PHP 语句最新日志演示 ;2.通过 eval 语法引入一个外部 PHP 文件引入外部文件备注:通过在模板中引入外部文件,你可做任何你想做的事情。直接外部文件 do.php 的扩展1.首先,在 do.php 文件中添加允许的新方法,即在$acs = array(login, comment, wall, register, los
24、tpasswd, swfupload, inputpwd,sns, viewspace, relatekw, ajax, seccode);之后添加$acs = demo;2.然后,在 source 目录下新建 do_demo.php 文件,调用地址就是 do.php?ac=demo。比如/source/cron 这个目录下以及 source/class_mysql.php 文件都是开源的,我们可以从中找出,对UCH 进行二次开发非常有用的一些信息,比如如何进行 SQL 查询,通过分析,我们可以写出以下文件。query(SELECT * FROM .tname(blog). ORDER BY
25、dateline DESC LIMIT 10);$bloglist = array();while ($value = $_SGLOBALdb-fetch_array($query) $bloglist = $value;include template(do_demo);?模板文件 templates/default/do_demo.htm 内容为$valuesubject$valueusername$valueviewnum 次阅读|$valuereplynum 个评论没有评论总结当前的 UCH 是在模板界面完全可修改,合理利用上述数据调用机制的情况下,鲜有我们不能实现的页面效果和数据调用
26、要求。【UCHome 二次开发 】common.php 文件解析使用 UCHome 插件的用户越来越多,但所有的站都使用同样的同样的程序,没有自己的特色是很难推广开的。同时不同的站需要不同的功能,同时同一个站在不同的时期也有不同的功能需求,鉴于此,本人通过多款插件的开发经验,对 UCHome 程序也有了一定的认识。common.php 文件解析:$val) /判断当前域名下的 COOKIE 中属于 UCHome 的 COOKIEif(substr($key, 0, $prelength) = $_SCcookiepre) /对 COOKIE 值进行转义$_SCOOKIE(substr($key
27、, $prelength) = empty($magic_quote) ? saddslashes($val) : $val;/是否启用 GIP 压缩传输,这个是用来提高 PHP 传输速度的。if ($_SCgzipcompress else ob_start();/初始化$_SGLOBALsupe_uid = 0; /初始化当前用户的 UID$_SGLOBALsupe_username = ”; /初始化当前用户的用户名/这个是用来在页面中控制一些弹出框,在模板篇会介绍$_SGLOBALinajax = empty($_GETinajax)?0:intval($_GETinajax); $_
28、SGLOBALajaxmenuid = empty($_GETajaxmenuid)?”:$_GETajaxmenuid;/获得上一页的 URL,用来跳转$_SGLOBALrefer = empty($_SERVERHTTP_REFERER)?”:$_SERVERHTTP_REFERER; /登录注册防灌水机/*在登录或者注册的时候看到形如:do.php?ac=750e45d29d276b2f86f1445627c08f99 的链接后面的750e45d29d276b2f86f1445627c08f99 就是用下面的来获取的。*/if(empty($_SCONFIGlogin_action) $
29、_SCONFIGlogin_action = md5(login.md5($_SCONFIGsitekey);if(empty($_SCONFIGregister_action) $_SCONFIGregister_action = md5(register.md5($_SCONFIGsitekey);/整站风格,检查站点模板的路径。此处是 default 目录,就是我们常用黄色风格的模板路径if(empty($_SCONFIGtemplate) $_SCONFIGtemplate = default;/在首页由下角可以自行选择风格的实现就是通过这段。if($_SCOOKIEmytemplat
30、e) $_SCOOKIEmytemplate = str_replace(.,”,trim($_SCOOKIEmytemplate);if(file_exists(S_ROOT./template/.$_SCOOKIEmytemplate./style.css) $_SCONFIGtemplate = $_SCOOKIEmytemplate; else ssetcookie(mytemplate, ”);/处理 REQUEST_URI,查询(query)的字符串(URL 中第一个问号 ? 之后的内容) 。 如为空则为当前页面。if(!isset($_SERVERREQUEST_URI) $_S
31、ERVERREQUEST_URI = $_SERVERPHP_SELF;if(isset($_SERVERQUERY_STRING) $_SERVERREQUEST_URI .= ?.$_SERVERQUERY_STRING;/判断用户登录状态checkauth();/用户菜单getuserapp();/处理 UC 应用,这个是漫游相关菜单,在此不用解释$_SGLOBALappmenus = $_SGLOBALappmenu = array();if($_SGLOBALapp) foreach ($_SGLOBALapp as $value) if($valueopen) if(empty($
32、_SGLOBALappmenu) $_SGLOBALappmenu = $value; else $_SGLOBALappmenus = $value;?Common.php 文件调用图示:【UCHome 二次开发 】数据字典| 数据库结构数据字典即数据库中的表和字段的说明。找了好久才找到的,共享一下。此版本的 UCHome 数据字典是基于 UCenter Home 2.0beta,最后修订日期为 2009.08.08。uchome 2.0 数据字典数据字典形式为 word 文档,点击 UCHome 2.0 数据字典下载。【UCHome 二次开发 】模板解析UCHome 模板文件位于/temp
33、late 文件夹下,每个模板文件单独一个文件夹,默认模板文件夹为default。1、模板的使用配置在根目录下的 config.php 中进行配$_SCtemplate = default; /选择模板目录2、模板的处理程序中使用到模板文件时,先去模板缓存目录/data/tpl_cache/下查找是否存储模板缓存文件。模板缓存文件命名合适为“template_模板目录名_模板文件名.php”。如存在则直接使用该缓存的模板文件;如不存在,则先解析对应的模板文件,生成模板缓存文件再进行使用。3、模板的解析模板解析是调用/source 目录下的 function_template.php 文件中的 p
34、arse_template 函数来实现的。解析过程并不复杂,主要是读取模板文件(.htm),用正则表达式替换标记为对应的 PHP 代码,最终生成一个标准的 PHP 文件,保存到模板缓存目录/data/tpl_cache/供后续使用。具体的模板解析过程不做说明,直接查看代码即可。置,确定系统使用的模板,如下:function parse_template($tpl) global $_SGLOBAL;/包含模板$_SGLOBALsub_tpls = array($tpl);$tplfile = S_ROOT./.$tpl.htm;$objfile = S_ROOT./data/tpl_cache
35、/.str_replace(/,_,$tpl).php;/read$template = sreadfile($tplfile);if(empty($template) exit(“Template file : $tplfile Not found or have no access!“);/模板$template = preg_replace(“/ie“, “readtemplate(1)“, $template);/处理子页面中的代码$template = preg_replace(“/ie“, “readtemplate(1)“, $template);/解析模块调用$template
36、 = preg_replace(“/ie“, “blocktags(1)“, $template);/解析广告$template = preg_replace(“/ie“, “adtags(1)“, $template);/时间处理$template = preg_replace(“/ie“, “datetags(1)“, $template);/头像处理$template = preg_replace(“/ie“, “avatartags(1)“, $template);/PHP 代码$template = preg_replace(“/ies“, “evaltags(1)“, $templ
37、ate);/开始处理/变量$var_regexp = “($a-zA-Z_x7f-xffa-zA-Z0-9_x7f-xff*)(a-zA-Z0-9_-.“$x7f-xff+)*)“;$template = preg_replace(“/s“, “1“, $template);$template = preg_replace(“/(nr+)t+/s“, “1“, $template);$template = preg_replace(“/($a-zA-Z0-9_“$x7f-xff+).(a-zA-Z_x7f-xffa-zA-Z0-9_x7f-xff*)/s“, “12“, $template);
38、$template = preg_replace(“/($a-zA-Z0-9_“$.x7f-xff+)/s“, “, $template);$template = preg_replace(“/$var_regexp/es“, “addquote()“, $template);$template = preg_replace(“/?/es“, “addquote()“, $template);/逻辑$template = preg_replace(“/elseifs+(.+?)/ies“, “stripvtags(,)“, $template);$template = preg_replace
39、(“/else/is“, “, $template);/循环for($i = 0; $i ,3)“, $template);$template = preg_replace(“/loops+(S+)s+(S+)s+(S+)(.+?)/loop/ies“, “stripvtags( 3) ?,4)“, $template);$template = preg_replace(“/ifs+(.+?)(.+?)/if/ies“, “stripvtags(,2)“, $template);/常量$template = preg_replace(“/(a-zA-Z_x7f-xffa-zA-Z0-9_x7f
40、-xff*)/s“, “, $template);/替换if(!empty($_SGLOBALblock_search) $template = str_replace($_SGLOBALblock_search, $_SGLOBALblock_replace, $template);/换行$template = preg_replace(“/ ?nr*$template“;/writeif(!swritefile($objfile, $template) exit(“File: $objfile can not be write!“);【UCHome 二次开发 】缓存机制解析UCHome 中
41、的常用数据皆通过调用缓存来实现读取,包括系统配置、用户组、群组栏目、用户栏目、词语屏蔽、积分规则、广告、用户向导任务、模块、MYOP 默认应用等信息。其中模板缓存的使用前面单独介绍过,见【UCHome 二次开发】模板解析。UCHome 中常用数据是作为全局变量来使用的,具体用法可参考【UCHome 二次开发】全局变量。以下着重介绍缓存机制的具体实现。1、缓存数据文件的生成UCHome 生成的缓存数据文件位于/data/目录下。缓存生成的相关函数位于/source/function_cache.php 文件中,生成缓存的函数罗列如下: config_cache() 更新配置信息缓存,生成缓存文件
42、 data_config.php usergroup_cache() 更新用户组缓存,生成缓存文件 data_usergroup.php profilefield_cache() 更新用户栏目缓存,生成缓存文件 data_profilefield.php profield_cache() 更新群组栏目缓存,生成缓存文件 data_profield.php censor_cache() 更新词语屏蔽缓存,生成缓存文件 data_censor.php creditrule_cache() 更新积分规则,生成缓存文件 data_creditrule.php ad_cache() 更新广告缓存,生成缓
43、存文件 data_ad.php task_cache() 更新用户向导任务,生成缓存文件 data_task.php block_cache() 更新模块,生成缓存文件 data_block.php tpl_cache() 更新模板缓存,清空模板缓存文件夹 /data/tpl_cache/下所有文件使模板缓存重新生成 block_data_cache() 更新模块缓存,清空模板缓存数据使缓存重新生成 userapp_cache() 更新 MYOP 默认应用,生成缓存文件 data_userapp.php app_cache() 更新应用名,生成缓存文件 data_app.php 除了模板和模块
44、数据外,其他的只需调用对应的函数就可生成对应的缓存数据文件。具体缓存生成的数据格式可查看对应文件。2、缓存数据文件的分析我们来看一下其中一个缓存文件,群组栏目缓存 data_profield.php 文件,如下:Array(fieldid = 1,title = 班级,formtype = multi,inputnum = 100,mtagminnum = 0,manualmoderator = 1,manualmember = 1)2 =Array(fieldid = 2,title = 实践活动,formtype = text,inputnum = 100,mtagminnum = 0,m
45、anualmoderator = 1,manualmember = 1)?第二行代码保证了缓冲数据无法被直接调用,而要求在 UCHome 中才有效。当然这是君子协定,只要在调用代码前define 一下 IN_UCHOME 即可绕过验证。之后的代码其实只是做了变量赋值,将群组栏目数据赋值到$_SGLOBALprofield中,因为之前$_SGLOBAL 以被定义为 global 全局变量,因为群组栏目数据便能全局访问了。3、缓存数据文件的使用从上面分析可看出,缓存数据文件其实就是 php 代码文件,直接引入执行。因而我们的缓存使用也就很方便了,只需将缓存文件使用 include/include_once/require/require_once 等函数引入进来即可使用,调用对应的变量来获取缓存的数据。但为了保证缓存的存在,使用时最好加一个检测;如果缓存数据不存在,则先生成一遍缓存数据。综合起来,缓存的代码参考如下:if(!include_once(S_ROOT./data/data_usergroup.php) include_once(S_ROOT./source