设为首页收藏本站

PHPIN.NET

 找回密码
 立即注册
查看: 3593|回复: 2

[7.X版] 帝国CMS无限联动插件V2.0{全新内核 更多自由}

[复制链接]

374

主题

381

帖子

2558

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2558
发表于 2014-11-14 11:14:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

x
帝国CMS无限联动插件V2.0{全新内核 更多自由}
本文关键字词:帝国cms联动,帝国cms联动插件,帝国cms结合项联动,多级联动本插件理论上支持帝国cms任何版本。本插件在帝国CMS7.0正式版{UTF-8}下制作完成,GBK自行转换文件代码,理论上通用。

使用过程中有发现BUG或者错误以及意见建议的请跟帖说明。我们会即时跟进。

本插件可用于{自定义}的地区省市,甚至全球城市,也可应用于其他对应联动。预留接口很丰富,请自行扩展发挥。默认提供全国省市数据。仅供参考
多级联动,支持Ajax动态获取数据并缓存数据,动态生成下级select菜单,设置动态生成"option"第一个条目作为提示项,自动选择唯一选项的菜单,设置回调函数在onChange事件触发时获取下拉菜单相关信息。


2015/04/10 10:00 //更新 缓存中增加子集合集,这样更利于其他复杂操作

更新方法 action.php中的函数 Shengcheng 替换为以下代码:

  1. //生成php缓存文件
  2. function Shengcheng($id){
  3.      global $empire,$dbtbpre;
  4.      $rfsql="select * from {$dbtbpre}extend_linkage where id='$id' and type=0 and parentid=0";
  5.     $rf=mysql_fetch_array($empire->query($rfsql),MYSQL_ASSOC);//查找父分类
  6.     $linkage[$rf['id']]=$rf;
  7.         $query_rf="select id from {$dbtbpre}extend_linkage where parentid='$rf[id]'";
  8.                 $sql_rf=$empire->query($query_rf);
  9.                 while($r_rf=mysql_fetch_array($sql_rf,MYSQL_ASSOC)){
  10.                         $linkage[$rf['id']]['zfl'].=$r_rf['id'].',';
  11.                 }
  12.                 $linkage[$rf['id']]['zfl']=substr($linkage[$rf['id']]['zfl'],0,-1);
  13.     if(!$rf){
  14.          printerror2("只能针对顶级ID生成缓存",'',9);
  15.     }
  16.     $query="select * from {$dbtbpre}extend_linkage where type='$id'";
  17.     $sql=$empire->query($query);
  18.     while($r=mysql_fetch_array($sql,MYSQL_ASSOC)){
  19.         $query_zfl="select id from {$dbtbpre}extend_linkage where parentid='$r[id]'";
  20.                 $sql_zfl=$empire->query($query_zfl);
  21.                 while($r_zfl=mysql_fetch_array($sql_zfl,MYSQL_ASSOC)){
  22.                         $r['zfl'].=$r_zfl['id'].',';
  23.                 }
  24.                 $r['zfl']=substr($r['zfl'],0,-1);
  25.         $linkage[$r['id']]=$r;
  26.     }
  27.     $filename=ECMS_PATH.'e/extend/yl_linkage/data/linkage_cache_'.$rf['id'].'.php';//缓存文件路径
  28.     $str='<?'.PHP_EOL;
  29.     $str.='$linkage_'.$rf['id'].'=';
  30.     $str.=var_export($linkage,TRUE);
  31.     $str.=PHP_EOL.'?>';
  32.     file_put_contents($filename,$str );
  33.      if(file_put_contents($filename,$str )){
  34.         printerror2("缓存生成成功!",'',9);
  35.     }
  36. }
复制代码

2015/04/14 一处笔误造成菜单名称无法修改:修复方法linkage.php中搜索Editlinkage修改为]Editmore即可
2015/05/18 修复信息有空格 列表不显示的小BUG



使用方法:第一步、下载插件解压到/e/extend/yl_linkage/目录下。
第二步、执行需要的SQL代码,后台自己增加插件连接/e/extend/yl_linkage/(不会的自行脑补帝国基础知识)数据库包含:
1、空数据库
2、全国省市数据
3、全国省市县数据


第三步、增加Userfun.php自定义函数处理代码(这里的代码只是前台使用)。
更多详情请自行研究使用发挥拓展。
本插件仅作抛砖引玉之功能。

