Многоразовые функции между шаблонами в шаблонах Play Framework

В Play Framework внутри шаблона я могу определить такие функции:

@title(text: String) = @{
  text.split(' ').map(_.capitalize).mkString(" ")
}

<h1>@title("hello world")</h1>

Могу ли я определить такую ​​функцию в отдельном файле и сделать ее многоразовой между несколькими шаблонами?

2 ответа

Решение

Есть как минимум несколько решений:

Во-первых, это использование тегов, как показал вам Makis, и в большинстве случаев это нормально, даже если он добавляет дополнительные пустые строки, это не имеет значения (по крайней мере, когда мы говорим о создании фрагментов HTML, то есть представлении повторяющихся элементов новостей в списке) - вы можете, т.е. оптимизировать / сжать ваш HTML в пост-процессе, если вы заботитесь о скорости передачи.

Во-вторых, это создание объекта Scala, который содержит статические функции (в Java это также возможно) и возвращает play.twirl.api.Html("<div>your code</div>")Таким образом, вы можете программно подгонять свой код именно так, как вам нужно, избегать пустых строк, удалять или заменять пробелы и т. д. Просто в вашем шаблоне вам нужно будет использовать синтаксис, например: @full.qualified.path.to.Object.method("foo", "bar") возвращая Html("...") причины, по которым вам не нужно экранировать возвращенный код в вашем представлении.

Третий подход - использование собственных методов, похожих на TemplateMagic, которые позволяют расширять объекты любого типа и выполнять с ними некоторую логику. "active".when(someCondition) Синтаксис, вы можете увидеть, как это сделано в репо. Конечно, вам нужно просто создать собственный класс и импортировать его в начале ваших представлений. Также имейте в виду, что это не должен быть только один Boolean аргумент, ваши методы могут использовать столько параметров, сколько вам нужно - любой тип, который вам нужен. Это может быть просто без параметров.

редактировать - образец:

Приложение /MyAPI /MyMagic.scala

package myapi

import play.twirl.api.Html

import scala.language.implicitConversions

object MyMagic {

  class RichString(string: String) {

    def upperWords() = {
      Html(string.split(' ').map(_.capitalize).mkString(" "))
    }

    def bold() = {
      Html("<b>" + string + "</b>")
    }

    def when(predicate: => Boolean) = {
      predicate match {
        case true => string
        case false => ""
      }
    }

  }

  implicit def richString(string: String): RichString = new RichString(string)
}

использование в представлении (ях)

@(title: String)
@import myapi.MyMagic._

@main("Welcome to Play") {

    @title.upperWords() <br>
    @{"foo bar baz".upperWords()} <br>
    @{"I'm bolded LOL".bold()} <br>

    <ul>
        @for(item <- 1 to 10){
            <li >Item no.: @{item} @{"(first item)".when(item==1)}</li>
        }
    </ul>    
}

Вы можете создать новый файл с именем title.scala.html с этим содержанием:

@(text: String)

@title(text: String) = @{
    text.split(' ').map(_.capitalize).mkString(" ")
}

@title(text)

Затем вы можете использовать его в своих шаблонах, как вы хотели бы.

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