Grav - 从模板中的页面检索特定项目

时间:2018-02-21 17:26:06

标签: twig grav

我在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

目标是用户只添加三个项目的结构,并且树枝模板使用每个项目来显示更复杂的布局。

2 个答案:

答案 0 :(得分:3)

这是Markdown,对吧?

# Title
## Subtitle
### Subsubtitle

您可以使用{{ page.content }}在Twig中获取该网页的Markdown标记,如Grav's documentation中所述。所以你应该得到这样的东西:

<h1>Title</h1>
<h2>Subtitle</h2>
<h3>Subsubtitle</h3>

您可以使用splitraw过滤器来提取这些标记的内容。我还使用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

您可以再次使用splitdefaultraw过滤器:

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

希望有所帮助