【问题标题】:Highlight search terms in search results in Twig/Timber在 Twig/Timber 的搜索结果中突出显示搜索词
【发布时间】:2019-03-01 08:02:06
【问题描述】:

我正在处理这个问题的答案Twig highlight word (Timber plugin),以更新该函数以在较新的 Timber/Twig 2 过滤器结构下工作。

但我收到“传递给 {closure}() 的参数 2 必须是数组类型,给定 null”的错误。

所以我知道我需要将搜索词传递给函数。我该怎么做?

我是否可以在 search-results.twig 模板上从 {{ search_query }} 获取搜索词?

或者是我可以从search.php 和该文件中的“上下文”调用(即$context['search_query'] = get_search_query();)获得的全局搜索词吗?

我需要以标准方式in search-results.twig 使用过滤器,例如{{ content|highlight }},因为我为搜索结果标题和内容设置了单独的字段,并希望突出显示每个字段中的术语。

functions.php 中的这个函数当前会抛出上述错误:

add_filter('timber/twig', function($twig) {
   $twig->addExtension(new Twig_Extension_StringLoader());

   $twig->addFilter(
     new Twig_SimpleFilter(
       'highlight', 

function($text, array $terms) {

    $highlight = array();
    foreach($terms as $term) {
       $highlight[]= '<span class="highlight">'.$term.'</span>';
    }

    return str_ireplace($terms, $highlight, $text);
}

 )
   );

   return $twig;
});

更新:这可行

functions.php:

add_filter('timber/twig', function($twig) {
   $twig->addExtension(new Twig_Extension_StringLoader());

   $twig->addFilter(
     new Twig_SimpleFilter(
       'highlight', 

function($text, array $terms) {

    $highlight = array();
    foreach($terms as $term) {
       $highlight[]= '<span class="highlight">'.$term.'</span>';
    }

    return str_ireplace($terms, $highlight, $text);
}

 )
   );

   return $twig;
});

在 search-results.twig 中:

{% set searches = [ search_query ] %}

and

{{ content|highlight(search_query|split(' ')) }}

在 search.php 中

$search_results = Timber::get_posts();
$context['search_query'] = get_search_query();

【问题讨论】:

  • 你如何在模板中使用过滤器?
  • 谢谢,我忘了补充;我需要使用像 {{ content|highlight }} 这样的标准过滤器。

标签: php symfony twig timber


【解决方案1】:

像这样传递你想要突出显示的术语

{{ content | highlight(['foo', 'bar',]) }}

如果你只定义一个术语,你可以这样做

{% set search = 'foo' %}
{{ content | highlight([ search, ]) }}

如果我是你,我会把函数改成这个

function($text, $terms) {
    if (!is_array($terms)) $terms = [ $terms, ];
    $highlight = array();
    foreach($terms as $term) {
       $highlight[]= '<span class="highlight">'.$term.'</span>';
    }

    return str_ireplace($terms, $highlight, $text);
}

然后你可以传递一个或多个术语

{% set search = 'foo' %}
{{ content | highlight(search) }}

{% set searches = [ 'foo', 'bar', ] %}
{{ content | highlight(searches) }}

【讨论】:

  • 谢谢,但我不明白为什么我需要树枝文件中的 {% set search = [ 'foo', 'bar', ] %} 。为什么没有 {{ 内容 | highlight(searches) }} 没有它可以工作吗?这就是我想要做的,将搜索查询词拉入函数中。
  • 这只是为了举例,您可以将任何数组传递给您的twig 模板并将其传递给highlight 过滤器
  • 嗯...但我不明白如何将数组传递给树枝模板或过滤器。
  • 我已经向你展示了如何将它传递给过滤器。你只需要像你通常做的那样将你的条款从你的控制器传递到你的模板
  • 啊,这行得通;我使用 {% set search = [ search_query ] %} 在过滤器调用上方调用搜索词。它现在可以使用一个学期。但如果我用两个词搜索,什么都没有。那么我们是否需要另一个函数在搜索词之间添加逗号?
猜你喜欢
  • 2018-03-05
  • 2023-03-17
  • 1970-01-01
  • 2014-02-13
  • 1970-01-01
  • 1970-01-01
  • 2014-07-25
  • 2010-09-16
相关资源
最近更新 更多