Как я могу создать связанные теги из значения списка, разделенного запятыми, в приложении 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, в которой есть фильтры, такие как "сплит".
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);
}
Решение с помощью 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-адресах в дефисы, чтобы сделать их более чистыми, затем избавляется от пробелов после запятых, разделяет слова между запятыми, а затем удаляет все лишние запятые. Я бы хотел использовать фильтр "обрезка", но, как и "разделение", он недоступен.