Changeset 28153 for extensions/rv_autocomplete/functions.inc.php
- Timestamp:
- Apr 10, 2014, 11:26:00 PM (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
extensions/rv_autocomplete/functions.inc.php
r28088 r28153 3 3 function rvac_get_conf() 4 4 { 5 6 7 8 9 5 global $conf; 6 if (is_array($conf['rvac_opts'])) 7 return $conf['rvac_opts']; 8 $conf['rvac_opts'] = unserialize($conf['rvac_opts']); 9 return $conf['rvac_opts']; 10 10 } 11 11 12 12 function rvac_save_conf($cnf) 13 13 { 14 15 16 14 global $conf; 15 $conf['rvac_opts'] = $cnf; 16 conf_update_param('rvac_opts', addslashes(serialize($conf['rvac_opts'])) ); 17 17 } 18 18 19 19 function rvac_get_url_roots() 20 20 { 21 22 23 24 25 26 27 28 29 30 31 32 33 21 $roots = array( 22 'r' => get_root_url() 23 ); 24 25 $url = make_index_url( array('tags'=>array( array('id'=>123,'name'=>123,'url_name'=>123))) ); 26 $url = substr($url, 0, strpos($url, '123')); 27 $roots['t'] = $url; 28 29 $url = make_index_url( array('category'=>array('id'=>123,'name'=>123,'permalink'=>123)) ); 30 $url = substr($url, 0, strpos($url, '123')); 31 $roots['a'] = $url; 32 33 return $roots; 34 34 } 35 35 … … 37 37 function rvac_normalize($name) 38 38 { 39 40 41 42 43 44 39 $invalid = '&().,-'; 40 $name = strtr($name, $invalid, str_repeat(' ', strlen($invalid))); 41 $name = transliterate($name); 42 for($i=0; $i<3; $i++) 43 $name = str_replace(' ', ' ', $name); 44 return $name; 45 45 } 46 46 47 47 function rvac_get_elem($item, $key) 48 48 { 49 50 51 52 53 54 55 56 49 $l = $item['names'][$key]; 50 $q = $item['q_names'][$key]; 51 $ret = array( 52 'label' => $l, 53 'value' => $item['url'], 54 ); 55 if ($q != strtolower($l)) 56 $ret['q'] = $q; 57 57 if ($item['counter'] > 0) 58 58 $ret['w'] = intval($item['counter']); 59 59 return $ret; 60 60 } 61 61 62 62 function rvac_get_index() 63 63 { 64 global $user; 65 66 $rvac_conf = rvac_get_conf(); 67 $root_url = get_root_url(); 68 $items = array(); 69 70 $roots = rvac_get_url_roots(); 71 72 73 $query = 'SELECT id,name FROM '.TAGS_TABLE; 74 if ( !empty($rvac_conf['excluded_tags']) ) 75 $query .= ' WHERE id NOT IN ('.implode(',',$rvac_conf['excluded_tags']).')'; 76 $tag_names = query2array($query, 'id','name'); 77 78 $url_len = strlen( $roots['t'] ); 79 foreach( get_available_tags() as $row) 80 { 81 if (!isset($tag_names[$row['id']])) continue; 82 $row['type'] = 't'; 83 $row['url'] = '$t/' . substr( make_index_url( array('tags'=>array($row)) ), $url_len); 84 $row['name'] = $tag_names[ $row['id'] ]; 85 $items[] = $row; 86 } 87 88 89 $query = 'SELECT id,name,permalink,nb_images AS counter 90 FROM '.CATEGORIES_TABLE.' INNER JOIN '.USER_CACHE_CATEGORIES_TABLE.' 91 ON id = cat_id AND user_id = '.$user['id']; 92 if ( !empty($rvac_conf['excluded_albums']) ) 93 $query .= ' WHERE id NOT IN ('.implode(',',$rvac_conf['excluded_albums']).')'; 94 95 $url_len = strlen( $roots['a'] ); 96 97 $result = pwg_query($query); 98 while ($row = pwg_db_fetch_assoc($result)) 99 { 100 $row['type'] = 'a'; 101 $row['url'] = '$a/' . substr( make_index_url( array('category'=>$row) ), $url_len); 102 $items[] = $row; 103 } 104 105 $query = 'SELECT name,counter,url FROM '.RVAC_SUGGESTIONS.' WHERE level<='.$user['level']; 106 $result = pwg_query($query); 107 while ($row = pwg_db_fetch_assoc($result)) 108 { 109 $row['type'] = 's'; 110 if (empty($row['url'])) 111 $row['url'] = -1; // special use in js to submit form (cannot put 0 because jquery ui tests often item.value) 112 $items[] = $row; 113 } 114 115 array_walk($items, function(&$obj) { 116 $alt_names = trigger_event('get_tag_alt_names', array(), $obj['name']); 117 118 if (empty($alt_names)) 119 $alt_names['default'] = $obj['name']; 120 else 121 { 122 if (!isset($alt_names['default']) && isset($alt_names[0])) 123 { 124 $alt_names['default'] = $alt_names[0]; 125 unset($alt_names[0]); 126 } 127 } 128 129 $obj['names'] = $alt_names; 130 if ('s' !== $obj['type']) 131 { 132 $obj['q_names'] = $alt_names; 133 foreach ($obj['q_names'] as &$q) 134 { 135 $q = rvac_normalize($q); 136 } 137 } 138 else 139 { 140 foreach ($obj['names'] as $l => &$name) 141 { 142 $pos = strpos($name, '\\'); 143 if ($pos === false) 144 { 145 $q = rvac_normalize($name); 146 } 147 else 148 { 149 $q = substr($name, 0, $pos); 150 if (-1 === $obj['url'] && 'default'==$l) 151 { 152 $obj['url'] = 'q='.$q; 153 } 154 $q = rvac_normalize($q); 155 $name = substr_replace($name, '', $pos, 1); 156 } 157 $obj['q_names'][$l] = $q; 158 } 159 } 160 161 }); 162 163 $type_order = array_flip( array('t','a','s') ); 164 usort($items, function($a, $b) use($type_order) { 165 $d = $a['counter']-$b['counter']; 166 if ($d) return -$d; 167 $d = $type_order[$a['type']] - $type_order[$b['type']]; 168 if ($d) return $d; 169 return strcmp($a['q_names']['default'],$b['q_names']['default']); 170 }); 171 172 //var_export($items); 173 $res = array(); 174 $res_alt = array(); 175 $lang = substr($user['language'],0,2); 176 array_walk($items, function(&$obj) use($lang, &$res, &$res_alt) { 177 $key = $lang; 178 if (empty($obj['q_names'][$key])) 179 $key = 'default'; 180 if (!empty($obj['q_names'][$key])) 181 $res[] = rvac_get_elem($obj, $key); 182 else 183 $key = null; 184 if ($key !== null) { 185 foreach( array_keys($obj['q_names']) as $k) { 186 if ($k==$key) continue; 187 if (strncmp($obj['q_names'][$key],$obj['q_names'][$k],4)==0) continue; 188 $res_alt[] = rvac_get_elem($obj, $k); 189 } 190 } 191 else { 192 foreach( $obj['q_names'] as $k => $q) 193 { 194 if (!empty($q)) 195 $res_alt[] = rvac_get_elem($obj, $k); 196 } 197 } 198 }); 199 200 return array( 201 'total' => count($res) + count($res_alt), 202 'altLangIndex' => count($res), 203 'src' => array_merge($res, $res_alt), 204 'roots' => $roots 205 ); 64 global $user; 65 66 $rvac_conf = rvac_get_conf(); 67 $root_url = get_root_url(); 68 $items = array(); 69 70 $roots = rvac_get_url_roots(); 71 72 73 $query = 'SELECT id,name FROM '.TAGS_TABLE; 74 if ( !empty($rvac_conf['excluded_tags']) ) 75 $query .= ' WHERE id NOT IN ('.implode(',',$rvac_conf['excluded_tags']).')'; 76 $tag_names = query2array($query, 'id','name'); 77 78 $url_len = strlen( $roots['t'] ); 79 foreach( get_available_tags() as $row) 80 { 81 if (!isset($tag_names[$row['id']])) continue; 82 $row['type'] = 't'; 83 $row['url'] = '$t/' . substr( make_index_url( array('tags'=>array($row)) ), $url_len); 84 $row['name'] = $tag_names[ $row['id'] ]; 85 $items[] = $row; 86 } 87 88 89 $query = 'SELECT id,name,permalink,nb_images AS counter 90 FROM '.CATEGORIES_TABLE.' INNER JOIN '.USER_CACHE_CATEGORIES_TABLE.' 91 ON id = cat_id AND user_id = '.$user['id']; 92 if ( !empty($rvac_conf['excluded_albums']) ) 93 $query .= ' WHERE id NOT IN ('.implode(',',$rvac_conf['excluded_albums']).')'; 94 95 $url_len = strlen( $roots['a'] ); 96 97 $result = pwg_query($query); 98 while ($row = pwg_db_fetch_assoc($result)) 99 { 100 $row['type'] = 'a'; 101 $row['url'] = '$a/' . substr( make_index_url( array('category'=>$row) ), $url_len); 102 $items[] = $row; 103 } 104 105 $query = 'SELECT name,counter,url FROM '.RVAC_SUGGESTIONS.' WHERE level<='.$user['level']; 106 $result = pwg_query($query); 107 while ($row = pwg_db_fetch_assoc($result)) 108 { 109 $row['type'] = 's'; 110 if (empty($row['url'])) 111 $row['url'] = -1; // special use in js to submit form (cannot put 0 because jquery ui tests often item.value) 112 $items[] = $row; 113 } 114 115 array_walk($items, function(&$obj) { 116 $alt_names = trigger_event('get_tag_alt_names', array(), $obj['name']); 117 118 if (empty($alt_names)) 119 $alt_names['default'] = $obj['name']; 120 else 121 { 122 if (!isset($alt_names['default']) && isset($alt_names[0])) 123 { 124 $alt_names['default'] = $alt_names[0]; 125 unset($alt_names[0]); 126 } 127 } 128 129 $obj['names'] = $alt_names; 130 if ('s' !== $obj['type']) 131 { 132 $obj['q_names'] = $alt_names; 133 foreach ($obj['q_names'] as &$q) 134 { 135 $q = rvac_normalize($q); 136 } 137 } 138 else 139 { 140 foreach ($obj['names'] as $l => &$name) 141 { 142 $pos = strpos($name, '\\'); 143 if ($pos === false) 144 { 145 $q = rvac_normalize($name); 146 } 147 else 148 { 149 $q = substr($name, 0, $pos); 150 if (-1 === $obj['url'] && 'default'==$l) 151 { 152 $obj['url'] = 'q='.$q; 153 } 154 $q = rvac_normalize($q); 155 $name = substr_replace($name, '', $pos, 1); 156 } 157 $obj['q_names'][$l] = $q; 158 } 159 } 160 161 }); 162 163 $type_order = array_flip( array('t','a','s') ); 164 usort($items, function($a, $b) use($type_order) { 165 $d = $a['counter']-$b['counter']; 166 if ($d) return -$d; 167 $d = $type_order[$a['type']] - $type_order[$b['type']]; 168 if ($d) return $d; 169 return strcmp($a['q_names']['default'],$b['q_names']['default']); 170 }); 171 172 //var_export($items); 173 $res = array(); 174 $res_alt = array(); 175 $lang = substr($user['language'],0,2); 176 array_walk($items, function(&$obj) use($lang, &$res, &$res_alt) { 177 $key = $lang; 178 if (empty($obj['q_names'][$key])) 179 $key = 'default'; 180 if (!empty($obj['q_names'][$key])) 181 $res[] = rvac_get_elem($obj, $key); 182 else 183 $key = null; 184 if ($key !== null) { 185 foreach( array_keys($obj['q_names']) as $k) { 186 if ($k==$key) continue; 187 if (strncmp($obj['q_names'][$key],$obj['q_names'][$k],4)==0) continue; 188 $res_alt[] = rvac_get_elem($obj, $k); 189 } 190 } 191 else { 192 foreach( $obj['q_names'] as $k => $q) 193 { 194 if (!empty($q)) 195 $res_alt[] = rvac_get_elem($obj, $k); 196 } 197 } 198 }); 199 200 return array( 201 'total' => count($res) + count($res_alt), 202 'altLangIndex' => count($res), 203 'src' => array_merge($res, $res_alt), 204 'roots' => $roots 205 ); 206 } 207 208 function rvac_on_qsearch_expression_parsed($expr) 209 { 210 global $conf; 211 $file=PHPWG_ROOT_PATH.$conf['data_location'].'tmp/autocomplete_variants.dat'; 212 $data = @unserialize( file_get_contents($file)); 213 if ($data === false) 214 return; 215 216 $rmap = $data['replace']; 217 $amap = $data['add']; 218 foreach ($expr->stokens as $token) 219 { 220 if (isset($token->scope) && !$token->scope->is_text) 221 continue; 222 if ($token->modifier & (QST_QUOTED|QST_WILDCARD)) 223 continue; 224 225 $all = array_merge( array($token->term), $token->variants); 226 227 $in = $all[0]; 228 $in_t = transliterate($in); 229 if (isset($rmap[$in_t])) 230 { 231 $all = $rmap[$in_t]; 232 foreach ($all as &$one) 233 { 234 if ('$i' == $one) 235 $one = $in; 236 } 237 unset($one); 238 } 239 240 $in_list = $processed = array(); 241 for ($i=0; $i<count($all); $i++) 242 { 243 $in = $all[$i]; 244 $in_t = transliterate($in); 245 246 if (isset($in_list[$in_t])) 247 { 248 array_splice($all, $i, 1); 249 $i--; 250 continue; 251 } 252 253 if (isset($processed[$in_t])) 254 continue; 255 $processed[$in_t] = 1; 256 257 if (isset($amap[$in_t])) 258 { 259 array_splice($all, $i, 0, $amap[$in_t]); 260 } 261 } 262 263 $token->term = array_shift($all); 264 $token->variants = $all; 265 } 206 266 } 207 267 ?>
Note: See TracChangeset
for help on using the changeset viewer.