Как я могу создать связанные теги из значения списка, разделенного запятыми, в приложении Stacey?


Я хотел бы иметь теги/категории для каждого проекта в Стейси, такие как "дизайн", "фотография", "иллюстрация" и т. Д., И каждый из них должен быть связан с соответствующими категориями.

Например, мой файл project.yml гласит:

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

Итак, когда в Стейси (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']);
?>

Однако я не знаю, как я мог бы превратить список, разделенный запятыми, из "категории:" в массив, затем удалить массив запятых и поместить теги ссылок вокруг каждого, связываясь с категорией в href.

Я тоже пытался использование вышеупомянутого PHP в качестве частичного, однако динамический код не будет работать в Stacey из-за кэширования, и на него нельзя ссылаться извне папки /partials/.

Я довольно смущен всем этим, любая помощь была бы чрезвычайно признательна.

Примечание: У Стейси нет последней версии Twig, в которой есть фильтры, такие как "сплит".

Author: Cœur, 2014-03-11

2 answers

Вы можете использовать веточку split отфильтруйте, затем проверьте, не является ли элемент пустым.

{% set categories = page.category|split(',') %}


{% for category in categories %}
    {% if category is not empty %}
        <a href="/category/{{ category|lower }}/">{{ category }}</a>
    {% endif %}
{% endfor %}

Поскольку Стейси все еще использует версию 1.4 на момент написания и что этот фильтр был добавлен в Twig в 1.10, вам нужно будет добавить этот фильтр самостоятельно.

В 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
Author: Adam Elsodaney, 2014-03-12 11:04:00

Решение с помощью 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 %}

Что это делает, так это превращает пробелы в URL-адресах в дефисы, чтобы сделать их более чистыми, затем избавляется от пробелов после запятых, разделяет слова между запятыми, а затем удаляет все лишние запятые. Я бы хотел использовать фильтр "обрезка", но, как и "разделение", он недоступен.

 0
Author: Cœur, 2017-07-29 14:41:05