Supprimer le lien "Rechercher dans l'aide" sur la page de recherche

Posté le: jeu 25/10/2018 - 12:33 Par: rcowebdev
Route subscriber

 

J'avoue que je n'ai pas trouvé de meilleurs solutions que de surcharger le Controller qui s'occupe des résultats de la recherche, je trouve ça quand même bizarre de sortir l'artillerie lourde pour si peu mais bon, cela permet de se familiariser avec les Routes Subscriber.

Dans tous les cas, il nous faut un module ! Je vais partir du module BasicStructure présenté dans le dossier sur la création de module sur DRUPAL 8 et le renommer forms_overwrite.

La structure est la suivante

/root
-- modules
---- custom
------ forms_overwrite
--------- src
----------- Routing
------------- RouteSubscriber.php
----------- Controller
------------- ResultSearchController.php
-------- forms_overwrite.info.yml
-------- forms_overwrite.services.yml

RouteSubscriber.php

<?php
/**
 * @file
 * Contains \Drupal\forms_overwrite\Routing\RouteSubscriber.
 */

namespace Drupal\forms_overwrite\Routing;

use Drupal\Core\Routing\RouteSubscriberBase;
use Symfony\Component\Routing\RouteCollection;

/**
 * Listens to the dynamic route events.
 */
class RouteSubscriber extends RouteSubscriberBase {

    /**
     * {@inheritdoc}
     */
    protected function alterRoutes(RouteCollection $collection) {
        if ($route = $collection->get('search.view_node_search')) {
            $route->setDefault('_controller', '\Drupal\forms_overwrite\Controller\ResultSearchController::view');
        }
    }
}
Bien noter l'appel static à la méthode view sinon le controller ne sera pas reconnu.
Attention, l'installation du module search_exclude n'est pas compatible avec le module ci-dessus. Pas de soucis, il suffit de modifier le fichier RouteSubscriber
    protected function alterRoutes(RouteCollection $collection) {
        $route = $collection->get('search.view_node_search') ?: $collection->get('search.view_content_exclude_');
        if ($route) {
            $route->setDefault('_controller', '\Drupal\forms_overwrite\Controller\ResultSearchController::view');
        }
    }

/** Equivaut à:
 Mode fat: 
    protected function alterRoutes(RouteCollection $collection) {
        $route = null;
        if ($collection->get('search.view_node_search')) {
           $route = $collection->get('search.view_node_search');
        } else if ($collection->get('search.view_content_exclude_')) {
           $route = $collection->get('search.view_content_exclude_');
        }
        if (!is_null($route)) {
            $route->setDefault('_controller', '\Drupal\forms_overwrite\Controller\ResultSearchController::view');
        }
    }
 Mode intermédiaire:
    protected function alterRoutes(RouteCollection $collection) {
        if ($route = $collection->get('search.view_node_search') ? $collection->get('search.view_node_search') : $collection->get('search.view_content_exclude_')) {
            $route->setDefault('_controller', '\Drupal\forms_overwrite\Controller\ResultSearchController::view') ;
        }
    }
 Mode slim:
    protected function alterRoutes(RouteCollection $collection) {
        if ($route = $collection->get('search.view_node_search') ?: $collection->get('search.view_content_exclude_')) {
            $route->setDefault('_controller', '\Drupal\forms_overwrite\Controller\ResultSearchController::view');
        }
    }
**/

 

ResultSearchController.php

<?php

namespace Drupal\forms_overwrite\Controller;

use Drupal\search\SearchPageInterface;
use Symfony\Component\HttpFoundation\Request;
use Drupal\search\Controller\SearchController;

/**
 * Route controller for search.
 */
class ResultSearchController extends SearchController {

    /**
     * {@inheritdoc}
     */
    public function view(Request $request, SearchPageInterface $entity) {
        $build = parent::view( $request, $entity);
        unset($build['search_form']['help_link']);
        return $build;
    }
}

Rien de fou fou, notre module surcharge le Controller responsable et vu que c'est la méthode view qui renvoit la vue attendue, on peut se placer là pour enlever le lien. Mais ...

Je ne suis pas vraiment fan de cette solution, car tout le code a été chargé et on ne fait que l'enlever presque au dernier moment (ce n'est pas pire que de le faire dans les tpls mais presque). A voir si je ne peux pas surcharger encore plus haut.

 

Et les YML qui vont avec comme d'hab., assez explicites.

forms_overwrite.info.yml

name: Forms overwrite Module
description: Overwrite existing forms to provide new functionnality
package: Custom

type: module
core: 8.x

forms_overwrite.services.yml 

services:
    route_subscriber:
        class: Drupal\forms_overwrite\Routing\RouteSubscriber
        tags: 
         {name: event_subscriber }

 

Mots clés
Drupal 8