我在Grav中有以下页面结构:
# Title
## Subtitle
### Subsubtitle
页面结构始终相同,只有这三个项目。
如何在Twig模板中单独检索每个项目(Title / Subtitle / Subsubtitle)?
树枝模板将执行以下操作:
<p> You typed {{ page.whatever_retrieves_the_title_# }} as title, then {{ page.whatever_retrieves_the_subtitle_## }} as subtitle and finally {{ page.whatever_retrieves_the_subsubtitle_### }} as subsubtitle</p>
如果我没有上述结构,那该怎么办:
- Title
- Subtitle
- Subsubtitle
目标是用户只添加三个项目的结构,并且树枝模板使用每个项目来显示更复杂的布局。
答案 0 :(得分:3)
这是Markdown,对吧?
# Title
## Subtitle
### Subsubtitle
您可以使用{{ page.content }}
在Twig中获取该网页的Markdown标记,如Grav's documentation中所述。所以你应该得到这样的东西:
<h1>Title</h1>
<h2>Subtitle</h2>
<h3>Subsubtitle</h3>
您可以使用split
和raw
过滤器来提取这些标记的内容。我还使用default
过滤器,以便在标记内容的提取失败时不会出错:
Title is:
{{ page.content|split('<h1>')[1]|default|raw|split('</h1>')[0] }}
Subtitle is:
{{ page.content|split('<h2>')[1]|default|raw|split('</h2>')[0] }}
Subsubtitle is:
{{ page.content|split('<h3>')[1]|default|raw|split('</h3>')[0] }}
或者因为Grav似乎提供regex_replace
filter,你也可以使用它:
Title is:
{{ page.content|regex_replace('~.*<h1>(.*)</h1>.*~s', '$1') }}
Subtitle is:
{{ page.content|regex_replace('~.*<h2>(.*)</h2>.*~s', '$1') }}
Subsubtitle is:
{{ page.content|regex_replace('~.*<h3>(.*)</h3>.*~s', '$1') }}
如果你有这个:
- Title
- Subtitle
- Subsubtitle
您可以再次使用split
,default
和raw
过滤器:
Title is:
{{ page.content|split('<li>')[1]|default|raw|split('</li>')[0] }}
Subtitle is:
{{ page.content|split('<li>')[2]|default|raw|split('</li>')[0] }}
Subsubtitle is:
{{ page.content|split('<li>')[3]|default|raw|split('</li>')[0] }}
不是很漂亮。 :-)如果标题可以包含HTML(例如## Hello **world**!
→<h2>Hello <strong>world</strong>!</h2>
)或特殊字符,则可能需要将|raw
附加到已经很长的魔法咒语中。
答案 1 :(得分:1)
其他人通过降价操作提供了良好的解决方案。但是,您可以使用grav功能并提供自己的蓝图,并让用户填写一些字段。
假设这是针对使用模板blog_article.html.twig
的页面,因此您可以在blog_article.yaml
内创建一个名为user/themes/yourtheme/blueprints
的文件,并使用以下蓝图填充该文件:
title: Blog_Article
'@extends':
type: default
context: blueprints://pages
form:
fields:
tabs:
fields:
content:
fields:
header.mytitle:
type: text
label: My Label
header.mysubtitle:
type: text
label: Type Subtitle
header.mysubsubtitle
type: text
label: Type subsubtitle
现在,如果您尝试从管理员编辑您的页面,您会在页面媒体下看到三个新字段添加到页面中。
然后,您可以使用以下树枝在模板中显示这些字段:
{{ page.header.mytitle }}
{{ page.header.mysubtitle }}
{{ page.header.mysubsubtitle }}
希望有所帮助