如何在Stacey App中使用逗号分隔的列表值创建链接标签?

时间:2014-03-10 23:17:49

标签: php arrays list twig comma

我想在Stacey中为每个项目设置标签/类别,如“设计”,“摄影”,“插图”等,并且每个项目都与各自的类别相关联。

例如,我的project.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中的类别时将链接标记放在每个链接标记周围。 / p>

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

我对所有这些感到困惑,任何帮助都会受到极大的赞赏。

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

2 个答案:

答案 0 :(得分:1)

您可以使用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);
}

答案 1 :(得分:0)

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

这样做是将网址中的空格转换为连字符以使其更清晰,然后在逗号后删除空格,分隔逗号之间的单词,然后删除任何多余的逗号。我会喜欢使用&#39; trim&#39;过滤,但喜欢&#39; split&#39;它不可用。