Вот допустим стоит простая практическая задача - разное меню для авторизованного и не авторизованного пользователя. Конечно, этот вопрос может быть решен совершенно разными способами, самый прямой из которых - отдельный сниппет:
def userMenu(in: NodeSeq): NodeSeq = {
User.loggedIn_? match {
case true => Text(" userLoggedInMenu markup")
case false => Text("userNotLoggedInMenu markup")
}}
В коде шаблон и из файла можно взять или динамически составить, да по сути что угодно сделать. Но иногда хочется чтобы все было в разметке, потому что из вычислений, по большому счету, только одно сравнение, а переносить из-за этого все в код не кажется разумным. Явно не хватает аналога if из taglib http://java.sun.com/jsp/jstl/core. На самом деле, со снипеттами это совершенно не сложно и следующая конструкция даст вполне жизнеспособный вариант:
class UserSnippets {
def userLoggedIn(in: NodeSeq): NodeSeq = {
bind("userLoggedIn",in, if (User.loggedIn_?) "true" -> {node:NodeSeq => node} else "true" -> Text(""),
if (User.loggedIn_?) "false" -> Text("") else "false" -> {node:NodeSeq => node})
}}
Теперь в разметке можно написать:
<lift:usersnippets.userloggedin>
<userloggedin:true>
userLoggedInMenu markup
</userloggedin:true>
<userloggedin:false>
userNotLoggedInMenu markup
</userloggedin:false>
</lift:usersnippets.userloggedin>
и получить аналог if по User.loggedIn_? в разметке.
Видимо, следует ожидать в ближайшее время появление какого-нибудь lssl - Lift Standart Snippet Library, куда соберут самые массово используемые аналоги taglib из http://java.sun.com/jsp/jstl/core.
Upd: то же самое делает сниппет net.liftweb.builtin.snippet.TestCond. http://stackoverflow.com/questions/4297220/lifttestcond-how-it-works
Комментариев нет:
Отправить комментарий