暂时只支持二级联动,部分设置需要在模板里修改,只支持从分类里读取联动数据(其他表需要修改)
数据库修改
fa_cms_fields 添加字段 linkage 类型text
后台修改
使用:选择linkage
ajaxurl | 父id |
ajax/category?type=quyu&pid=0 | |
ajax/category | pid |
\application\common\model\Config.php
getTypeList 增加 'linkage' => __('Linkage'),
\application\admin\view\cms\fields\
add.html 25左右
<div class="form-group hidden tf tf-linkage">
<label class="control-label col-xs-12 col-sm-2">{:__('联动配置')}:</label>
<div class="col-xs-12 col-sm-8">
<dl class="fieldlist" data-template="linkagetpl" data-name="row[linkage]">
<dd>
<ins style="width:220px;">AjaxUrl</ins>
<ins>父ID字段</ins>
</dd>
<dd><a href="javascript:;" class="append btn btn-sm btn-success"><i class="fa fa-plus"></i> {:__('Append')}</a></dd>
<textarea name="row[linkage]" class="form-control hide" cols="30" rows="5">[{"ajaxurl":"ajax/category?type=quyu&pid=0","perfield":""},{"ajaxurl":"ajax/category","perfield":"pid"}]</textarea>
</dl>
<script id="linkagetpl" type="text/html">
<dd class="form-inline">
<ins style="width:220px;"><input style="width:220px;" type="text" name="<%=name%>[<%=index%>][ajaxurl]" class="form-control" value="<%=row.ajaxurl%>" placeholder="AjaxUrl"/></ins>
<ins><input type="text" name="<%=name%>[<%=index%>][perfield]" class="form-control" value="<%=row.perfield%>" placeholder="父ID字段"/></ins>
<!--下面的两个按钮务必保留-->
<span class="btn btn-sm btn-danger btn-remove"><i class="fa fa-times"></i></span>
<span class="btn btn-sm btn-primary btn-dragsort"><i class="fa fa-arrows"></i></span>
</dd>
</script>
</div>
</div>
edit.html 28左右
<div class="form-group hidden tf tf-linkage">
<label class="control-label col-xs-12 col-sm-2">{:__('联动配置')}:</label>
<div class="col-xs-12 col-sm-8">
<dl class="fieldlist" data-template="linkagetpl" data-name="row[linkage]">
<dd>
<ins style="width:220px;">AjaxUrl</ins>
<ins>父ID字段</ins>
</dd>
<dd><a href="javascript:;" class="append btn btn-sm btn-success"><i class="fa fa-plus"></i> {:__('Append')}</a></dd>
<textarea name="row[linkage]" class="form-control hide" cols="30" rows="5">{$row.linkage|default=''}</textarea>
</dl>
<script id="linkagetpl" type="text/html">
<dd class="form-inline">
<ins style="width:220px;"><input style="width:220px;" type="text" name="<%=name%>[<%=index%>][ajaxurl]" class="form-control" value="<%=row.ajaxurl%>" placeholder="AjaxUrl"/></ins>
<ins><input type="text" name="<%=name%>[<%=index%>][perfield]" class="form-control" value="<%=row.perfield%>" placeholder="父ID字段"/></ins>
<!--下面的两个按钮务必保留-->
<span class="btn btn-sm btn-danger btn-remove"><i class="fa fa-times"></i></span>
<span class="btn btn-sm btn-primary btn-dragsort"><i class="fa fa-arrows"></i></span>
</dd>
</script>
</div>
</div>
application\admin\view\cms\common\fields.html 140左右
{case linkage}
{assign name="linkage" value=":json_decode($item.linkage,true)" /}
{assign name="linkage_val" value=":explode(',',$item.value)" /}
<div class="form-inline" data-toggle="cxselect" data-selects="{:get_linkage_key($linkage,$item.name)}">
{foreach name="linkage" item="v"}
<select class="{$item.name}_{$key} form-control"
name="row[{$item.name}][]"
data-url="{$v.ajaxurl}"
{$key==0 ? "" :"data-query-name='$v[perfield]'"}
{:isset($linkage_val[$key]) ? "data-value='$linkage_val[$key]'" : ""}
></select>
{/foreach}
</div>
{/case}
支持筛选
\addons\cms\library\Service.php
315附近
//多选值字段需要做特殊处理
if (in_array($v['type'], ['selects', 'checkbox', 'array', 'selectpages', 'linkage'])) {
$multiValueFields[] = $v['name'];
}
319附近
$fields[] = [
'name' => $v['name'],
'title' => $v['title'],
'type' => $v['type'],
'content' => $content
];
改成
if($v['type']=="linkage"){ //联动字段特殊处理
foreach ($content as $key => $value) {
$content_key=$key;
$content_value=$value;
break;
}
//如果不是查询语句
if(!strstr($content_value,"select")){
continue;
}
$row=Db::query($content_value);
$content=[];
foreach ($row as $kk => $vv) {
$content[$vv["id"]]=$vv[$content_key];
}
$fields[] = [
'name' => $v['name'],
'title' => $v['title'],
'type' => $v['type'],
'content' => $content
];
}else{
$fields[] = [
'name' => $v['name'],
'title' => $v['title'],
'type' => $v['type'],
'content' => $content
];
}
358行 362行附近
$active = ($m === '' && !$filterArr) || ($m !== '' && in_array($m, $filterArr)) ? true : false;
//下面添加
if (!$active && $v['type']=="linkage" && $m !== '' && !empty($filterArr)) { //联动字段高亮处理
$active = in_array($filterArr[0], explode(",",getson($m))) ? true : false;
}
if ($active) {
if($v['type']=="linkage"){ //联动字段处理
$current = $m;
}else{
$current = implode(';', array_diff($filterArr, [$m]));
}
} else {
$current = $multiple ? implode(';', array_merge($filterArr, [$m])) : $m;
}
模板调用
linkageHtml(字段名,url参数,字段对应的分类类型的值)
{cms:pagefilter id="filter" exclude=""}
<li>
<span> {$filter.title|htmlentities}: </span>
{volist name="$filter.content" id="item"}
<a class="{$item.active?'hover':''} " title="{$item.title|htmlentities}" href="{$item.url}" ><font>{$item.title|htmlentities}</font></a>
{/volist}
<!-- 开始-->
{assign name="son1" value=":linkageHtml($filter.name,input(),['qy'=>'quyu','jyyt'=>'jyyt'])" /}
{if(!empty($son1))}
<div class="u-souzhan">
{volist name="son1" id="v"}
<a title="{$v.name}" href="{$v.url}" class="{$v.active?'hover':''}"><i class="left"></i><font>{$v.name}</font><i class="right"></i></a>
{/volist}
</div>
{/if}
</li>
{/cms:pagefilter}
函数支持 common.php
function linkageHtml($field="",$params="",$type=[])
{
if(!isset($type[$field]) or !isset($params[$field])){return "";}
$urlArr=$params;
$cur_id=isset($params[$field]) ? $params[$field] : 0;
$type=$type[$field];
$rows=db("category")->where("pid",$cur_id)->cache(true)->where("type",$type)->where("status","normal")->select();
if(empty($rows)){
$perid=db("category")->where("id",$cur_id)->cache(true)->value("pid");
$rows= db("category")->where("pid",$perid)->cache(true)->where("type",$type)->where("status","normal")->select();
}
foreach ($rows as $k => $v) {
$urlArr[$field]=$v["id"];
$rows[$k]["url"]="?".http_build_query($urlArr);
$rows[$k]["active"]= $params[$field]==$v["id"] ? true :false;
}
$urlArr[$field]=$perid;
$all[]=[
"name"=>"不限",
"url"=>"?".http_build_query($urlArr),
"active"=> $params[$field]==$perid ? true : false,
];
$rows = $all + $rows;
return $rows;
}
function get_linkage_key($arr,$name)
{
$tmp="";
foreach ($arr as $k => $v) {
if($k==0){
$tmp=$name."_".$k;
}else{
$tmp.=",".$name."_".$k;
}
}
return $tmp;
}
发表评论 取消回复