phpdrupaldrupal-themingdrupal-8drupal-templates

Core search module, change markup


I want to remove the Search results string added in the search page from line 119 of core/modules/search/src/Controller\SearchController.php.

if (count($results)) {
  $build['search_results_title'] = array(
    '#markup' => '<h2>' . $this->t('Search results') . '</h2>',
  );
}

I am able to change the search form above and the result list using preprocess_form function on the search form and preprocess_search_result on the search results.

Is there a preprocess function I missed, or can I use a custom template file?


Solution

  • You have to alter the route defined by the search module. In order to do so:

    1. Define in your mymodule.services.yml file following:
    
        services:
          mymodule.route_subscriber:
          class: Drupal\mymodule\Routing\RouteSubscriber
          tags:
            - { name: event_subscriber }
    
    
    1. Create a class that extends the RouteSubscriberBase class on /mymodule/src/Routing/RouteSubscriber.php as following:
    <?php
        /**
         * @file
         * Contains \Drupal\mymodule\Routing\RouteSubscriber.
         */
        
        namespace Drupal\mymodule\Routing;
        
        use Drupal\Core\Routing\RouteSubscriberBase;
        use Symfony\Component\Routing\RouteCollection;
        
        /**
         * Listens to the dynamic route events.
         */
        class RouteSubscriber extends RouteSubscriberBase {
        
          /**
           * {@inheritdoc}
           */
          public function alterRoutes(RouteCollection $collection) {
            // Replace dynamically created "search.view_node_search" route's Controller
            // with our own.
            if ($route = $collection->get('search.view_node_search')) {
              $route->setDefault('_controller', '\Drupal\mymodule\Controller\MyModuleSearchController::view');
            }
          }
        }
    
    
    1. Finally, the controller itself located on /mymodule/src/Controller/MyModuleSearchController.php
    <?php
        namespace Drupal\mymodule\Controller;
        
        use Drupal\search\SearchPageInterface;
        use Symfony\Component\HttpFoundation\Request;
        use Drupal\search\Controller\SearchController;
        
        /**
         * Override the Route controller for search.
         */
        class MyModuleSearchController extends SearchController {
        
          /**
           * {@inheritdoc}
           */
          public function view(Request $request, SearchPageInterface $entity) {
            $build = parent::view($request, $entity);
            // Unset the Result title.
            if (isset($build['search_results_title'])) {
              unset($build['search_results_title']);
            }
        
            return $build;
          }
        
        }