function handler_autocomplete($page, $type = null, $sub_id = null) { // Autocompletion : according to type required, return // a list of results matching with the number of matches. // The output format is : // result1|nb1 // result2|nb2 // ... pl_content_headers("text/plain"); $q = preg_replace(array('/\\*+$/', '/([\\^\\$\\[\\]])/', '/\\*/'), array('', '\\\\\\1', '.*'), Get::t('term')); if (!$q) { exit; } if (!is_null($sub_id)) { $query = $q . "\t" . $sub_id; } else { $query = $q; } // Try to look in cached results. $cached = false; $cache = XDB::query('SELECT result FROM search_autocomplete WHERE name = {?} AND query = {?} AND generated > NOW() - INTERVAL 1 DAY', $type, $query); if ($cache->numRows() > 0) { $cached = true; $data = explode("\n", $cache->fetchOneCell()); $list = array(); foreach ($data as $line) { if ($line != '') { $aux = explode("\t", $line); $item = array('field' => $aux[0], 'nb' => $aux[1], 'id' => $aux[2]); $item['value'] = self::format_autocomplete($item); array_push($list, $item); } } } else { $enums = array('binet_text' => DirEnum::BINETS, 'groupex_text' => DirEnum::GROUPESX, 'section_text' => DirEnum::SECTIONS, 'networking_type_text' => DirEnum::NETWORKS, 'locality_text' => DirEnum::LOCALITIES, 'country_text' => DirEnum::COUNTRIES, 'entreprise' => DirEnum::COMPANIES, 'jobterm_text' => DirEnum::JOBTERMS, 'description' => DirEnum::JOBDESCRIPTION, 'nationalite_text' => DirEnum::NATIONALITIES, 'school_text' => DirEnum::EDUSCHOOLS); if (!array_key_exists($type, $enums)) { exit; } if (is_null($sub_id)) { $list = DirEnum::getAutoComplete($enums[$type], $q); } else { $list = DirEnum::getAutoComplete($enums[$type], $q, $sub_id); } $to_cache = ''; foreach ($list as &$item) { $to_cache .= $item['field'] . "\t" . $item['nb'] . "\t" . $item['id'] . "\n"; $item['value'] = self::format_autocomplete($item); } } $count = count($list); if ($count == DirEnumeration::AUTOCOMPLETE_LIMIT) { $list[] = array('value' => '…', 'field' => '', 'nb' => 0, 'id' => -1); } elseif ($count == 0) { $list[] = array('value' => 'Aucun camarade trouvé pour ' . $q . '.', 'field' => '', 'nb' => 0, 'id' => -1); } if (!$cached) { XDB::query('INSERT INTO search_autocomplete (name, query, result, generated) VALUES ({?}, {?}, {?}, NOW()) ON DUPLICATE KEY UPDATE result = VALUES(result), generated = VALUES(generated)', $type, $query, $to_cache); } echo json_encode($list); exit; }