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

Twig Grav-从模板中的页面检索特定项,twig,grav,Twig,Grav,我在Grav中有以下页面结构: # Title ## Subtitle ### Subsubtitle 页面结构总是相同的,它只有这三个项目 如何在Twig模板中分别检索每个项目(标题/副标题/子标题) 然后,细枝模板将执行以下操作: <p> You typed {{ page.whatever_retrieves_the_title_# }} as title, then {{ page.whatever_retrieves_the_subtitle_## }} as subti

我在Grav中有以下页面结构:

# Title
## Subtitle
### Subsubtitle
页面结构总是相同的,它只有这三个项目

如何在Twig模板中分别检索每个项目(标题/副标题/子标题)

然后,细枝模板将执行以下操作:

<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
您可以使用
{{page.content}}
在Twig中获取页面标记的HTML版本,如中所述。所以你应该得到这样的东西:

<h1>Title</h1>
<h2>Subtitle</h2>
<h3>Subsubtitle</h3>
或者因为Grav似乎提供了一种新的功能,您也可以使用它:

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') }}
您可以再次使用
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] }}
标题是:
{page.content | split('
  • ')[1]|默认| raw | split('
  • ')[0]} 副标题是: {page.content | split('
  • ')[2]|默认| raw | split('
  • ')[0]} 子标题为: {page.content | split('
  • ')[3]|默认| raw | split('
  • ')[0]}


    不太漂亮。:-)如果标题可以包含HTML(例如,
    ##你好**世界**!
    → <代码>你好world!)或特殊字符,您可能需要将
    |raw
    附加到已经很长的魔法咒语中。

    这是标记,对吗

    # Title
    ## Subtitle
    ### Subsubtitle
    
    您可以使用
    {{page.content}}
    在Twig中获取页面标记的HTML版本,如中所述。所以你应该得到这样的东西:

    <h1>Title</h1>
    <h2>Subtitle</h2>
    <h3>Subsubtitle</h3>
    
    或者因为Grav似乎提供了一种新的功能,您也可以使用它:

    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') }}
    
    您可以再次使用
    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] }}
    
    标题是:
    {page.content | split('
  • ')[1]|默认| raw | split('
  • ')[0]} 副标题是: {page.content | split('
  • ')[2]|默认| raw | split('
  • ')[0]} 子标题为: {page.content | split('
  • ')[3]|默认| raw | split('
  • ')[0]}


    不太漂亮。:-)如果标题可以包含HTML(例如,
    ##你好**世界**!
    Helloworld
    )或特殊字符,您可能需要将
    |raw
    附加到已经很长的魔法咒语中。

    其他人提供了很好的降价操作解决方案。但是,您可以使用grav功能并提供自己的蓝图,并让用户填写一些字段

    假设这是一个使用模板
    blog\u article.html.twig
    的页面,因此您可以在
    user/themes/yourtheme/blueprints
    内部创建一个名为
    blog\u article.yaml
    的文件,并用以下蓝图填充它:

    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
    
    现在,如果您试图从admin编辑页面,您将看到页面媒体下添加了三个新字段

    然后,可以使用以下细枝在模板中显示这些字段:

    {{ page.header.mytitle }} 
    {{ page.header.mysubtitle }}
    {{ page.header.mysubsubtitle }}
    

    希望它能帮助

    其他人通过降价操作提供了很好的解决方案。但是,您可以使用grav功能并提供自己的蓝图,并让用户填写一些字段

    假设这是一个使用模板
    blog\u article.html.twig
    的页面,因此您可以在
    user/themes/yourtheme/blueprints
    内部创建一个名为
    blog\u article.yaml
    的文件,并用以下蓝图填充它:

    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
    
    现在,如果您试图从admin编辑页面,您将看到页面媒体下添加了三个新字段

    然后,可以使用以下细枝在模板中显示这些字段:

    {{ page.header.mytitle }} 
    {{ page.header.mysubtitle }}
    {{ page.header.mysubsubtitle }}
    

    希望有帮助

    谢谢你回答了这个问题,但是我最终发现在Grav中更好的方法是使用一个插件,它允许定义节,然后在Twig中检索这些节。@M.E.如果你找到了更好的方法,这个解决方案非常难看,非常粗糙!作为参考,我包括了这个相关的问题,并且有一个更好的方法:谢谢这回答了这个问题,然而,我最终发现在Grav中更好的方法是使用一个插件,该插件允许定义节,然后在Twig中检索这些节。@M.E.如果你找到一个更好的方法,这个解决方案非常难看,非常有黑客味!作为参考,我提出了一个相关的问题,并且有一个更好的方法:您不想在标题中定义这些变量是有原因的吗?@PaulMassendari如果我正确理解grav admin用户界面的工作原理,用户需要选择专家模式来编辑标题中的变量。我希望非技术用户能够更改该文本。不完全是这样,您可以提供自己的蓝图。我将提供一个答案作为示例。您不想在标题中将这些变量定义为vars有什么原因吗?@PaulMassendari如果我正确理解grav admin用户界面的工作原理,用户需要选择专家模式来编辑标题中的变量。我希望非技术用户能够更改该文本。不完全是这样,您可以提供自己的蓝图。我将提供一个答案作为例子。这非常有趣,我将尝试一下。我从来没有使用过蓝图,所以这是非常有趣的,我会尝试一下。到目前为止,我从未使用过蓝图