diff options
Diffstat (limited to 'app/Http/Controllers/AutocompleteController.php')
| -rw-r--r-- | app/Http/Controllers/AutocompleteController.php | 507 |
1 files changed, 262 insertions, 245 deletions
diff --git a/app/Http/Controllers/AutocompleteController.php b/app/Http/Controllers/AutocompleteController.php index c4e15bc819..15072c7c95 100644 --- a/app/Http/Controllers/AutocompleteController.php +++ b/app/Http/Controllers/AutocompleteController.php @@ -33,292 +33,309 @@ use Symfony\Component\HttpFoundation\Request; /** * Controller for the autocomplete callbacks */ -class AutocompleteController extends AbstractBaseController { - /** - * Autocomplete for media folders. - * - * @param Request $request - * - * @return JsonResponse - */ - public function folder(Request $request): JsonResponse { - $tree = $request->attributes->get('tree'); - $query = $request->get('query', ''); - $folder = WT_DATA_DIR . $tree->getPreference('MEDIA_DIRECTORY', ''); - $flags = FilesystemIterator::FOLLOW_SYMLINKS; - $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($folder, $flags)); - $folders = []; +class AutocompleteController extends AbstractBaseController +{ + /** + * Autocomplete for media folders. + * + * @param Request $request + * + * @return JsonResponse + */ + public function folder(Request $request): JsonResponse + { + $tree = $request->attributes->get('tree'); + $query = $request->get('query', ''); + $folder = WT_DATA_DIR . $tree->getPreference('MEDIA_DIRECTORY', ''); + $flags = FilesystemIterator::FOLLOW_SYMLINKS; + $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($folder, $flags)); + $folders = []; - // Iterator finds media/foo/. but not media/foo ?? - foreach ($iterator as $iteration) { - if ($iteration->getFileName() === '.') { - $path = dirname(substr($iteration->getPathName(), strlen($folder))); - if ($query === '' || stripos($path, $query) !== false) { - $folders[] = ['value' => $path]; - } - } - } + // Iterator finds media/foo/. but not media/foo ?? + foreach ($iterator as $iteration) { + if ($iteration->getFileName() === '.') { + $path = dirname(substr($iteration->getPathName(), strlen($folder))); + if ($query === '' || stripos($path, $query) !== false) { + $folders[] = ['value' => $path]; + } + } + } - return new JsonResponse($folders); - } + return new JsonResponse($folders); + } - /** - * Autocomplete for source citations. - * - * @param Request $request - * - * @return JsonResponse - */ - public function page(Request $request): JsonResponse { - $tree = $request->attributes->get('tree'); - $query = $request->get('query', ''); - $xref = $request->get('extra', ''); + /** + * Autocomplete for source citations. + * + * @param Request $request + * + * @return JsonResponse + */ + public function page(Request $request): JsonResponse + { + $tree = $request->attributes->get('tree'); + $query = $request->get('query', ''); + $xref = $request->get('extra', ''); - $source = Source::getInstance($xref, $tree); + $source = Source::getInstance($xref, $tree); - $this->checkSourceAccess($source); + $this->checkSourceAccess($source); - $pages = []; + $pages = []; - // Escape the query for MySQL and PHP, converting spaces to wildcards. - $like_query = strtr($query, ['_' => '\\_', '%' => '\\%', ' ' => '%']); - $regex_query = preg_quote(strtr($query, [' ' => '.+']), '/'); + // Escape the query for MySQL and PHP, converting spaces to wildcards. + $like_query = strtr($query, [ + '_' => '\\_', + '%' => '\\%', + ' ' => '%', + ]); + $regex_query = preg_quote(strtr($query, [' ' => '.+']), '/'); - $regex_xref = preg_quote($xref, '/'); + $regex_xref = preg_quote($xref, '/'); - // Fetch all individuals with a link to this source - $rows = Database::prepare( - "SELECT i_id AS xref, i_gedcom AS gedcom" . - " FROM `##individuals`" . - " JOIN `##link ON i_file = l_file AND i_from = i_id AND i_to = :xref AND i_type = 'SOUR'" . - " WHERE i_gedcom LIKE CONCAT('%\n_ SOUR @', :xref, '@%', REPLACE(:term, ' ', '%'), '%')" . - " AND i_file = :tree_id" - )->execute([ - 'xref' => $xref, - 'term' => $like_query, - 'tree_id' => $tree->getTreeId(), - ])->fetchAll(); + // Fetch all individuals with a link to this source + $rows = Database::prepare( + "SELECT i_id AS xref, i_gedcom AS gedcom" . + " FROM `##individuals`" . + " JOIN `##link ON i_file = l_file AND i_from = i_id AND i_to = :xref AND i_type = 'SOUR'" . + " WHERE i_gedcom LIKE CONCAT('%\n_ SOUR @', :xref, '@%', REPLACE(:term, ' ', '%'), '%')" . + " AND i_file = :tree_id" + )->execute([ + 'xref' => $xref, + 'term' => $like_query, + 'tree_id' => $tree->getTreeId(), + ])->fetchAll(); - // Filter for privacy - foreach ($rows as $row) { - $individual = Individual::getInstance($row->xref, $tree, $row->gedcom); - if (preg_match('/\n1 SOUR @' . $regex_xref . '@(?:\n[2-9].*)*\n2 PAGE (.*' . $regex_query . '.*)/i', $individual->getGedcom(), $match)) { - $pages[] = $match[1]; - } - if (preg_match('/\n2 SOUR @' . $xref . '@(?:\n[3-9].*)*\n3 PAGE (.*' . $regex_query . '.*)/i', $individual->getGedcom(), $match)) { - $pages[] = $match[1]; - } - } - // Fetch all data, regardless of privacy - $rows = Database::prepare( - "SELECT f_id AS xref, f_gedcom AS gedcom" . - " FROM `##families`" . - " WHERE f_gedcom LIKE CONCAT('%\n_ SOUR @', :xref, '@%', REPLACE(:term, ' ', '%'), '%') AND f_file = :tree_id" - )->execute([ - 'xref' => $xref, - 'term' => $query, - 'tree_id' => $tree->getTreeId(), - ])->fetchAll(); - // Filter for privacy - foreach ($rows as $row) { - $family = Family::getInstance($row->xref, $tree, $row->gedcom); - if (preg_match('/\n1 SOUR @' . $xref . '@(?:\n[2-9].*)*\n2 PAGE (.*' . str_replace(' ', '.+', preg_quote($query, '/')) . '.*)/i', $family->getGedcom(), $match)) { - $pages[] = $match[1]; - } - if (preg_match('/\n2 SOUR @' . $xref . '@(?:\n[3-9].*)*\n3 PAGE (.*' . str_replace(' ', '.+', preg_quote($query, '/')) . '.*)/i', $family->getGedcom(), $match)) { - $pages[] = $match[1]; - } - } - // array_unique() converts the keys from integer to string, which breaks - // the JSON encoding - so need to call array_values() to convert them - // back into integers. - $pages = array_values(array_unique($pages)); - echo json_encode($pages); + // Filter for privacy + foreach ($rows as $row) { + $individual = Individual::getInstance($row->xref, $tree, $row->gedcom); + if (preg_match('/\n1 SOUR @' . $regex_xref . '@(?:\n[2-9].*)*\n2 PAGE (.*' . $regex_query . '.*)/i', $individual->getGedcom(), $match)) { + $pages[] = $match[1]; + } + if (preg_match('/\n2 SOUR @' . $xref . '@(?:\n[3-9].*)*\n3 PAGE (.*' . $regex_query . '.*)/i', $individual->getGedcom(), $match)) { + $pages[] = $match[1]; + } + } + // Fetch all data, regardless of privacy + $rows = Database::prepare( + "SELECT f_id AS xref, f_gedcom AS gedcom" . + " FROM `##families`" . + " WHERE f_gedcom LIKE CONCAT('%\n_ SOUR @', :xref, '@%', REPLACE(:term, ' ', '%'), '%') AND f_file = :tree_id" + )->execute([ + 'xref' => $xref, + 'term' => $query, + 'tree_id' => $tree->getTreeId(), + ])->fetchAll(); + // Filter for privacy + foreach ($rows as $row) { + $family = Family::getInstance($row->xref, $tree, $row->gedcom); + if (preg_match('/\n1 SOUR @' . $xref . '@(?:\n[2-9].*)*\n2 PAGE (.*' . str_replace(' ', '.+', preg_quote($query, '/')) . '.*)/i', $family->getGedcom(), $match)) { + $pages[] = $match[1]; + } + if (preg_match('/\n2 SOUR @' . $xref . '@(?:\n[3-9].*)*\n3 PAGE (.*' . str_replace(' ', '.+', preg_quote($query, '/')) . '.*)/i', $family->getGedcom(), $match)) { + $pages[] = $match[1]; + } + } + // array_unique() converts the keys from integer to string, which breaks + // the JSON encoding - so need to call array_values() to convert them + // back into integers. + $pages = array_values(array_unique($pages)); + echo json_encode($pages); - return new JsonResponse($pages); - } + return new JsonResponse($pages); + } - /** - * - * /** - * Autocomplete for place names. - * - * @param Request $request - * - * @return JsonResponse - */ - public function place(Request $request): JsonResponse { - $tree = $request->attributes->get('tree'); - $query = $request->get('query'); - $data = []; + /** + * + * /** + * Autocomplete for place names. + * + * @param Request $request + * + * @return JsonResponse + */ + public function place(Request $request): JsonResponse + { + $tree = $request->attributes->get('tree'); + $query = $request->get('query'); + $data = []; - foreach (Place::findPlaces($query, $tree) as $place) { - $data[] = ['value' => $place->getGedcomName()]; - } + foreach (Place::findPlaces($query, $tree) as $place) { + $data[] = ['value' => $place->getGedcomName()]; + } - if (empty($data) && $tree->getPreference('GEONAMES_ACCOUNT')) { - // No place found? Use an external gazetteer - $url = - "http://api.geonames.org/searchJSON" . - "?name_startsWith=" . urlencode($query) . - "&lang=" . WT_LOCALE . - "&fcode=CMTY&fcode=ADM4&fcode=PPL&fcode=PPLA&fcode=PPLC" . - "&style=full" . - "&username=" . $tree->getPreference('GEONAMES_ACCOUNT'); + if (empty($data) && $tree->getPreference('GEONAMES_ACCOUNT')) { + // No place found? Use an external gazetteer + $url = + "http://api.geonames.org/searchJSON" . + "?name_startsWith=" . urlencode($query) . + "&lang=" . WT_LOCALE . + "&fcode=CMTY&fcode=ADM4&fcode=PPL&fcode=PPLA&fcode=PPLC" . + "&style=full" . + "&username=" . $tree->getPreference('GEONAMES_ACCOUNT'); - // try to use curl when file_get_contents not allowed - if (ini_get('allow_url_fopen')) { - $json = file_get_contents($url); - } elseif (function_exists('curl_init')) { - $ch = curl_init(); - curl_setopt($ch, CURLOPT_URL, $url); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); - $json = curl_exec($ch); - curl_close($ch); - } else { - return new JsonResponse([]); - } + // try to use curl when file_get_contents not allowed + if (ini_get('allow_url_fopen')) { + $json = file_get_contents($url); + } elseif (function_exists('curl_init')) { + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + $json = curl_exec($ch); + curl_close($ch); + } else { + return new JsonResponse([]); + } - $places = json_decode($json, true); - if (isset($places['geonames']) && is_array($places['geonames'])) { - foreach ($places['geonames'] as $k => $place) { - $data[] = ['value' => $place['name'] . ', ' . $place['adminName2'] . ', ' . $place['adminName1'] . ', ' . $place['countryName']]; - } - } - } + $places = json_decode($json, true); + if (isset($places['geonames']) && is_array($places['geonames'])) { + foreach ($places['geonames'] as $k => $place) { + $data[] = ['value' => $place['name'] . ', ' . $place['adminName2'] . ', ' . $place['adminName1'] . ', ' . $place['countryName']]; + } + } + } - return new JsonResponse($data); - } + return new JsonResponse($data); + } - /** - * @param Request $request - * - * @return JsonResponse - */ - public function select2Family(Request $request): JsonResponse { - /** @var Tree $tree */ - $tree = $request->attributes->get('tree'); + /** + * @param Request $request + * + * @return JsonResponse + */ + public function select2Family(Request $request): JsonResponse + { + /** @var Tree $tree */ + $tree = $request->attributes->get('tree'); - $page = (int) $request->get('page'); - $query = $request->get('q'); + $page = (int)$request->get('page'); + $query = $request->get('q'); - return new JsonResponse(Select2::familySearch($tree, $page, $query)); - } + return new JsonResponse(Select2::familySearch($tree, $page, $query)); + } - /** - * @param Request $request - * - * @return JsonResponse - */ - public function select2Flag(Request $request): JsonResponse { - $page = $request->get('page'); - $query = (int) $request->get('q'); + /** + * @param Request $request + * + * @return JsonResponse + */ + public function select2Flag(Request $request): JsonResponse + { + $page = $request->get('page'); + $query = (int)$request->get('q'); - return new JsonResponse(Select2::flagSearch($page, $query)); - } + return new JsonResponse(Select2::flagSearch($page, $query)); + } - /** - * @param Request $request - * - * @return JsonResponse - */ - public function select2Individual(Request $request): JsonResponse { - /** @var Tree $tree */ - $tree = $request->attributes->get('tree'); + /** + * @param Request $request + * + * @return JsonResponse + */ + public function select2Individual(Request $request): JsonResponse + { + /** @var Tree $tree */ + $tree = $request->attributes->get('tree'); - $page = (int) $request->get('page'); - $query = $request->get('q'); + $page = (int)$request->get('page'); + $query = $request->get('q'); - return new JsonResponse(Select2::individualSearch($tree, $page, $query)); - } + return new JsonResponse(Select2::individualSearch($tree, $page, $query)); + } - /** - * @param Request $request - * - * @return JsonResponse - */ - public function select2Media(Request $request): JsonResponse { - /** @var Tree $tree */ - $tree = $request->attributes->get('tree'); + /** + * @param Request $request + * + * @return JsonResponse + */ + public function select2Media(Request $request): JsonResponse + { + /** @var Tree $tree */ + $tree = $request->attributes->get('tree'); - $page = (int) $request->get('page'); - $query = $request->get('q'); + $page = (int)$request->get('page'); + $query = $request->get('q'); - return new JsonResponse(Select2::mediaObjectSearch($tree, $page, $query)); - } + return new JsonResponse(Select2::mediaObjectSearch($tree, $page, $query)); + } - /** - * @param Request $request - * - * @return JsonResponse - */ - public function select2Note(Request $request): JsonResponse { - /** @var Tree $tree */ - $tree = $request->attributes->get('tree'); + /** + * @param Request $request + * + * @return JsonResponse + */ + public function select2Note(Request $request): JsonResponse + { + /** @var Tree $tree */ + $tree = $request->attributes->get('tree'); - $page = (int) $request->get('page'); - $query = $request->get('q'); + $page = (int)$request->get('page'); + $query = $request->get('q'); - return new JsonResponse(Select2::noteSearch($tree, $page, $query)); - } + return new JsonResponse(Select2::noteSearch($tree, $page, $query)); + } - /** - * @param Request $request - * - * @return JsonResponse - */ - public function select2Place(Request $request): JsonResponse { - /** @var Tree $tree */ - $tree = $request->attributes->get('tree'); + /** + * @param Request $request + * + * @return JsonResponse + */ + public function select2Place(Request $request): JsonResponse + { + /** @var Tree $tree */ + $tree = $request->attributes->get('tree'); - $page = (int) $request->get('page'); - $query = $request->get('q'); + $page = (int)$request->get('page'); + $query = $request->get('q'); - return new JsonResponse(Select2::placeSearch($tree, $page, $query, true)); - } + return new JsonResponse(Select2::placeSearch($tree, $page, $query, true)); + } - /** - * @param Request $request - * - * @return JsonResponse - */ - public function select2Repository(Request $request): JsonResponse { - /** @var Tree $tree */ - $tree = $request->attributes->get('tree'); + /** + * @param Request $request + * + * @return JsonResponse + */ + public function select2Repository(Request $request): JsonResponse + { + /** @var Tree $tree */ + $tree = $request->attributes->get('tree'); - $page = (int) $request->get('page'); - $query = $request->get('q'); + $page = (int)$request->get('page'); + $query = $request->get('q'); - return new JsonResponse(Select2::repositorySearch($tree, $page, $query)); - } + return new JsonResponse(Select2::repositorySearch($tree, $page, $query)); + } - /** - * @param Request $request - * - * @return JsonResponse - */ - public function select2Source(Request $request): JsonResponse { - /** @var Tree $tree */ - $tree = $request->attributes->get('tree'); + /** + * @param Request $request + * + * @return JsonResponse + */ + public function select2Source(Request $request): JsonResponse + { + /** @var Tree $tree */ + $tree = $request->attributes->get('tree'); - $page = (int) $request->get('page'); - $query = $request->get('q'); + $page = (int)$request->get('page'); + $query = $request->get('q'); - return new JsonResponse(Select2::sourceSearch($tree, $page, $query)); - } + return new JsonResponse(Select2::sourceSearch($tree, $page, $query)); + } - /** - * @param Request $request - * - * @return JsonResponse - */ - public function select2Submitter(Request $request): JsonResponse { - /** @var Tree $tree */ - $tree = $request->attributes->get('tree'); + /** + * @param Request $request + * + * @return JsonResponse + */ + public function select2Submitter(Request $request): JsonResponse + { + /** @var Tree $tree */ + $tree = $request->attributes->get('tree'); - $page = (int) $request->get('page'); - $query = $request->get('q'); + $page = (int)$request->get('page'); + $query = $request->get('q'); - return new JsonResponse(Select2::submitterSearch($tree, $page, $query)); - } + return new JsonResponse(Select2::submitterSearch($tree, $page, $query)); + } } |
