【UCHome二次开发】功能修改
有些功能的修改涉及到了流程或数据需求的变动,这时候简单的修改模板文件已经无法解决问题,而是需要修改对应的流程和数据处理代码来完成。一般处理程序文件位于/source文件夹下,具体的定位请参考《【UCHome二次开发】主要文件说明》。具体的代码修改就是根据功能逻辑来调整php代码或是sql语句,这里就不展开了。下面举两个例子说明一下。
1、修改群组列表页面分页的每页显示条数
定位群组数据处理页面为/source/space_mtag.php,找到如下代码:
//分页 $perpage = 20;
修改中间的数据为希望显示的条数即可。
2、修改群组列表页面单个群组提示
默认情况下,群组列表页面每个群组链接下方只提示有多少人参加了群组。如下图:
现在希望没有加入的群组显示 申请加入 链接,且显示已申请人数;已申请未通过的群组给出 已申请,等待审核 提示;已加入的群组按原来的提示,显示已加入的人数。
打印原来的数组数据,发现数据中没有申请中的人数和是否已加入群组的状态信息。于是便需要修改sql语句来获取想要的数据。在/source/space_mtag.php文件中,修改代码
$query = $_SGLOBAL['db']->query("SELECT * FROM ".$tablemtag." WHERE fieldid='$id' ORDER BY membernum DESC LIMIT $start,$perpage");
为
$query = $_SGLOBAL['db']->query("SELECT mtag.*, x.applynum, y.grade FROM ".tname('mtag')." mtag LEFT JOIN ( SELECT count( uid ) AS applynum, tagid FROM `".tname('tagspace')."` WHERE grade = '-2' GROUP BY tagid ) AS x ON x.tagid = mtag.tagid LEFT JOIN ( SELECT * FROM uch_tagspace WHERE uid = ".$_SGLOBAL['session']['uid']." )y ON y.tagid = mtag.tagid WHERE mtag.fieldid = '$id' ORDER BY y.grade DESC, membernum DESC LIMIT $start,$perpage");
通过以上修改,使SQL查询的返回结果增加了各个群组的申请中人数和当前用户在各个群组中的状态。
有了数据,再需要通过修改模板页面来改变显示内容。
找到群组分类的显示模板为space_mtag_field.htm,修改模板中群组列表的显示代码,如下:
<div class="box"> <!--{if $list}--> <ul class="thread_list"> <!--{loop $list $value}--> <li> <div class="threadimg60"><a href="space.php?do=mtag&tagid=$value[tagid]"><img src="$value[pic]" style="width:60px;"></a></div> <a href="space.php?do=mtag&tagid=$value[tagid]">$value[tagname]</a><br /> 已有 <span class="num">$value[membernum]</span> 人加入 </li> <!--{/loop}--> </ul> <div class="page">$multi</div> <!--{else}--> <p>还没有群组。</p> <!--{/if}--> </div>
修改为
<div class="box"> <!--{if $list}--> <ul class="thread_list"> <!--{loop $list $value}--> <li> <div class="threadimg60"><a href="space.php?do=mtag&tagid=$value[tagid]"><img src="$value[pic]" style="width:60px;"></a></div> <a href="space.php?do=mtag&tagid=$value[tagid]">$value[tagname]</a> <!--{if in_array($value[fieldid], $_FD[conf][veri_fieldids])}--> <!--{if ($value[fieldid] == 4 || $value[fieldid] == 5) }--> <!--{if isset($value[grade]) }--> <!--{if $value[grade] == -2}--> <br /><span class="num">已提交申请,正等待审核</span> <!--{else}--> <br />已有 <span class="num">$value[membernum]</span> 人加入 <!--{/if}--> <!--{else}--> <!--{if $value[applynum]}--> <br />已有 <span class="num">$value[applynum]</span> 人申请 <!--{else}--> <br />暂时无人申请 <!--{/if}--> <br /><a href="cp.php?ac=apply&tagid=$value[tagid]">申请加入</a> <!--{/if}--> <!--{/if}--> <!--{else}--> <br />已有 <span class="num">$value[membernum]</span> 人加入 <!--{/if}--> </li> <!--{/loop}--> </ul> <div class="page">$multi</div> <!--{else}--> <p>还没有群组。</p> <!--{/if}--> </div>
修改完成后,效果如下:
3、增加某些分类的群组申请个数限制
由于项目需求,需要限定读书小组限报一个群组,启航计划限报两个群组,需要做群组加入流程的改动。
找到群组申请相关代码,位于/source/space_mtag.php,如下代码块:
elseif($_GET['op'] == 'join') { $tagid = empty($_GET['tagid'])?0:intval($_GET['tagid']); if(submitcheck('joinsubmit')) { $mtag = mtag_join('tagid', $tagid); if(empty($mtag)) { showmessage('mtag_join_error'); } else { showmessage('join_success', "space.php?uid=$_SGLOBAL[supe_uid]&do=mtag&tagid=$mtag[tagid]", 0); } } }
需要插入一段代码来改变处理流程,具体为在加入群组前增加已申请群组个数的检验,修改后代码如下:
elseif($_GET['op'] == 'join') { $tagid = empty($_GET['tagid'])?0:intval($_GET['tagid']); // 获取$fieldid $wheresql = "main.tagid='$tagid'"; $query = $_SGLOBAL['db']->query("SELECT * FROM ".tname('mtag')." main WHERE $wheresql"); if($mtag = $_SGLOBAL['db']->fetch_array($query)) { $fieldid = $mtag['fieldid']; } // 限定读书小组(fieldid=4, num=1)与启航行动(fieldid=5, num=2)的人数 $t_tagspace = tname('tagspace'); $t_mtag = tname('mtag'); $count = $_SGLOBAL['db']->result($_SGLOBAL['db']->query("SELECT count(*) FROM $t_tagspace inner join $t_mtag on $t_tagspace.`tagid` = $t_mtag.`tagid` WHERE $t_tagspace.uid = ".$_SGLOBAL['session']['uid']." and $t_mtag.`fieldid` = $fieldid"),0); if ($fieldid == 4 && $count >= 1){ showmessage('读书小组只能申请或参加 1 个'); } else if ($fieldid == 5 && $count >= 2){ showmessage('启航行动只能申请或参加 2 个'); } if(submitcheck('joinsubmit')) { $mtag = mtag_join('tagid', $tagid); if(empty($mtag)) { showmessage('mtag_join_error'); } else { showmessage('join_success', "space.php?uid=$_SGLOBAL[supe_uid]&do=mtag&tagid=$mtag[tagid]", 0); } } }
4、修改群组分类下的分类名称和显示分类个数
默认安装完后,群组分类中显示的是自由联盟、区域联盟、兴趣联盟,即使我们通过管理系统修改了群组分类的名称,页面上的群组分类页不改变。如下图所示:
通过调试代码发现群组分类的显示内容是写到数据文件里的,对应为/data/data_profield.php文件,文件内容(默认情况)如下:
<?php if(!defined('IN_UCHOME')) exit('Access Denied'); $_SGLOBAL['profield']=Array ( 1 => Array ( 'fieldid' => 1, 'title' => '自由联盟', 'formtype' => 'text', 'inputnum' => 100, 'mtagminnum' => 0, 'manualmoderator' => 0, 'manualmember' => 1 ), 2 => Array ( 'fieldid' => 2, 'title' => '地区联盟', 'formtype' => 'text', 'inputnum' => 100, 'mtagminnum' => 0, 'manualmoderator' => 0, 'manualmember' => 1 ), 3 => Array ( 'fieldid' => 3, 'title' => '兴趣联盟', 'formtype' => 'text', 'inputnum' => 100, 'mtagminnum' => 0, 'manualmoderator' => 0, 'manualmember' => 1 ) ) ?>
直接修改代码即可。改完的效果见前面的图。
以上举了4个列子来说明对UCHome功能进行修改的思路。其他的小改动相信也类似,同理类推。
博主总结的很好,不知道博主现在是否研究过uchome最新版的,也就是2.0的?
[回复]
晴枫 7月 21st, 2011 下午1:04 回复:
@依旧, 没有,好久没做这块的二次开发了
[回复]
请教:如果想为某些用户自动建组(举例:组长账号登陆时自动生成了一个小组群组,组长为群主,群组类别为”志愿者小组“),该如何修改?简单说下需修改哪些文件?哪些函数?
十分感谢!!!
[回复]
晴枫 8月 20th, 2010 下午3:56 回复:
@jializ, 这个不如手动来建组省事;如果实在要搞成自动化的话,建议单独作为一个功能,而不是在原系统上修改,这样运行一遍生成所有组,具体函数自己找吧
[回复]
3、增加某些分类的群组申请个数限
按我对你开发的这个功能的理解,我觉得应该可以利用后台管理中的 “群组栏目”中的“用户可加入群组最多个数”实现,而且我觉得代码“$count = $_SGLOBAL[‘db’]->result($_SGLOBAL[‘db’]->query(“SELECT count(*) FROM $t_tagspace inner join $t_mtag on $t_tagspace.`tagid` = $t_mtag.`tagid` WHERE $t_tagspace.uid =1 and $t_mtag.`fieldid` = $fieldid”),0); ”中的$t_tagspace.uid =1 有点问题,1应该是当前要加入该群组中的用户的uid才对,不知我说得对不对?
不过还想请教$count = $_SGLOBAL[‘db’]->result($_SGLOBAL[‘db’]->query(“SELECT count(*) FROM $t_tagspace inner join $t_mtag on $t_tagspace.`tagid` = $t_mtag.`tagid` WHERE $t_tagspace.uid =1 and $t_mtag.`fieldid` = $fieldid”),0);代码中的最后那个0是有什么作用的,我看了下mysql_result(),但还是不确定它的作用,恳请指点!thanks!
[回复]
晴枫 3月 16th, 2010 下午9:07 回复:
@sen, 我做的是申请个数限制,和加入群组的最多个数可能有差异,实际是否相同忘了有没试过
$t_tagspace.uid =1是有问题,文章中改过来了
result中的0是指sql返回结果中的行序号,可查看source/class_mysql.php中的源码
[回复]
sen 3月 16th, 2010 下午9:54 回复:
我觉得申请人数的限制,用mtag表中的membernum就可以了。result中的0是表示返回结果中的第一行?如果是3则返回第三行的结果?是这样的意思吗?thanks!
[回复]
晴枫 3月 17th, 2010 下午4:27 回复:
@sen, mtag表中的membernum是一个群组下的人数,与一个人申请某类群组个数的限制无关
后问是的
[回复]
sen 3月 18th, 2010 下午12:46 回复:
thanks
[回复]
3、增加某些分类的群组申请个数限
$wheresql = “main.tagid=’$tagid'”;
07 $query = $_SGLOBAL[‘db’]->query(“SELECT * FROM “.tname(‘mtag’).” main WHERE $wheresql”);
兄弟:可以告诉我第一行的main各最后一行的main是怎样回事吗?指用法和作用,谢谢
[回复]
晴枫 3月 15th, 2010 下午7:16 回复:
@sen, 这是SQL的语法,From 表名+空格+别名,那么SQL语句的其他部分用到表名的地方就可以用别名代替,上文中的main即是mtag表的别名
[回复]
sen 3月 15th, 2010 下午8:35 回复:
ok,thanks!抱歉!我比较菜!
[回复]
请教,在群组中增加了官方控制群组和非官方控制群组,(看到UCHOME官方的站长俱乐部的效果),在MTAG数据表中增加了zz_mtag数据字段,zzmtag tinyint(1) NOT NULL default ‘0’,,当设置为官方的时候为1,非官方为0,请教如何修改控制文件,如何编写这个控制和修改代码呢?谢谢
[回复]
晴枫 2月 22nd, 2010 下午10:07 回复:
@walklion, 根据【UCHome二次开发】主要文件说明http://witmax.cn/uchome-file-info.html 6、高级管理页面 /admincp.php的说明找到文件进行管理控制的修改;页面展示的修改根据相应的页面逻辑进行,方法参加上文
[回复]