暂时只支持二级联动,部分设置需要在模板里修改,只支持从分类里读取联动数据(其他表需要修改)


数据库修改

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&amp;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;
   
}

点赞(0)

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部