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。
您必须更改搜索模块定义的路线。
为此:
- 在您的
mymodule.services.yml
文件中定义如下:
services:
mymodule.route_subscriber:
class: Drupal\mymodule\Routing\RouteSubscriber
tags:
- { name: event_subscriber }
- 创建一个 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');
}
}
}
- 最后,控制器本身位于 /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>'];
}
如何从我的 .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。
您必须更改搜索模块定义的路线。 为此:
- 在您的
mymodule.services.yml
文件中定义如下:
services: mymodule.route_subscriber: class: Drupal\mymodule\Routing\RouteSubscriber tags: - { name: event_subscriber }
- 创建一个 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'); } } }
- 最后,控制器本身位于 /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>'];
}