Grav - получение определенных элементов со страницы в шаблоне

У меня следующая структура страниц в 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

Цель состоит в том, чтобы пользователь добавил только эту структуру из трех элементов, а шаблон веточки использовал каждый элемент для отображения более сложного макета.


person M.E.    schedule 21.02.2018    source источник
comment
Есть ли причина, по которой вы не хотите определять их как вары в заголовке?   -  person Paul Massendari    schedule 22.02.2018
comment
@PaulMassendari, если я правильно понял, как работает пользовательский интерфейс администратора grav, пользователю нужно будет выбрать режим эксперта, чтобы редактировать их как переменные в заголовке. Я бы хотел, чтобы этот текст мог изменить нетехнический пользователь.   -  person M.E.    schedule 22.02.2018
comment
не совсем так, вы можете предоставить свой собственный план. Приведу ответ в качестве примера.   -  person Paul Massendari    schedule 23.02.2018


Ответы (2)


Это же Markdown, верно?

# Title
## Subtitle
### Subsubtitle

Вы можете получить HTML-версию Markdown страницы в Twig с помощью {{ page.content }}, как описано в документации Grav.. У вас должно получиться что-то вроде этого:

<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 к уже длинным магическим заклинаниям.

person Matias Kinnunen    schedule 21.02.2018
comment
Спасибо, это ответ на вопрос, однако я наконец обнаружил, что гораздо лучший подход в Grav - это использовать плагин, который позволяет определять разделы, а затем извлекать такие разделы в Twig. - person M.E.; 21.02.2018
comment
@МЕНЯ. Это решение очень уродливое и хакерское, так что здорово, если вы нашли лучший подход! - person Matias Kinnunen; 21.02.2018
comment
В качестве справки я включаю этот вопрос, который связан и имеет лучший подход: stackoverflow.com/questions/48912840/ - person M.E.; 21.02.2018

Другие предоставили хорошее решение с манипуляциями с уценкой. Однако вы можете использовать возможности гравитации и предоставить свои собственные чертежи, а также попросить пользователя заполнить некоторые поля.

Допустим, это страница, которая использует шаблон 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 }}

Надеюсь, поможет

person Paul Massendari    schedule 23.02.2018
comment
Это очень интересно, и я попробую. Я никогда не использовал чертежи до сих пор - person M.E.; 26.02.2018