4

How do I change this markup from my .theme file?

Line 119 and following in core/modules/search/src/Controller/SearchController.php contain this code.

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

I want to remove the <h2> tags from my search page.

I am able to change the search form above, and the result list after that tag using hook_preprocess_form()on the search form and hook_preprocess_search_result() on the search results.

Is there a preprocess function I am missing, or can I use a custom template?

2 Answers 2

2

This answer has already been answered on Core search module, change markup. This is what the accepted answer for that question says.

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:
/**
 * @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');
    }
  }

}

3. 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;
  }
  
}
1
  • JFK: Thank you so much! You saved me many hours Jan 7, 2021 at 3:49
-2

I had a similar problem wherein i had to hide the Search Results H2 tag entirely.

I could manage to do it with Jquery with the below code :

$('h2:contains("Search results")').css("display", "none");

Not the answer you're looking for? Browse other questions tagged or ask your own question.