dever 7 سال پیش
والد
کامیت
2ddbade824
4فایلهای تغییر یافته به همراه141 افزوده شده و 51 حذف شده
  1. 73 5
      assets/public/main.js
  2. 5 0
      database/admin.php
  3. 49 24
      src/Database.php
  4. 14 22
      src/Lib/Input.php

+ 73 - 5
assets/public/main.js

@@ -1348,6 +1348,73 @@ function showToggle(e)
 	loadEditor($(id).find('.editor'));
 }
 
+function select_linkage(level, id, url, name, value, valid, w, total, search)
+{
+	var e = '#' + id;
+	var parent = value.split(',');
+	var cur = parent[0];
+	parent.remove(cur);
+	value = parent.join(',');
+	var html = '';
+	var old = level;
+
+	if (!total) {
+		level_id = 0;
+	} else {
+		if (level >= total) {
+			//$(e).show();
+			return;
+		}
+		level_id = $(e + '_' + level).val();
+		level = parseInt(level) + 1;
+	}
+	$.getJSON(url + '?json=1', {level_search:search, level_id:level_id, level_num:level}, function(t) {
+		var check = '';
+		if (t.status == 1) {
+			var total = t.data.level_total;
+			var data = t.data.list;
+
+			if(!$(e + '_' + level).length) {
+				html = '<select style="'+w+'display:inline;margin-top:10px;" class="update_value form-control '+valid+'" id="'+id+'_'+level+'" name="'+name+'[]" onchange="select_linkage(\''+level+'\', \''+id+'\', \''+url+'\', \''+name+'\', \''+value+'\', \''+valid+'\', \''+w+'\', '+total+', '+search+');">';
+			}
+
+			for (a in data) {
+				if (data[a].value) {
+					check = '';
+					if (cur == data[a].value) {
+						check = ' selected';
+					}
+					html += '<option value="'+data[a].value+'" '+check+'>'+data[a].name+'</option>';
+				}
+			}
+
+			if(!$(e + '_' + level).length) {
+				html += '</select><span>&nbsp;&nbsp;</span>';
+				$(e).append(html);
+				$(e + '_' + level).change();
+			} else {
+				$(e + '_' + level).html(html);
+				$(e + '_' + level).change();
+			}
+		} else {
+			$(e + '_' + old).nextAll('select').remove();
+			$(e + '_' + old).next('span').nextAll('span').remove();
+		}
+
+		/*
+		if ($('#' + name + '_level_value').length) {
+			var total = $(id).find('select').length;
+			$('#' + name + '_level_value').val(total);
+		}
+
+		if ($('#' + name + '_up_value').length) {
+			$('#' + name + '_up_value').val($(id + '_-2').val());
+		}
+		*/
+	});
+}
+
+/*
 function select_mul(level, id, url, name, value, valid, w, num)
 {
 	if(level == 0)
@@ -1369,6 +1436,7 @@ function select_mul(level, id, url, name, value, valid, w, num)
 		{
 			level = $(id + '_' + level).val();
 		}
+		alert(level);
 
 		if(level == 0)
 		{
@@ -1410,16 +1478,15 @@ function select_mul(level, id, url, name, value, valid, w, num)
 	{
 		level = -2;
 	}
-
 	if(!$(id + '_' + level).length)
 	{
-		$.getJSON(get + '&json=1', function(t)
+		$.getJSON(get + '&json=1', {total:total,level:level}, function(t)
 		{
 			var check = '';
-			if(!t.status)
+			if(t.status == 1)
 			{
-				html = '<select style="'+w+'display:inline;margin-top:10px;" class="update_value form-control '+valid+' dever-mul-'+name+'_'+level+'" name="'+name+'[]" onchange="select_mul('+level+', \''+id+'\', \''+url+'\', \''+name+'\', \''+value+'\', \''+valid+'\', \''+w+'\', '+num+');">';
-
+				html = '<select style="'+w+'display:inline;margin-top:10px;" class="update_value form-control '+valid+' dever-mul-'+name+'_'+level+'" name="'+name+'[]" onchange="select_mul(\''+level+'\', \''+id+'\', \''+url+'\', \''+name+'\', \''+value+'\', \''+valid+'\', \''+w+'\', '+num+');">';
+				console.log(t.data);
 				for(a in t.data)
 				{
 					if(t.data[a].value)
@@ -1458,6 +1525,7 @@ function select_mul(level, id, url, name, value, valid, w, num)
 		});
 	}
 }
+*/
 
 
 //处理更新页面的一些功能,写到一起吧

+ 5 - 0
database/admin.php

@@ -141,6 +141,10 @@ return array
 			//'bind'		=> array('onblur', 'loading', array('url' => Dever::url("auth.blur"))),
 		),
 
