drupal9搜索结果中怎么打印field_image等自定义字段?

  默认主题bartik下,drupal9的搜索结果中可以显示标题、描述、作者、日期等信息。但是无法输出field_image等自定义字段数据。要解决这个问题,白龙网复盘了下,建议从以下3个方面着手。
 
  一、添加字段 调用变量
 
  打开htdocscoremodulessearchsearch.pages.inc文件,添加如下代码,把内容类型实体中的field_image字段传递给搜索结果页:
 
  $node = $variables['result']['node'];
  if (isset($node)) {
    $variables['field_image'] = Drupal::entityTypeManager()->getViewBuilder('node')->view($node,'field_image');
  }
 
  说明:
 
  这段代码实际是把内容类型中的字段field_image与搜索结果页关联起来的。field_image是drupal内容类型中自带的图片类型字段。也可以在内容类型中自定义诸如关键词field_keyword、描述field_description等字段,只需要把上述代码复制一下,分别用关键词field_keyword、描述field_description替换field_image即可把内容类型中自定义的字段传递给搜索结果页。
 
  二、调用字段 打印变量
 
  打开搜索结果页面模板htdocs > core > themes > bartik > templates > classy > content > search-result.html.twig,在对应位置放置自定义变量{{ field_image }},即可调用到内容类型中的field_image字段数据。
 
  在搜索结果模板中,可以借助A标签、使用搜索结果页指定格式的{{ url }}变量为图片添加链接、ALT属性,指出详情页并利好SEO优化。
 
  三、调试模板 指定变量
 
  更新缓存后,发现搜索结果中不但调用到了内容类型中的field_image字段数据,还调用了内容类型中的标题、描述、关键词、日期、TAG等信息。这是因为系统默认使用了node.html.twig模板,输出了全部字段数据,故而显示了内容类型中的全部字段信息。
 
  根据debug提示,复制node.html.twig模板,重命名为htdocs > core > themes > bartik > templates > node--field-image.html.twig,然后删除node--field-image.html.twig模板中除了{{ content.field_image }}之外的所有字段、标签,只留下图片字段内容:{{ content.field_image }}。
 
  再次更新缓存后,发现搜索结果中可以显示指定的field_image字段对应的图片信息了。

        四、自定义主题下在搜索结果页打印自定义字段
 
  默认主题上,通过以上三步,就可以让内容类型中的自定义字段显示到搜索结果页面。如果是自定义主题的话,例如自定义主题名称为bailong,可以根据上述思路,在bailong.theme文件中配置如下功能函数,即可把内容类型中的若干字段传递到搜索结果页模板,然后在搜索结果模板中调用相应变量,并调试对应变量模板即可:
 
function bailong_preprocess_search_result(&$variables) {
  $node = $variables['result']['node'];
  if (isset($node)) {
    $variables['teaser1'] = Drupal::entityTypeManager()->getViewBuilder('node')->view($node,'teaser1');
    $variables['teaser2'] = Drupal::entityTypeManager()->getViewBuilder('node')->view($node,'teaser2');
    $variables['teaser3'] = Drupal::entityTypeManager()->getViewBuilder('node')->view($node,'teaser3');
    $variables['teaser4'] = Drupal::entityTypeManager()->getViewBuilder('node')->view($node,'teaser4');
    $variables['teaser5'] = Drupal::entityTypeManager()->getViewBuilder('node')->view($node,'teaser5');
  }
};