本帖最后由 otherbank 于 2011-9-13 14:48 编辑
关于地区数据调用,Discuz! X2前台的话在个人信息个人设置里面有,后台的话有地区数据设置,后台操作用户时也有用的到调用地区数据。虽然总的说Discuz! X2的地区数据调用不是很多,但是地区调用是必不可少,是非常重要的。现在分析一下 地区数据的调用方法。
以前台 设置——》个人资料——》基本资料——》出生地(注册地)为例来分析:
概述:一、如图出生地,注册地数据是通过get参数传递读取数据库的资料,然后通过模板显示出来的:大体数据流是 /home.php ——》 /source/module/home/home_spacecp.php ——》 /source/include/spacecp/spacecp_profile.php 将用户个人资料放在变量$htmls中,在模板/template/default/home/spacecp_profile.htm中显示出来的;
二、点击修改就会弹出省市县的列表框,是通过ajax弹出,并选择上一级后,通过ajax自动更新下一级列表框,用到的js方法是showdistrict()通过程序文件/source/include/misc/misc_ajax.php和模板文件/template/default/home/misc_ajax.htm来实现的。
详述:一、(1)有域名home.php?mod=spacecp&ac=profile&op=base知道入口文件是/home.php ,有mod=spacecp知道引用的,模块文件是/source/module/home/home_spacecp.php ,模块文件又引入程序文件/source/include/spacecp/spacecp_profile.php ,
(2)先看模板文件/template/default/home/spacecp_profile.htm的126—146行代码:
- <!--{loop $settings $key $value}-->
- <!--{if $value[available]}-->
- <tr id="tr_$key">
- <th id="th_$key"><!--{if $value[required]}--><span class="rq" title="{lang required}">*</span><!--{/if}-->$value[title]</th>
- <td id="td_$key">
- $htmls[$key]
- </td>
- <td class="p">
- <!--{if $value[showinthread] || $vid}-->
- <input type="hidden" name="privacy[$key]" value="3" />
- <!--{else}-->
- <select name="privacy[$key]">
- <option value="0"{if $privacy[$key] == "0"} selected="selected"{/if}>{lang open_privacy}</option>
- <option value="1"{if $privacy[$key] == "1"} selected="selected"{/if}>{lang friend_privacy}</option>
- <option value="3"{if $privacy[$key] == "3"} selected="selected"{/if}>{lang secrecy}</option>
- </select>
- <!--{/if}-->
- </td>
- </tr>
- <!--{/if}-->
- <!--{/loop}-->
复制代码 $value[title]是每一项资料的名称,$htmls[$key]是每一项资料的已填写结果;
(3)我们再回来看程序文件/source/include/spacecp/spacecp_profile.php ,$value[title]是这样取得的看408--416行代码:
- $htmls = $settings = array();
- foreach($allowitems as $fieldid) {
- if(!in_array($fieldid, array('sightml', 'customstatus', 'timeoffset'))) {
- $html = profile_setting($fieldid, $space, $vid ? false : true);
- if($html) {
- $settings[$fieldid] = $_G['cache']['profilesetting'][$fieldid];
- $htmls[$fieldid] = $html;
- }
- }
- }
复制代码 用了函数profile_setting,这个函数是哪来的呢?上面文件第36行就引入了函数文件
- include_once libfile('function/profile');
复制代码 原函数内容是这样的:在/source/function/function_profile.php文件328—378行,详细可以看代码了解一下,并且在函数中当是地区信息时 输出了ajax函数。
二、(1)ajax的实现,看/source/function/function_profile.php的profile_setting函数当是地区信息时,它输出的一句代码是这样的:
onclick="showdistrict('birthdistrictbox', ['birthprovince', 'birthcity', 'birthdist', 'birthcommunity'], 4); return false;" 这句js方法是调用的static/js/common.js这个文件的js函数,看到1814行到1816行;
- function showdistrict(container, elems, totallevel, changelevel) {
- $F('_showdistrict', arguments);
- }
复制代码 (2)由$F('_showdistrict', arguments);又到了JS文件/static/js/common_extra.js ,_showdistrict这个函数在139-152行,
- function _showdistrict(container, elems, totallevel, changelevel) {
- var getdid = function(elem) {
- var op = elem.options[elem.selectedIndex];
- return op['did'] || op.getAttribute('did') || '0';
- };
- var pid = changelevel >= 1 && elems[0] && $(elems[0]) ? getdid($(elems[0])) : 0;
- var cid = changelevel >= 2 && elems[1] && $(elems[1]) ? getdid($(elems[1])) : 0;
- var did = changelevel >= 3 && elems[2] && $(elems[2]) ? getdid($(elems[2])) : 0;
- var coid = changelevel >= 4 && elems[3] && $(elems[3]) ? getdid($(elems[3])) : 0;
- var url = "home.php?mod=misc&ac=ajax&op=district&container="+container
- +"&province="+elems[0]+"&city="+elems[1]+"&district="+elems[2]+"&community="+elems[3]
- +"&pid="+pid + "&cid="+cid+"&did="+did+"&coid="+coid+'&level='+totallevel+'&handlekey='+container+'&inajax=1'+(isUndefined(changelevel) ? '&showdefault=1' : '');
- ajaxget(url, container, '');
- }
复制代码 ajax到这里才体现出来,ajax的程序文件的url是home.php?mod=misc&ac=ajax&op=district这个;
(3)有入口文件home.php和mod=misc知道模块文件是/source/include/misc/misc_ajax.php,这个文件在250-251行代码:
- include_once libfile('function/profile');
- $html = showdistrict($values, $elems, $container, $showlevel);
复制代码 通过引用函数/source/function/function_profile.php的showdistrict()调用选择的省或市或县或镇级的地区数据;showdistrict()这个函数输出的内容中又有onchange="showdistrict('birthdistrictbox', ['birthprovince', 'birthcity', 'birthdist', 'birthcommunity'], X, X)"这个JS函数 ,然后ajax调用下一级的地区的数据;
(4)并输出在模板template/default/home/misc_ajax.htm中,模板中没有任何html代码,就函数的输出内容:模板的48-50行代码是这样写的:
- <!--{elseif $op == 'district'}-->
- $html
- <!--{/if}-->
复制代码
最后ajax调用的数据显示在/template/default/home/spacecp_profile.htm这个模板页中。
补充:为了实际应用,补充篇帖子《Discuz! X2 地区数据 调用实例》;URL地址: https://discuz.dismall.com/thread-2370241-1-1.html
|