默认主题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'); } };