我如何创建链接标签从一个逗号分隔的列表值在Stacey应用程序


How can I create linked tags from a comma separated list value in Stacey App?

我想在Stacey的每个项目中都有标签/类别,如'设计','摄影','插图'等,并将每个项目链接到各自的类别。

例如,我的项目。Yml文件读:

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

所以,当在Stacey (v3)中,当在我的project.html模板中,我把{{ 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']);
?>

然而,我不知道如何将逗号分隔的列表从'category:'变为数组,然后剥离逗号数组,并在链接到href中的类别时将每个链接标签放在周围。

我也试过使用上面的PHP作为部分,但是动态代码将不工作在Stacey由于缓存,它不能从外部/partials/文件夹引用。

我被这一切弄糊涂了,任何帮助都将是非常感激的。

注意:Stacey没有最新版本的Twig,它有像'split'这样的过滤器。

您可以使用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在撰写本文时仍在使用1.4版本,并且此过滤器是在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);
}

OP.

将Adam的代码扩展为如下

{% 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 %}

这样做是把url中的空格变成连字符,使它们更干净,然后去掉逗号后面的空格,在逗号之间分隔单词,然后删除任何多余的逗号。我本想使用'trim'滤镜,但像'split'一样,它是不可用的。