【问题标题】:How can I create linked tags from a comma separated list value in Stacey App?如何从 Stacey App 中的逗号分隔列表值创建链接标签?
【发布时间】:2014-04-14 08:04:36
【问题描述】:

我想在 Stacey 中为每个项目设置标签/类别,例如“设计”、“摄影”、“插图”等,并将每个标签/类别链接到各自的类别。

例如,我的 project.yml 文件内容为:

title: Example Person's Logo
date: February 2014
client: Example Person
category: Logo, Digital,
content: +++
Branding for Example Person.
+++

所以,当我在我的 project.html 模板中使用 Stacey (v3) 时,我输入 {{ page.category }} 它输出 Logo, Digital,,这不是我想要的。如果我只想发短信就好了,但我不想。

我想要的是获取逗号分隔值(无论最后一项是否有逗号),并将其变成这样:

<a href="/category/logo/">Logo</a>
<a href="/category/digital/">Digital</a>

我已经进行了一些搜索,并且使用 TWIG 模板引擎,我不确定如何在没有 PHP 中的反向引用的情况下实现这一点。有人告诉我,在 PHP 中,解决方案是这样的:

<?php echo preg_replace(
    "#([^,\s]+)#is",
    "<a href='/tags/$1'>$1</a>",
    $row['tags']);
?>

但是我不知道如何将逗号分隔的列表从“类别:”转换为数组,然后去除逗号数组,并在链接到 href 中的类别时将链接标记放在每个周围。

我也尝试过使用上面的 PHP 作为部分,但是动态代码由于缓存的原因在 Stacey 中不起作用,并且无法从 /partials/ 文件夹外部引用。

我对这一切感到很困惑,任何帮助将不胜感激。

注意:Stacey 没有具有“split”等过滤器的最新版本的 Twig。

【问题讨论】:

    标签: php arrays list twig comma


    【解决方案1】:

    OP 的解决方案。

    将亚当的代码扩展到此

    {% set categories = page.category|replace({', ' : ','})|split(',') %}
        {% for category in categories %}
            {% if category is not empty %}
                <dd><a href="/category/{{ category|lower|replace({' ' : '-', ',' : ''}) }}/">{{ category }}</a></dd>
            {% endif %}
        {% endfor %}
    

    这样做是将网址中的空格转换为连字符以使其更清晰,然后去掉逗号后的空格,分隔逗号之间的单词,然后删除任何多余的逗号。我本来想使用“修剪”过滤器,但像“拆分”一样它不可用。

    【讨论】:

      【解决方案2】:

      可以使用 Twig 的split 过滤器,然后检查元素是否为空。

      {% set categories = page.category|split(',') %}
      
      
      {% for category in categories %}
          {% if category is not empty %}
              <a href="/category/{{ category|lower }}/">{{ category }}</a>
          {% endif %}
      {% endfor %}
      

      由于 Stacy 是 still using version 1.4 at time of writing 并且这个过滤器是在 1.10 中添加到 Twig 中的,所以您需要自己添加这个过滤器。

      extensions/twig-extensions.inc.php 中,您可以将新过滤器添加到扩展的getFilters 数组中

      public function getFilters() {
          # custom twig filters
          return array(
      
            //... other filters here ...
      
            'split' => new Twig_Filter_Method($this, 'split'),
          );
      }
      

      然后在public function getFunctions()方法后面加上这个方法

      /**
       * Custom filter method
       *
       * @param string $str
       * @param string $delimiter
       * @return string[]
       */
      public function split($str, $delimiter) {
        return explode($delimiter, $str);
      }
      

      【讨论】:

      • 干杯亚当!虽然奇怪的 Stacey 中没有包含拆分过滤器。我会四处寻找并尝试为 Stacey 更新 Twig 并尝试拆分工作。你的代码看起来对我有用,我会看看我是否能做到。否则,我一直在考虑以某种方式使用替换或修剪,不知道如何针对这个特定示例执行此操作。
      • @LouisBullock 拆分过滤器实际上是 Twig 的一部分,但在文档上它说 拆分过滤器是在 Twig 1.10.3 中添加的。 但是检查@987654323 上的源@ 确认正在使用 Twig 的 v1.4 候选版本。如果您可以升级 Twig,那将是理想的选择。你熟悉使用 Composer 安装包吗?
      • 另一种方法是自己为 Twig 添加一个新的拆分过滤器。我将扩展我的答案,向您展示如何
      • 啊,太棒了!不幸的是,我对此并不熟悉,这对我来说似乎很新:)任何帮助将不胜感激:)
      • @LouisBullock 该死的,看起来Twig_SimpleFilter 类也是在 1.4 版之后添加的......我会再次更新我的答案
      猜你喜欢
      • 1970-01-01
      • 2020-04-21
      • 1970-01-01
      • 1970-01-01
      • 2016-07-23
      • 1970-01-01
      • 2012-03-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多