понедельник, ноября 15, 2010

Scala/Lift и аналог if из http://java.sun.com/jsp/jstl/core taglib

Создатель Lift framework David Pollak, так же как и создатели Wicket категорически против вычисляемых выражений в разметке шаблонов. С ними, судя по реализации, не согласны авторы JSP с jstl. Лично мне кажется что истина где-то посредине и плохо иметь невалидные шаблоны, также как и плохо не иметь возможности использования небольшого количества простых вычисляемых конструкций в шаблонах. Тут как всегда важен баланс и мера.
Вот допустим стоит простая практическая задача - разное меню для авторизованного и не авторизованного пользователя. Конечно, этот вопрос может быть решен совершенно разными способами, самый прямой из которых - отдельный сниппет:
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

Scala/Lift Links 2010-11

Lift Wiki
Актуальный репозиторий lift framework с примерами
Пример lift-приложения на GAE
Многоуровневое меню
Стилизация меню
Установка sbt
Пример конфигурации sbt
Один ко многим в lift mapper
Пример приложения 

Интересные топики из Lift Groups:

воскресенье, ноября 07, 2010

Мой список блогов