帝国CMS无限联动插件V2.0{全新内核 更多自由}
帝国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 替换为以下代码:
//生成php缓存文件
function Shengcheng($id){
global $empire,$dbtbpre;
$rfsql="select * from {$dbtbpre}extend_linkage where id='$id' and type=0 and parentid=0";
$rf=mysql_fetch_array($empire->query($rfsql),MYSQL_ASSOC);//查找父分类
$linkage[$rf['id']]=$rf;
$query_rf="select id from {$dbtbpre}extend_linkage where parentid='$rf'";
$sql_rf=$empire->query($query_rf);
while($r_rf=mysql_fetch_array($sql_rf,MYSQL_ASSOC)){
$linkage[$rf['id']]['zfl'].=$r_rf['id'].',';
}
$linkage[$rf['id']]['zfl']=substr($linkage[$rf['id']]['zfl'],0,-1);
if(!$rf){
printerror2("只能针对顶级ID生成缓存",'',9);
}
$query="select * from {$dbtbpre}extend_linkage where type='$id'";
$sql=$empire->query($query);
while($r=mysql_fetch_array($sql,MYSQL_ASSOC)){
$query_zfl="select id from {$dbtbpre}extend_linkage where parentid='$r'";
$sql_zfl=$empire->query($query_zfl);
while($r_zfl=mysql_fetch_array($sql_zfl,MYSQL_ASSOC)){
$r['zfl'].=$r_zfl['id'].',';
}
$r['zfl']=substr($r['zfl'],0,-1);
$linkage[$r['id']]=$r;
}
$filename=ECMS_PATH.'e/extend/yl_linkage/data/linkage_cache_'.$rf['id'].'.php';//缓存文件路径
$str='<?'.PHP_EOL;
$str.='$linkage_'.$rf['id'].'=';
$str.=var_export($linkage,TRUE);
$str.=PHP_EOL.'?>';
file_put_contents($filename,$str );
if(file_put_contents($filename,$str )){
printerror2("缓存生成成功!",'',9);
}
}
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自定义函数处理代码(这里的代码只是前台使用)。
更多详情请自行研究使用发挥拓展。
本插件仅作抛砖引玉之功能。
效果截图:
Userfun.php代码(部分案例代码,更多的请自行扩展):
/*********************无限联动插件部分实例***************************/
/* ID,类型,生成的联动菜单顶级ID,fun数据处理函数可以自己扩展,避免冲突函数前缀是user_linkage_
* 下面只是简单例子,增加不同数据获取方式 可以自定义$fun,然后写个函数处理。
* $data是缓存文件的数组,如果确定生成联动菜单缓存,可以在模版中直接引入使用。
* $other自定义传入内容。
* <?
$aa=user_linkage(2);
echo $aa;
* ?>
* <?=user_linkage(2,0,'zcd','<li>{name}</li>')?>
* <?=user_linkage(9,0,'path',3);?>
*/
function user_linkage($id, $type = 0, $fun = 'dq', $other = '') {
global $empire, $dbtbpre;
$id = (int)$id;
$type = (int)$type;
$data = (int)$data;
$fun = 'user_linkage_' . $fun;
if (!$type) { //获取联动类型
$r = $empire->fetch1("select id,type from {$dbtbpre}extend_linkage where id='$id'");
if (!$r) {
return FALSE;
} else {
$type = $r['type'] ? $r['type'] : $r['id'];
}
}
$filename = ECMS_PATH . 'e/extend/yl_linkage/data/linkage_cache_' . $type . '.php';
if (file_exists($filename)) {
include "$filename";
$a = 'linkage_' . $type;
$data = $ {
$a
};
}
if (function_exists($fun)) {
return $fun($id, $data, $other); //执行数据处理函数
} else {
return FALSE;
}
}
//联动使用示例1:获取传入ID所有数据包含扩展字段
function user_linkage_dq($id, $data = '', $template) {
global $empire, $dbtbpre;
if (is_array($data)) { //从缓存获取
$r = $data[$id];
} else { //从数据库获取
$r = $empire->fetch1("select * from {$dbtbpre}extend_linkage where id='$id'");
}
return $r;
}
//联动使用示例2:传入模版输出子菜单例子
function user_linkage_zcd($id, $data = '', $template = '<li>{name}</li>') {
global $empire, $dbtbpre;
if (is_array($data)) { //从缓存获取
foreach ($data as $val) {
if ($val == $id) {
$r.= str_replace('{name}', $val, $template);
}
}
} else { //从数据库获取
$query = "select name from {$dbtbpre}extend_linkage where parentid='$id'";
$sql = $empire->query($query);
while ($zcd = $empire->fetch($sql)) {
$r.= str_replace('{name}', $zcd, $template);
}
}
return $r;
}
//联动使用示例3:向上输出所有路径$jibie是最高99级别
function user_linkage_path($id, $data = '', $jibie = 99) {
global $empire, $dbtbpre;
if (is_array($data)) { //从缓存获取
$arr = explode(',', $data[$id]);
$num = count($arr) - 2;
foreach ($arr as $key => $val) {
if ($val && $key > $num - $jibie) {
$r.= $data[$val] . '-';
}
}
} else { //从数据库获取
$dqr = $empire->fetch1("select path from {$dbtbpre}extend_linkage where id='$id'");
$allpath = substr($dqr, 2, -1);
$arr = explode(',', $allpath);
$num = count($arr);
foreach ($arr as $key => $val) {
if ($val && $key >= $num - $jibie) {
$in.= $val . ',';
}
}
$in = substr($in, 0, -1);
if ($dqr) {
$query = "select name from {$dbtbpre}extend_linkage where id in ({$in})";
$sql = $empire->query($query);
while ($zcd = $empire->fetch($sql)) {
$i++;
$r.= $zcd . '-';
}
}
}
return $r . $data[$id];
}前端模板测试代码提供部分(更多的自行发挥就是了):联动使用示例1:获取传入ID所有数据包含扩展字段{数据ID4[天津的所有扩展字段]}<br />
<?
$b=user_linkage(4,1,'dq','');
echo $b['zip'].'<br />';//字段zip 自己增加
echo $b['domain'];//字段domain 自己增加
?>
<br />
<br />
联动使用示例2:传入模版输出子菜单例子{数据ID6[河北省下面的所有城市]}:<br />
<?
echo user_linkage(6,1,'zcd','<li>{name}</li>');
?>
<br />
<br />
联动使用示例3:向上输出所有路径$jibie是最高99级别{数据ID46}
<?php
echo user_linkage(6,1,'path',2);/*因为只有2级,最高级是“全国城市”,下一级既为“河北省”*/
?>
<br />
<br />
注释:以上案例全部是通过缓存获得。
附带资料:
联动前端框架资料
感谢本插件前端框架作者!!!
附件打包下载:
返回联动指定ID的所有子合集并且包含自身
data为联动变量,比如默认第一个菜单为$linkage_1
dqid为当前信息联动id
/* 返回联动所有子分类合集(包含自身:SQL语句使用) */
function ReturnZfl($data,$dqid){
$zfl='';
if($data[$dqid]['zfl']){
$zfl.=$data[$dqid]['zfl'];
$zflarr=explode(',',$data[$dqid]['zfl']);
foreach($zflarr as $val){
if($data[$val]['zfl']){
$zfl.=','.ReturnZfl($data,$data[$val]['id']);
}
}
}
$zfl=$zfl?$dqid.','.$zfl:$dqid;
return $zfl;
}
/* 结合项获取sql */
function ReturnSql($dqid,$ziduan){
global $empire,$dbtbpre;
$find=$empire->fetch1("select id,path from {$dbtbpre}extend_linkage where id='$dqid'");
if(!$find){
return false;
}else{
$patharr=explode(',',$find['path']);
$filename=ECMS_PATH.'e/extend/yl_linkage/data/linkage_cache_'.$patharr.'.php';
if(!file_exists($filename)){
return '请生成联动缓存!';
}
include $filename;
$a='linkage_'.$patharr;
$data=${$a}; //联动数组。
$inall=ReturnZfl($data,$dqid);
return $ziduan.' in ('.$inall.')';
}
} 返回当前信息联动级别
/* 返回当前信息联动级别 */
function ReturnLevel($id=''){
global $public_r,$ecms_config;
if (!$id) {return FALSE;}
include ECMS_PATH.'e/extend/yl_linkage/data/linkage_cache_1.php';
$data= $linkage_1;
$pathstr= $data[$id]['path'];
$newpathstr= trim($pathstr);
$newpathstr= ltrim($newpathstr, '0,' );
$newpathstr= rtrim($newpathstr, ',' );
$patharr= explode(',', $newpathstr);
$prc= count($patharr);
return $prc;
} 能出个教程吗?谢谢了:loveliness: :)市县数据呢?
页:
[1]