Drupal 8 - 核心搜索模块,更改标记

Drupal 8 - Core search module, change markup

如何从我的 .theme 文件更改此标记?

\core\modules\search\src\Controller\SearchController 中的第 119 行。php

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

我想从我的搜索页面中删除 "Search results" H2。

我可以使用搜索表单上的 _preprocess_form 功能和搜索结果上的 preprocess_search_result 来更改上方的搜索表单和 H2 下方的结果列表。

我是否缺少预处理功能,或者我可以使用自定义树枝模板吗?

可以覆盖item-list--search-results.html.twig,替换标题,这里:

  {%- if title is not empty -%}
    <h3>{{ title }}</h3>
  {%- endif -%}

只需删除那个 h3。

您必须更改搜索模块定义的路线。 为此:

  1. 在您的 mymodule.services.yml 文件中定义如下:

    services:
      mymodule.route_subscriber:
      class: Drupal\mymodule\Routing\RouteSubscriber
      tags:
        - { name: event_subscriber }

  1. 创建一个 class 来扩展 /mymodule/src/Routing/RouteSubscriber 上的 RouteSubscriberBase class,如下所示:

    /**
     * @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. 最后,控制器本身位于 /mymodule/src/Controller/MyModuleSearchController。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;
      }

    }

来自@hugronaphor 的解决方案完美无缺。 我希望我的搜索结果标题是 "Search results for '(searchterm)'" 而不是 "Search results",@hugronaphor 描述的步骤正是这样做的。

在我的视图函数中,我放了这个:

if (isset($build['search_results_title']) && isset($_GET['keys'])) {
   $build['search_results_title'] = ['#markup' => '<h2>' . t('Search results for') . ' "' . $_GET['keys'] . '"</h2>'];
}