效果截图:
1.png
2.png
3.png
4.png
5.png
6.png
7.png
8.png
9.png
10.png

Userfun.php代码(部分案例代码,更多的请自行扩展):

  1. /*********************无限联动插件部分实例***************************/
  2. /*   ID,类型,生成的联动菜单顶级ID,fun数据处理函数可以自己扩展,避免冲突函数前缀是user_linkage_
  3. *   下面只是简单例子,增加不同数据获取方式 可以自定义$fun,然后写个函数处理。
  4. *   $data是缓存文件的数组,如果确定生成联动菜单缓存,可以在模版中直接引入使用。
  5. *   $other自定义传入内容。
  6. *   <?
  7.         $aa=user_linkage(2);
  8.         echo $aa[name];
  9. *   ?>
  10. * <?=user_linkage(2,0,'zcd','<li>{name}</li>')?>
  11. * <?=user_linkage(9,0,'path',3);?>
  12. */
  13. function user_linkage($id,$type=0,$fun='dq',$other=''){
  14. global $empire,$dbtbpre;
  15. $id=(int)$id;
  16. $type=(int)$type;
  17. $data=(int)$data;
  18. $fun='user_linkage_'.$fun;
  19. if(!$type){//获取联动类型
  20. $r=$empire->fetch1("select id,type from {$dbtbpre}extend_linkage where id='$id'");
  21. if(!$r){
  22. return FALSE;
  23. }else{
  24. $type=$r['type']?$r['type']:$r['id'];
  25. }
  26. }
  27. $filename=ECMS_PATH.'e/extend/yl_linkage/data/linkage_cache_'.$type.'.php';
  28. if(file_exists($filename)){
  29. include "$filename";
  30. $a='linkage_'.$type;
  31. $data=${$a};
  32. }
  33. if(function_exists($fun)){
  34. return $fun($id,$data,$other);//执行数据处理函数
  35. }else{
  36. return FALSE;
  37. }
  38. }
  39. //联动使用示例1:获取传入ID所有数据包含扩展字段
  40. function user_linkage_dq($id,$data='',$template){
  41. global $empire,$dbtbpre;
  42. if(is_array($data)){//从缓存获取
  43. $r=$data[$id];
  44. }else{//从数据库获取
  45. $r=$empire->fetch1("select * from {$dbtbpre}extend_linkage where id='$id'");
  46. }
  47. return $r;
  48. }
  49. //联动使用示例2:传入模版输出子菜单例子
  50. function user_linkage_zcd($id,$data='',$template='<li>{name}</li>'){
  51. global $empire,$dbtbpre;
  52. if(is_array($data)){//从缓存获取
  53. foreach($data as $val){
  54. if($val[parentid]==$id){
  55. $r.=str_replace('{name}', $val[name], $template);
  56. }
  57. }
  58. }else{//从数据库获取
  59. $query="select name from {$dbtbpre}extend_linkage where parentid='$id'";
  60. $sql=$empire->query($query);
  61. while($zcd=$empire->fetch($sql)){
  62. $r.=str_replace('{name}', $zcd[name], $template);
  63. }
  64. }
  65. return $r;
  66. }
  67. //联动使用示例3:向上输出所有路径$jibie是最高99级别
  68. function user_linkage_path($id,$data='',$jibie=99){
  69. global $empire,$dbtbpre;
  70. if(is_array($data)){//从缓存获取
  71. $arr=explode(',', $data[$id][path]);
  72. $num=count($arr)-2;
  73. foreach ($arr as $key=>$val){
  74. if($val && $key>$num-$jibie){
  75. $r.=$data[$val][name].'-';
  76. }
  77. }
  78. }else{//从数据库获取
  79. $dqr=$empire->fetch1("select path from {$dbtbpre}extend_linkage where id='$id'");
  80. $allpath=substr($dqr[path],2, -1);
  81. $arr=explode(',',$allpath);
  82. $num=count($arr);
  83. foreach($arr as $key=>$val){
  84. if($val && $key>=$num-$jibie){
  85. $in.=$val.',';
  86. }
  87. }
  88. $in=substr($in, 0,-1);
  89. if($dqr){
  90. $query="select name from {$dbtbpre}extend_linkage where id in ({$in})";
  91. $sql=$empire->query($query);
  92. while($zcd=$empire->fetch($sql)){
  93. $i++;
  94. $r.=$zcd[name].'-';
  95. }
  96. }
  97. }
  98. return $r.$data[$id][name];
  99. }
