When you want to create a Play Framework template function, you can find some examples on the Scala Templates page. There you'll find these first two examples.
First, assuming you have a Product model defined something like this:
case class Product(var name: String, var price: BigDecimal)
The first template looks like this:
@display(product: models.Product) = { @product.name ($@product.price) } <ul> @products.map { p => @display(product = p) } </ul>
As you can see, the @
symbol is used to precede Scala statements. So, any time you want to create a new statement, or reference a variable, you need to precede it with the @
symbol. (Note that the $
symbol in the display function will be output as a $
; it's intended to be part of the output, as are the parentheses around the price.)
Their second example demonstrates that the function (what they refer to as a "reusable block") can be pure Scala code, as opposed to being a mix of Scala and HTML/XML:
@title(text: String) = @{ text.split(' ').map(_.capitalize).mkString(" ") } <h1>@title("hello world")</h1>
A simple UL/LI List-rendering example
If you're just getting started with Play Framework templates, I created the following example, which may be a little more simple. First, we define the template function (including an optional comment):
@*-------------------------*@ @* A UL/LI helper function *@ @*-------------------------*@ @ul(list: List[Any]) = { <ul> @list.map { e => <li>@e</li> } </ul> }
Then, somewhere later in the body of our template, we call this function:
@ul(List("apple", "banana", "cherry"))
As you might guess, this emits the following HTML output:
<ul> <li>apple</li> <li>banana</li> <li>cherry</li> </ul>
Another function
This small template function creates a URL string from the given symbol, where the symbol is a String like "AAPL" or "GOOG":
@getYahooUrl(symbol: String) = @{ "http://finance.yahoo.com/q/ks?s=%s+Key+Statistics".format(symbol.trim.toUpperCase) }
Note the places where I had to include the @
symbol.
I call that function from a later spot in my Play template like this:
<a href="@getYahooUrl(stock.symbol)" target="_blank">Go to Yahoo</a>
Again, the field stock.symbol
will be a String like "AAPL" or "GOOG".
this post is sponsored by my books: | |||
#1 New Release |
FP Best Seller |
Learn Scala 3 |
Learn FP Fast |
Closing thoughts
I'm not sure why the Play Framework documentation specifically refers to code like this as a reusable block instead of a function; I don't know how the code compiles down. I do know that a Play template is compiled to a function, but I don't know about code blocks like this. I prefer to call them functions, because that's what they look like, and that's how I use them. You declare them with function parameters, then pass parameters in when you call the function.
I'll try to add more examples here over time, but until then, I hope this is helpful.