Как создать коллекцию контента Scala в шаблоне Play?

Я уверен, что упускаю очевидное, но есть ли способ создать коллекцию объектов HTML для передачи в шаблон Play, например @(title: String)(content: Seq(Html))? Я пытаюсь динамически генерировать группу страниц вкладок, где каждый объект HTML является телом вкладки.

В чем путаница заключается в том, как создать Seq(Html) в шаблоне. Что-то вроде @main("Home") Seq({...},{...}) не работает и не использует @(title: String)(contentTab1: Html)(contentTab2: Html) а также @main("Home") {...}, {...} побеждает цель.

Что-то вроде:

Содержание вкладки (tab.scala.html):

@(content: Html, tab: models.Tab, isActive: String)
<section class="mdl-layout__tab-panel @isActive" id="fixed-tab-@tab.id">
      <div class="page-content">@content</div>
</section>

Основной шаблон (main.scala.html):

@main(title: String, tabs: List[models.Tab])(contentSeq: Seq[Html])

Шаблон страницы:

@(tabs: List[models.Tab])
@main("title", tabs) {
    <!-- tab1 content -->
} {
  <!-- tab2 content -->
}

* игнорировать плохой дизайн соответствия Seq[Html] а также List[models.Tab] размеры

2 ответа

Решение

Скомпилированные шаблоны Play - это просто функции (точнее, объекты с apply(...) метод), поэтому при условии, что у вас есть один (частичный) шаблон для содержимого вкладки, вы можете просто применить его к данным вкладки, используя mapНапример:

Основной шаблон (main.scala.html):

@main(title: String, tabs: Seq[Html])(content: Html)

<h1>@title</h1>
<ul class="tabs">
   @tabs.map { tab =>
     @tab
   }
</ul>
@content

Содержание вкладки (tab.scala.html):

@(name: String)

<li>@name</li>

Таким образом, каждый шаблон страницы будет выглядеть примерно так:

@(title: String)

@main(title, Seq("tab1", "tab2", "tab3").map(name => views.html.tab(name)) {
    <p>This is some content</p>
}

... или если у вас есть несколько частичных вкладок:

@main(title, Seq(views.html.tab1("tab1"), views.html.tab2("tab2"))) {
    <p>This is some content</p>
}

Еще один способ - визуализировать каждую вкладку как повторно используемый блок и передать их в главный шаблон в виде последовательности:

@(title: String)

@tab1 = {
    <li>Content for tab 1</li>
}

@tab2 = {
    <li>Content for tab 2</li>
}

@main(title, Seq(tab1, tab2)) {
    <p>This is some content</p>
}

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

@(title: String, contents: Seq[String])

Вы можете найти больше информации на сайте Play Framework.

Другие вопросы по тегам