1<?php
2
3/**
4 * The Ajax driven response page.
5 *
6 * This Source Code Form is subject to the terms of the Mozilla Public License,
7 * v. 2.0. If a copy of the MPL was not distributed with this file, You can
8 * obtain one at http://mozilla.org/MPL/2.0/.
9 *
10 * @package phpMyFAQ
11 * @author Thorsten Rinne <thorsten@phpmyfaq.de>
12 * @copyright 2007-2020 phpMyFAQ Team
13 * @license http://www.mozilla.org/MPL/2.0/ Mozilla Public License Version 2.0
14 * @link https://www.phpmyfaq.de
15 * @since 2007-03-27
16 */
17
18use phpMyFAQ\Category;
19use phpMyFAQ\Faq;
20use phpMyFAQ\Filter;
21use phpMyFAQ\Helper\HttpHelper;
22use phpMyFAQ\Helper\SearchHelper;
23use phpMyFAQ\Language;
24use phpMyFAQ\Language\Plurals;
25use phpMyFAQ\Permission\MediumPermission;
26use phpMyFAQ\Search;
27use phpMyFAQ\Search\SearchResultSet;
28use phpMyFAQ\Strings;
29use phpMyFAQ\User\CurrentUser;
30
31define('IS_VALID_PHPMYFAQ', null);
32
33//
34// Prepend and start the PHP session
35//
36require 'src/Bootstrap.php';
37
38$searchString = Filter::filterInput(INPUT_GET, 'search', FILTER_SANITIZE_STRIPPED);
39$ajaxLanguage = Filter::filterInput(INPUT_POST, 'ajaxlanguage', FILTER_SANITIZE_STRING, 'en');
40$categoryId = Filter::filterInput(INPUT_GET, 'searchcategory', FILTER_VALIDATE_INT, '%');
41
42$language = new Language($faqConfig);
43$languageCode = $language->setLanguage(
44    $faqConfig->get('main.languageDetection'),
45    $faqConfig->get('main.language')
46);
47$faqConfig->setLanguage($language);
48
49require_once 'lang/language_en.php';
50
51if (Language::isASupportedLanguage($ajaxLanguage)) {
52    $languageCode = trim($ajaxLanguage);
53    require_once 'lang/language_' . $languageCode . '.php';
54} else {
55    $languageCode = 'en';
56    require_once 'lang/language_en.php';
57}
58
59//Load plurals support for selected language
60$plr = new Plurals($PMF_LANG);
61
62//
63// Initializing static string wrapper
64//
65Strings::init($languageCode);
66
67//
68// Get current user and group id - default: -1
69//
70$user = CurrentUser::getFromCookie($faqConfig);
71if (!$user instanceof CurrentUser) {
72    $user = CurrentUser::getFromSession($faqConfig);
73}
74if (isset($user) && is_object($user)) {
75    $currentUser = $user->getUserId();
76    if ($user->perm instanceof MediumPermission) {
77        $currentGroups = $user->perm->getUserGroups($currentUser);
78    } else {
79        $currentGroups = [-1];
80    }
81    if (0 == count($currentGroups)) {
82        $currentGroups = [-1];
83    }
84} else {
85    $user = new CurrentUser($faqConfig);
86    $currentUser = -1;
87    $currentGroups = [-1];
88}
89
90$category = new Category($faqConfig, $currentGroups);
91$category->setUser($currentUser);
92$category->setGroups($currentGroups);
93$category->transform(0);
94$category->buildTree();
95
96$faq = new Faq($faqConfig);
97$faqSearch = new Search($faqConfig);
98$faqSearchResult = new SearchResultSet($user, $faq, $faqConfig);
99
100//
101// Send headers
102//
103$http = new HttpHelper();
104$http->setContentType('application/json');
105$http->addHeader();
106
107//
108// Handle the search requests
109//
110if (!is_null($searchString)) {
111    $faqSearch->setCategory($category);
112
113    $searchResult = $faqSearch->autoComplete($searchString);
114    $faqSearchResult->reviewResultSet($searchResult);
115
116    $faqSearchHelper = new SearchHelper($faqConfig);
117    $faqSearchHelper->setSearchTerm($searchString);
118    $faqSearchHelper->setCategory($category);
119    $faqSearchHelper->setPlurals($plr);
120
121    $http->sendWithHeaders($faqSearchHelper->renderInstantResponseResult($faqSearchResult));
122}
123