+		#多级联动
+		//'update'	=> 'linkage',//多级联动 option参数:请求地址(返回参数为level_num当前联动级数,level_id当前选择的id),参考area组件:dever package area
+		//'option'	=> Dever::url('api.get', 'area'),
+
 		'email'		=> array
 		(
 			'type' 		=> 'varchar-150',
@@ -156,6 +160,7 @@ return array
 			* exp:大小判断,仅能选择一项
 			* select:选择器,需要option项
 			* group:组选择器,需要option项
+			* linkage:多级联动选择器,需要option项,值为联动数据接口地址,参考area组件
 			* exist:是否存在,需要exist项,基本配置为
 			$source_id = array
 			(

+ 49 - 24
src/Database.php

@@ -482,11 +482,11 @@ class Database
                         }
                     }
 
-                    if (isset($v['option']) && strpos($v['search'], 'mul') !== false) {
-                        $config['manage']['search']['mul'][$k]['option'] = $v['option'];
-                        $config['manage']['search']['mul'][$k]['lang'] = $v['name'];
+                    if (isset($v['option']) && strpos($v['search'], 'linkage') !== false) {
+                        $config['manage']['search']['linkage'][$k]['option'] = $v['option'];
+                        $config['manage']['search']['linkage'][$k]['lang'] = $v['name'];
                         if (isset($v['default'])) {
-                            $config['manage']['search']['mul'][$k]['default'] = $v['default'];
+                            $config['manage']['search']['linkage'][$k]['default'] = $v['default'];
                         }
                     }
                 } elseif (isset($v['search']) && is_array($v['search'])) {
@@ -757,19 +757,20 @@ class Database
      *
      * @return array
      */
-    public function list_search_mul(&$result, $search, $name, $lang, $option, $default = false)
+    public function list_search_linkage(&$result, $search, $name, $lang, $option, $default = false)
     {
         $value = array();
         $value['name'] = $name;
         $value['lang'] = $lang;
         $value['option'] = $option;
+        $value['search_state'] = true;
         if (isset($search[$name])) {
             $value['value'] = $search[$name];
         }
         if ($default) {
             //$value['default'] = $default;
         }
-        $result .= Html::mul($value, 'span') . '&nbsp;&nbsp;&nbsp;';
+        $result .= Html::linkage($value, 'span') . '&nbsp;&nbsp;&nbsp;';
     }
 
     /**
@@ -941,18 +942,28 @@ class Database
 
             $result .= $node[0];
 
+            if (isset($config['manage']['search']['linkage'])) {
+                foreach ($config['manage']['search']['linkage'] as $k => $v) {
+                    $this->list_search_linkage($result, $search, $prefix . 'linkage_' . $k, $v['lang'], $this->option($v['option']), $v['default']);
+                }
+            }
+
             if (isset($config['manage']['search']['time'])) {
+                $this->list_search_br($result);
                 foreach ($config['manage']['search']['time'] as $k => $v) {
                     $this->list_search_time($result, $search, $prefix, $k, $v);
                 }
             }
 
             if (isset($config['manage']['search']['date'])) {
+                $this->list_search_br($result);
                 foreach ($config['manage']['search']['date'] as $k => $v) {
                     $this->list_search_time($result, $search, $prefix, $k, $v, 'date');
                 }
             }
 
+
+
             if (isset($config['manage']['search']['select'])) {
                 $this->list_search_br($result);
                 foreach ($config['manage']['search']['select'] as $k => $v) {
@@ -988,13 +999,6 @@ class Database
                 }
             }
 
-            if (isset($config['manage']['search']['mul'])) {
-                $this->list_search_br($result);
-                foreach ($config['manage']['search']['mul'] as $k => $v) {
-                    $this->list_search_mul($result, $search, $prefix . 'option_' . $k, $v['lang'], $this->option($v['option']), $v['default']);
-                }
-            }
-
             if (isset($config['manage']['search']['api'])) {
                 $this->list_search_br($result);
                 foreach ($config['manage']['search']['api'] as $k => $v) {
@@ -1429,22 +1433,40 @@ class Database
         }
         $fulltext = Dever::preInput('search_fulltext_');
         if ($fulltext) {
-            # like改为instr 不再需要%
-            $search['search_fulltext_type'] = 2;
-            $fix = '';
+            $fulltext_state = false;
             foreach ($fulltext as $k => $v) {
                 if ($v) {
                     unset($search[$k]);
                     $k = str_replace('search_fulltext_', '', $k);
-                    $param['option_' . $k] = $fix . $v . $fix;
+                    $param['option_' . $k] = $v;
 
                     # 设定检索高亮
                     $high[$k] = $v;
+
+                    $fulltext_state = true;
                 }
             }
+            $this->search = true;
+        }
+
+        $linkage = Dever::preInput('search_linkage_');
+        if ($linkage) {
+            foreach ($linkage as $k => $v) {
+                if ($v) {
+                    unset($search[$k]);
+                    $k = str_replace('search_linkage_', '', $k);
+                    if (is_array($v)) {
+                        $v = implode(',', $v);
+                    }
+                    
+                    $v = str_replace('-1', ',', $v);
+                    $v = str_replace(',,,', ',', $v);
+                    $v = str_replace(',,', ',', $v);
+                    $param['option_' . $k] = $v;
 
-            if ($param) {
-                $param['search_type'] = $search['search_fulltext_type'];
+                    # 设定检索高亮
+                    $high[$k] = $v;
+                }
             }
             $this->search = true;
         }
@@ -2481,15 +2503,18 @@ class Database
                     $name = array();
                     $option = $this->option($j['option']);
 
-                    foreach ($option as $a => $b) {
-                        if (!is_array($log[$j['name']])) {
-                            if ($a == $log[$j['name']]) {
+                    if (is_array($option)) {
+                       foreach ($option as $a => $b) {
+                            if (!is_array($log[$j['name']])) {
+                                if ($a == $log[$j['name']]) {
+                                    $name[] = (is_array($b) && isset($b['name'])) ? $b['name'] : $b;
+                                }
+                            } elseif (in_array($a, $log[$j['name']])) {
                                 $name[] = (is_array($b) && isset($b['name'])) ? $b['name'] : $b;
                             }
-                        } elseif (in_array($a, $log[$j['name']])) {
-                            $name[] = (is_array($b) && isset($b['name'])) ? $b['name'] : $b;
                         }
                     }
+                    
 
                     $log[$j['name']] = implode(',', $name);
                 }

+ 14 - 22
src/Lib/Input.php

@@ -405,11 +405,11 @@ class Input
     }
 
     /**
-     * mul select
+     * linkage select 多级联动
      *
      * @return string
      */
-    public static function mul($param, $class = '', $hidden = '', $change = '')
+    public static function linkage($param, $class = '', $hidden = '', $change = '')
     {
         $div = 'div';
         $w = 'width:20%;';
@@ -418,32 +418,24 @@ class Input
             $w = '';
         }
 
-        $num = 0;
-        $level = -1;
-        if (is_array($param['option'])) {
-            $num = $param['option'][1];
-            $level = isset($param['option'][2]) ? $param['option'][2] : $level;
-            $param['option'] = $param['option'][0];
+        if (!isset($param['search_state'])) {
+            $param['search_state'] = false;
         }
-        $html = '<' . $div . ' class="' . $class . ' dever-mul-' . $param['name'] . '">';
+
+        # 当前级别
+        $level = 1;
+        $id = 'dever-linkage-' . $param['name'];
+
+        $html = '<' . $div . ' class="' . $class . '" id="' . $id . '" >';
+
+        # 默认值
         if (isset($param['value']) && is_array($param['value'])) {
             $param['value'] = implode(',', $param['value']);
-            /*
-        $count = count($param['value']) - 1;
-        if($param['value'][$count] <= 0)
-        {
-        $param['value'] = $param['value'][$count-1];
-        }
-        else
-        {
-        $param['value'] = $param['value'][$count];
-        }
-         */
         }
 
-        $html .= '<script>function mul_' . $param['name'] . '(level,state){if(state == 1){select_mul(0, ".dever-mul-' . $param['name'] . '")}select_mul(level, ".dever-mul-' . $param['name'] . '","' . $param['option'] . '", "' . $param['name'] . '", "' . (isset($param['value']) ? $param['value'] : (isset($param['default']) ? $param['default'] : '')) . '", "' . (isset($param['valid']) ? $param['valid'] : '') . '", "' . $w . '", ' . $num . ')};';
+        $html .= '<script>function linkage_' . $param['name'] . '(level){select_linkage(level, "' . $id . '","' . $param['option'] . '", "' . $param['name'] . '", "' . (isset($param['value']) ? $param['value'] : (isset($param['default']) ? $param['default'] : '')) . '", "' . (isset($param['valid']) ? $param['valid'] : '') . '", "' . $w . '", false, "'.$param['search_state'].'")};';
 
-        $html .= '$(document).ready(function(){mul_' . $param['name'] . '(' . $level . ',0)});</script>';
+        $html .= '$(document).ready(function(){linkage_' . $param['name'] . '(' . $level . ')});</script>';
 
         $html .= '</' . $div . '>';