复制代码
前端模板测试代码提供部分(更多的自行发挥就是了):
  1. 联动使用示例1:获取传入ID所有数据包含扩展字段{数据ID4[天津的所有扩展字段]}<br />
  2. <?
  3. $b=user_linkage(4,1,'dq','');
  4. echo $b['zip'].'<br />';//字段zip 自己增加
  5. echo $b['domain'];//字段domain 自己增加
  6. ?>
  7. <br />
  8. <br />
  9. 联动使用示例2:传入模版输出子菜单例子{数据ID6[河北省下面的所有城市]}:<br />
  10. <?
  11. echo user_linkage(6,1,'zcd','<li>{name}</li>');
  12. ?>
  13. <br />
  14. <br />
  15. 联动使用示例3:向上输出所有路径$jibie是最高99级别{数据ID46[46为默认数据中河北省衡水市]}
  16. <?php
  17. echo user_linkage(6,1,'path',2);/*因为只有2级,最高级是“全国城市”,下一级既为“河北省”*/
  18. ?>

  19. <br />
  20. <br />
  21. 注释:以上案例全部是通过缓存获得。
复制代码




附带资料:
联动前端框架资料
感谢本插件前端框架作者!!!

附件打包下载:
无限联动2.0.zip (302.21 KB, 下载次数: 23, 售价: 500 贡献)

相关帖子

374

主题

381

帖子

2558

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2558
 楼主| 发表于 2015-9-11 17:14:07 | 显示全部楼层
返回联动指定ID的所有子合集并且包含自身
data为联动变量,比如默认第一个菜单为$linkage_1
dqid为当前信息联动id

  1. /* 返回联动所有子分类合集(包含自身:SQL语句使用) */
  2. function ReturnZfl($data,$dqid){
  3.     $zfl='';
  4.     if($data[$dqid]['zfl']){
  5.         $zfl.=$data[$dqid]['zfl'];
  6.         $zflarr=explode(',',$data[$dqid]['zfl']);
  7.         foreach($zflarr as $val){
  8.             if($data[$val]['zfl']){
  9.                 $zfl.=','.ReturnZfl($data,$data[$val]['id']);
  10.             }
  11.         }
  12.     }
  13.     $zfl=$zfl?$dqid.','.$zfl:$dqid;
  14.     return $zfl;
  15. }
  16. /* 结合项获取sql */
  17. function ReturnSql($dqid,$ziduan){
  18.     global $empire,$dbtbpre;
  19.     $find=$empire->fetch1("select id,path from {$dbtbpre}extend_linkage where id='$dqid'");
  20.     if(!$find){
  21.         return false;
  22.     }else{
  23.         $patharr=explode(',',$find['path']);
  24.         $filename=ECMS_PATH.'e/extend/yl_linkage/data/linkage_cache_'.$patharr[1].'.php';
  25.         if(!file_exists($filename)){
  26.             return '请生成联动缓存!';
  27.         }
  28.         include $filename;
  29.         $a='linkage_'.$patharr[1];
  30.         $data=${$a}; //联动数组。
  31.         $inall=ReturnZfl($data,$dqid);
  32.         return $ziduan.' in ('.$inall.')';
  33.     }
  34. }
复制代码

374

主题

381

帖子

2558

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2558
 楼主| 发表于 2015-9-11 17:31:48 | 显示全部楼层
返回当前信息联动级别

  1. /* 返回当前信息联动级别 */
  2. function ReturnLevel($id=''){
  3.     global $public_r,$ecms_config;
  4.     if (!$id) {return FALSE;}
  5.     include ECMS_PATH.'e/extend/yl_linkage/data/linkage_cache_1.php';
  6.     $data= $linkage_1;
  7.     $pathstr= $data[$id]['path'];
  8.     $newpathstr= trim($pathstr);
  9.     $newpathstr= ltrim($newpathstr, '0,' );
  10.     $newpathstr= rtrim($newpathstr, ',' );
  11.     $patharr= explode(',', $newpathstr);
  12.     $prc= count($patharr);
  13.     return $prc;
  14. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|PHPIN.NET ( 冀ICP备00000001号 )|网站地图  

GMT+8, 2016-12-10 20:42

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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