source: extensions/rv_autocomplete/admin/functions.inc.php @ 28153

Last change on this file since 28153 was 28153, checked in by rvelices, 10 years ago

autocomplete allows synonims / misspellings, etc ...

File size: 8.2 KB
Line 
1<?php
2
3function rvac_invalidate_cache()
4{
5        global $conf;
6        conf_update_param('rvac_version', ++$conf['rvac_version'] );
7        if (rand()%10==0)
8        {
9                foreach (glob(PHPWG_ROOT_PATH.PWG_COMBINED_DIR.'acds-*.js') as $file)
10                        @unlink($file);
11        }
12}
13
14function rvac_custom_link(&$suggestion, $roots)
15{
16        $url = $suggestion['url'];
17        if (empty($url))
18        {
19                $q = $suggestion['name'];
20                if ( ($pos=strpos($q,'\\')) !== false )
21                {
22                        $q = substr($q, 0, $pos);
23                }
24        }
25        elseif (strncmp($url,'q=',2)==0)
26        {
27                $q = substr($url,2);
28        }
29        else
30        {
31                foreach( $roots as $k => $root)
32                        $url = str_replace('$'.$k.'/', $root, $url);
33        }
34
35        if (isset($q))
36        {
37                if ( ($pos=strpos($q,' ')) !== false )
38                {
39                        $q = '"'.$q.'"';
40                }
41                $url = get_root_url().'qsearch.php?q='.rawurlencode($q);
42        }
43
44        $suggestion['U_LINK'] = $url;
45        return $suggestion;
46}
47
48function rvac_ws_add_methods($srv_arr)
49{
50        global $conf;
51        $srv = $srv_arr[0];
52        include_once( dirname(__FILE__).'/../functions.inc.php' );
53        $srv->addMethod('rvac.addCustom', 'rv_ac_ws_add_custom_suggestion',
54                array(
55                        'name' => array(),
56                        'counter' => array('default'=>0),
57                        'url' => array('default'=>''),
58                        'level' => array('default'=>min($conf['available_permission_levels']), 'maxValue'=>max($conf['available_permission_levels']),'type'=>WS_TYPE_INT|WS_TYPE_POSITIVE),
59                ),
60                '','', array('admin_only'=>true, 'post_only'=>true));
61
62        $srv->addMethod('rvac.modCustom', 'rv_ac_ws_mod_custom_suggestion',
63                array(
64                        'id' => array(),
65                        'name' => array('flags' => WS_PARAM_OPTIONAL),
66                        'counter' => array('flags' => WS_PARAM_OPTIONAL),
67                        'url' => array('flags' => WS_PARAM_OPTIONAL),
68                        'level' => array('flags' => WS_PARAM_OPTIONAL, 'maxValue'=>max($conf['available_permission_levels']),'type'=>WS_TYPE_INT|WS_TYPE_POSITIVE),
69                ),
70                '','', array('admin_only'=>true, 'post_only'=>true));
71
72        $srv->addMethod('rvac.delCustom', 'rv_ac_ws_del_custom_suggestion',
73                array('id'),
74                '','', array('admin_only'=>true, 'post_only'=>true));
75
76
77        $srv->addMethod('rvac.addVariant', 'rv_ac_ws_add_variant',
78                array(
79                        'in' => array(),
80                        'type' => array(),
81                        'out' => array(),
82                        'comment' => array('flags' => WS_PARAM_OPTIONAL),
83                ),
84                '','', array('admin_only'=>true, 'post_only'=>true));
85
86        $srv->addMethod('rvac.modVariant', 'rv_ac_ws_mod_variant',
87                array(
88                        'key' => array(),
89                        'in' => array(),
90                        'type' => array(),
91                        'out' => array(),
92                        'comment' => array('flags' => WS_PARAM_OPTIONAL),
93                ),
94                '','', array('admin_only'=>true, 'post_only'=>true));
95
96        $srv->addMethod('rvac.delVariant', 'rv_ac_ws_del_variant',
97                array(
98                        'key' => array(),
99                ),
100                '','', array('admin_only'=>true, 'post_only'=>true));
101
102}
103
104function rv_ac_ws_add_custom_suggestion($params, $service)
105{
106        $name = trim($params['name']);
107        if (empty($name))
108                return new PwgError(400, 'Bad name');
109
110        $insert = array('name'=>$name);
111
112        if (isset($params['counter']))
113                $insert['counter'] = intval($params['counter']);
114        if ( !empty($params['url']) )
115                $insert['url'] = $params['url'];
116        if ( isset($params['level']) )
117                $insert['level'] = $params['level'];
118
119        mass_inserts(RVAC_SUGGESTIONS, array_keys($insert), array($insert));
120        $id =  pwg_db_insert_id(RVAC_SUGGESTIONS);
121
122        rvac_invalidate_cache();
123        $row = pwg_db_fetch_assoc( pwg_query('SELECT * FROM '.RVAC_SUGGESTIONS.' WHERE id='.$id) );
124        rvac_custom_link($row, rvac_get_url_roots());
125        return $row;
126}
127
128function rv_ac_ws_mod_custom_suggestion($params, $service)
129{
130        $id = intval($params['id']);
131        $update = array();
132
133        if (!empty($params['name']))
134                $update['name'] = $params['name'];
135        if (isset($params['counter']))
136                $update['counter'] = intval($params['counter']);
137        if (isset($params['url']))
138                $update['url'] = $params['url'];
139        if ( isset($params['level']) )
140                $update['level'] = $params['level'];
141
142        single_update(RVAC_SUGGESTIONS,
143                $update,
144                array('id' => $id)
145                );
146        $changes = pwg_db_changes();
147
148        if ($changes)
149                rvac_invalidate_cache();
150
151        $row = pwg_db_fetch_assoc( pwg_query('SELECT * FROM '.RVAC_SUGGESTIONS.' WHERE id='.$id) );
152        rvac_custom_link($row, rvac_get_url_roots());
153        return $row;
154}
155
156function rv_ac_ws_del_custom_suggestion($params, $service)
157{
158        $id = intval($params['id']);
159        $q = 'DELETE FROM '.RVAC_SUGGESTIONS.' WHERE id='.$id;
160        pwg_query($q);
161        $changes = pwg_db_changes();
162        if ($changes)
163                rvac_invalidate_cache();
164        return $changes;
165}
166
167
168
169
170function rvac_load_variant_rules()
171{
172        global $conf;
173        $file=PHPWG_ROOT_PATH.$conf['data_location'].'plugins/autocomplete_variants.dat';
174
175        $data = @unserialize( file_get_contents($file));
176        if ($data === false)
177                return array();
178        return $data;
179}
180
181function rvac_save_variant_rules($rules, $callback = null)
182{
183        global $conf;
184        $file=PHPWG_ROOT_PATH.$conf['data_location'].'plugins/autocomplete_variants.dat';
185        $save = serialize($rules);
186        if (@file_put_contents($file, $save)===false)
187        {
188                mkgetdir(dirname($file));
189                file_put_contents($file, $save);
190        }
191
192        $rmap = $amap = array();
193        foreach($rules as $rule)
194        {
195                foreach($rule['in'] as $in_word)
196                {
197                        $in_word_t = transliterate($in_word);
198                        $results = $rule['out'];
199                        $processed = array();
200                        for ($i=0; $i<count($results); $i++)
201                        {
202                                $outkey = $results[$i] == '$i' ? $in_word_t : transliterate($results[$i]);
203                                if (isset($processed[$outkey]))
204                                {
205                                        array_splice($results, $i, 1);
206                                        $i--;
207                                        continue;
208                                }
209                                $processed[$outkey] = 1;
210
211                                if ('$a' == $results[$i])
212                                {
213                                        array_splice($results, $i, 1, $rule['in']);
214                                        $i--;
215                                }
216                        }
217
218                        if ('r' == $rule['type'])
219                        {
220                                if (isset($rmap[$in_word_t]))
221                                {
222                                        if ($callback) $callback( array(
223                                                'word' => $in_word,
224                                                'wordt' => $in_word_t,
225                                                'msg' => ' defined as input several times in replace rules'
226                                        ));
227                                }
228                                else
229                                        $rmap[$in_word_t] = $results;
230                        }
231                        else
232                        {
233                                $results = array_diff($results, array($in_word,$in_word_t, '$i'));
234                                if (isset($amap[$in_word_t]))
235                                        $results = array_unique( array_merge($amap[$in_word_t], $results));
236                                $amap[$in_word_t] = $results;
237                        }
238                }
239        }
240
241        $file=PHPWG_ROOT_PATH.$conf['data_location'].'tmp/autocomplete_variants.dat';
242        $res = array('replace' => $rmap, 'add' => $amap );
243        $save = serialize($res);
244        if (@file_put_contents($file, $save)===false)
245        {
246                mkgetdir(dirname($file));
247                file_put_contents($file, $save);
248        }
249        @file_put_contents($file.'.txt', var_export($res,true) );
250}
251
252function rv_ac_ws_add_variant($params, $service)
253{
254        return rvac_ws_add_or_mod_variant($params, true);
255}
256
257function rv_ac_ws_mod_variant($params, $service)
258{
259        return rvac_ws_add_or_mod_variant($params, false);
260}
261
262function rvac_ws_add_or_mod_variant($params, $is_add)
263{
264        $rules = rvac_load_variant_rules();
265
266        foreach( array('in', 'out') as $i => $name)
267        {
268                $arr = preg_split("/[\n,]+/", stripslashes($params[$name]) );
269                $arr = array_map('trim', $arr);
270                $arr = array_values( array_filter($arr, function($word) {
271                        return strlen($word)>0;
272                }) );
273                $arr = array_unique($arr);
274                $$name = $arr;
275        }
276        if (empty($in))
277                return new PwgError(WS_ERR_INVALID_PARAM, 'input word list empty');
278        if (empty($out))
279                return new PwgError(WS_ERR_INVALID_PARAM, 'output word list empty');
280
281        $in_trans = array_map('transliterate', $in);
282        sort($in_trans);
283        $key = implode(',', $in_trans);
284        if (strlen($key)>16)
285                $key = md5($key);
286
287        $type = $params['type'];
288        if ($type!='r' && $type!='a')
289                return new PwgError(WS_ERR_INVALID_PARAM, 'type');
290
291        if ($is_add)
292        {
293                if (isset($rules[$key]))
294                        return new PwgError(WS_ERR_INVALID_PARAM, 'list already defined');
295        }
296        else
297        {
298                $okey = $params['key'];
299                if (!isset($rules[$okey]))
300                        return new PwgError(WS_ERR_INVALID_PARAM, 'no rule to update');
301                unset($rules[$okey]);
302        }
303
304        $rule = array(
305                'in' => $in,
306                'type' => $type,
307                'out' => $out,
308        );
309        if (!empty($params['comment']))
310                $rule['comment'] = $params['comment'];
311        $rules[$key] = $rule;
312
313        $messages = array();
314        $callback = function($params) use($in_trans, &$messages) {
315                if (isset($params['word_t']))
316                {
317                        if (in_array($in_trans, $word_t))
318                                $messages[] = $params['word'].' '.$params['msg'];
319                }
320                else
321                        $messages[] = $params['msg'];
322        };
323
324        rvac_save_variant_rules($rules, $callback);
325        $rule['key'] = $key;
326        return array(
327                'messages' => $messages,
328                'rule' => $rule,
329        );
330}
331
332function rv_ac_ws_del_variant($params, $service)
333{
334        $rules = rvac_load_variant_rules();
335
336        $key = $params['key'];
337        if (empty($key))
338                return new PwgError(WS_ERR_INVALID_PARAM, 'empty key');
339
340        if (!isset($rules[$key]))
341                return true;
342
343        unset($rules[$key]);
344
345        rvac_save_variant_rules($rules);
346}
347?>
Note: See TracBrowser for help on using the repository browser.