Discuz开发 Discuz! X3.2 地区数据 调用分析

[复制链接]
建站高手 发表于 2016-11-23 12:02:22 [Discuz开发] 显示全部楼层 |阅读模式 上一主题 下一主题

马上注册,一起探讨正确快速的建站方法

您需要 登录 才可以下载或查看,没有帐号?快速注册

x
关于discuz! X3.2地区数据调用,前台的话在个人信息个人设置里面有,后台的话有地区数据设置,后台操作用户时也有用的到调用地区数据。虽然总的说Discuz!的地区数据调用不是很多,但是地区调用是必不可少,是非常重要的。现在分析一下 地区数据的调用方法。
以前台 设置——》个人资料——》基本资料——》出生地(注册地)为例来分析:
13.jpg

概述:一、如图出生地,注册地数据是通过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行代码:
  1. <!--{loop $settings $key $value}-->
  2. <!--{if $value[available]}-->
  3. <tr id="tr_$key">
  4. <th id="th_$key"><!--{if $value[required]}--><span class="rq" title="{lang required}">*</span><!--{/if}-->$value[title]</th>
  5. <td id="td_$key">
  6. $htmls[$key]
  7. </td>
  8. <td class="p">
  9. <!--{if $value[showinthread] || $vid}-->
  10. <input type="hidden" name="privacy[$key]" value="3" />
  11. <!--{else}-->
  12. <select name="privacy[$key]">
  13. <option value="0"{if $privacy[$key] == "0"} selected="selected"{/if}>{lang open_privacy}</option>
  14. <option value="1"{if $privacy[$key] == "1"} selected="selected"{/if}>{lang friend_privacy}</option>
  15. <option value="3"{if $privacy[$key] == "3"} selected="selected"{/if}>{lang secrecy}</option>
  16. </select>
  17. <!--{/if}-->
  18. </td>
  19. </tr>
  20. <!--{/if}-->
  21. <!--{/loop}-->
复制代码


$value[title]是每一项资料的名称,$htmls[$key]是每一项资料的已填写结果;
(3)我们再回来看程序文件/source/include/spacecp/spacecp_profile.php ,$value[title]是这样取得的看408--416行代码:
  1. $htmls = $settings = array();
  2. foreach($allowitems as $fieldid) {
  3. if(!in_array($fieldid, array('sightml', 'customstatus', 'timeoffset'))) {
  4. $html = profile_setting($fieldid, $space, $vid ? false : true);
  5. if($html) {
  6. $settings[$fieldid] = $_G['cache']['profilesetting'][$fieldid];
  7. $htmls[$fieldid] = $html;
  8. }
  9. }
  10. }
复制代码


用了函数profile_setting,这个函数是哪来的呢?上面文件第36行就引入了函数文件
  1. 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行;
  1. function showdistrict(container, elems, totallevel, changelevel) {
  2. $F('_showdistrict', arguments);
  3. }
复制代码


(2)由$F('_showdistrict', arguments);又到了JS文件/static/js/common_extra.js ,_showdistrict这个函数在139-152行,
  1. function _showdistrict(container, elems, totallevel, changelevel) {
  2. var getdid = function(elem) {
  3. var op = elem.options[elem.selectedIndex];
  4. return op['did'] || op.getAttribute('did') || '0';
  5. };
  6. var pid = changelevel >= 1 && elems[0] && $(elems[0]) ? getdid($(elems[0])) : 0;
  7. var cid = changelevel >= 2 && elems[1] && $(elems[1]) ? getdid($(elems[1])) : 0;
  8. var did = changelevel >= 3 && elems[2] && $(elems[2]) ? getdid($(elems[2])) : 0;
  9. var coid = changelevel >= 4 && elems[3] && $(elems[3]) ? getdid($(elems[3])) : 0;
  10. var url = "home.php?mod=misc&ac=ajax&op=district&container="+container
  11. +"&province="+elems[0]+"&city="+elems[1]+"&district="+elems[2]+"&community="+elems[3]
  12. +"&pid="+pid + "&cid="+cid+"&did="+did+"&coid="+coid+'&level='+totallevel+'&handlekey='+container+'&inajax=1'+(isUndefined(changelevel) ? '&showdefault=1' : '');
  13. ajaxget(url, container, '');
  14. }
复制代码


ajax到这里才体现出来,ajax的程序文件的url是home.php?mod=misc&ac=ajax&op=district这个;
(3)有入口文件home.php和mod=misc知道模块文件是/source/include/misc/misc_ajax.php,这个文件在250-251行代码:
  1. include_once libfile('function/profile');
  2. $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行代码是这样写的:
  1. <!--{elseif $op == 'district'}-->
  2. $html
  3. <!--{/if}-->
复制代码


最后ajax调用的数据显示在/template/default/home/spacecp_profile.htm这个模板页中。

补充:为了实际应用,补充篇《Discuz! 地区数据 调用实例




上一篇:Discuz!X3.2游客看小图功能导致图片后文字内容不显示的解决方法
下一篇:Discuz 地区数据 调用实例
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

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