3 namespace Drupal\search\Controller;
5 use Drupal\Core\Cache\CacheableDependencyInterface;
6 use Drupal\Core\Controller\ControllerBase;
7 use Drupal\Core\Render\RendererInterface;
8 use Drupal\search\SearchPageInterface;
9 use Drupal\search\SearchPageRepositoryInterface;
10 use Symfony\Component\DependencyInjection\ContainerInterface;
11 use Symfony\Component\HttpFoundation\Request;
14 * Route controller for search.
16 class SearchController extends ControllerBase {
19 * The search page repository.
21 * @var \Drupal\search\SearchPageRepositoryInterface
23 protected $searchPageRepository;
28 * @var \Psr\Log\LoggerInterface
35 * @var \Drupal\Core\Render\RendererInterface
40 * Constructs a new search controller.
42 * @param \Drupal\search\SearchPageRepositoryInterface $search_page_repository
43 * The search page repository.
44 * @param \Drupal\Core\Render\RendererInterface $renderer
47 public function __construct(SearchPageRepositoryInterface $search_page_repository, RendererInterface $renderer) {
48 $this->searchPageRepository = $search_page_repository;
49 $this->logger = $this->getLogger('search');
50 $this->renderer = $renderer;
56 public static function create(ContainerInterface $container) {
58 $container->get('search.search_page_repository'),
59 $container->get('renderer')
64 * Creates a render array for the search page.
66 * @param \Symfony\Component\HttpFoundation\Request $request
68 * @param \Drupal\search\SearchPageInterface $entity
69 * The search page entity.
72 * The search form and search results build array.
74 public function view(Request $request, SearchPageInterface $entity) {
76 $plugin = $entity->getPlugin();
78 // Build the form first, because it may redirect during the submit,
79 // and we don't want to build the results based on last time's request.
80 $build['#cache']['contexts'][] = 'url.query_args:keys';
81 if ($request->query->has('keys')) {
82 $keys = trim($request->query->get('keys'));
83 $plugin->setSearch($keys, $request->query->all(), $request->attributes->all());
86 $build['#title'] = $plugin->suggestedTitle();
87 $build['search_form'] = $this->entityFormBuilder()->getForm($entity, 'search');
89 // Build search results, if keywords or other search parameters are in the
90 // GET parameters. Note that we need to try the search if 'keys' is in
91 // there at all, vs. being empty, due to advanced search.
93 if ($request->query->has('keys')) {
94 if ($plugin->isSearchExecutable()) {
96 if ($this->config('search.settings')->get('logging')) {
97 $this->logger->notice('Searched %type for %keys.', ['%keys' => $keys, '%type' => $entity->label()]);
100 // Collect the search results.
101 $results = $plugin->buildResults();
104 // The search not being executable means that no keywords or other
105 // conditions were entered.
106 drupal_set_message($this->t('Please enter some keywords.'), 'error');
110 if (count($results)) {
111 $build['search_results_title'] = [
112 '#markup' => '<h2>' . $this->t('Search results') . '</h2>',
116 $build['search_results'] = [
117 '#theme' => ['item_list__search_results__' . $plugin->getPluginId(), 'item_list__search_results'],
118 '#items' => $results,
120 '#markup' => '<h3>' . $this->t('Your search yielded no results.') . '</h3>',
122 '#list_type' => 'ol',
124 'plugin' => $plugin->getPluginId(),
128 $this->renderer->addCacheableDependency($build, $entity);
129 if ($plugin instanceof CacheableDependencyInterface) {
130 $this->renderer->addCacheableDependency($build, $plugin);
133 // If this plugin uses a search index, then also add the cache tag tracking
134 // that search index, so that cached search result pages are invalidated
136 if ($plugin->getType()) {
137 $build['search_results']['#cache']['tags'][] = 'search_index';
138 $build['search_results']['#cache']['tags'][] = 'search_index:' . $plugin->getType();
149 * Creates a render array for the search help page.
151 * @param \Symfony\Component\HttpFoundation\Request $request
152 * The request object.
153 * @param \Drupal\search\SearchPageInterface $entity
154 * The search page entity.
157 * The search help page.
159 public function searchHelp(SearchPageInterface $entity) {
162 $build['search_help'] = $entity->getPlugin()->getHelp();
168 * Redirects to a search page.
170 * This is used to redirect from /search to the default search page.
172 * @param \Drupal\search\SearchPageInterface $entity
173 * The search page entity.
175 * @return \Symfony\Component\HttpFoundation\RedirectResponse
176 * A redirect to the search page.
178 public function redirectSearchPage(SearchPageInterface $entity) {
179 return $this->redirect('search.view_' . $entity->id());
183 * Route title callback.
185 * @param \Drupal\search\SearchPageInterface $search_page
186 * The search page entity.
189 * The title for the search page edit form.
191 public function editTitle(SearchPageInterface $search_page) {
192 return $this->t('Edit %label search page', ['%label' => $search_page->label()]);
196 * Performs an operation on the search page entity.
198 * @param \Drupal\search\SearchPageInterface $search_page
199 * The search page entity.
201 * The operation to perform, usually 'enable' or 'disable'.
203 * @return \Symfony\Component\HttpFoundation\RedirectResponse
204 * A redirect back to the search settings page.
206 public function performOperation(SearchPageInterface $search_page, $op) {
207 $search_page->$op()->save();
209 if ($op == 'enable') {
210 drupal_set_message($this->t('The %label search page has been enabled.', ['%label' => $search_page->label()]));
212 elseif ($op == 'disable') {
213 drupal_set_message($this->t('The %label search page has been disabled.', ['%label' => $search_page->label()]));
216 $url = $search_page->urlInfo('collection');
217 return $this->redirect($url->getRouteName(), $url->getRouteParameters(), $url->getOptions());
221 * Sets the search page as the default.
223 * @param \Drupal\search\SearchPageInterface $search_page
224 * The search page entity.
226 * @return \Symfony\Component\HttpFoundation\RedirectResponse
227 * A redirect to the search settings page.
229 public function setAsDefault(SearchPageInterface $search_page) {
230 // Set the default page to this search page.
231 $this->searchPageRepository->setDefaultSearchPage($search_page);
233 drupal_set_message($this->t('The default search page is now %label. Be sure to check the ordering of your search pages.', ['%label' => $search_page->label()]));
234 return $this->redirect('entity.search_page.collection');