Есть ли лифт + скалате полный пример? - PullRequest
2 голосов
/ 26 марта 2011

Есть пример Hello Scate, но его слишком просто изучить. Я хочу знать, как интегрировать лифт и масштабировать, например, лифт кометы, лифт формы ...

Ответы [ 3 ]

1 голос
/ 10 февраля 2013

Оказывается, что текущее воплощение скалирующего модуля Lift (2.5) не работает (в смысле интеграции с фрагментами и кометой).Проблема состоит в том, что модуль scalate помещает средство визуализации scalate в конвейер как нечто, генерирующее завершенный ответ.

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

Чтобы получить то, что вы действительно хотите, вы должны взломать загрузчик шаблонов (что, к счастью, позволяет Lift).

Я немного поиграл с этим и немного сорвалкода из модуля.Это работает для меня (хотя для этого нужно много вещей, таких как кэширование шаблона, поддержка локали, режим разработки или рабочий режим, возможно, некоторые параметры конфигурации (например, в производственном режиме вы хотите, чтобы scalate обрабатывал scaml каждый раз, или просто при начальной загрузке?).

В Boot.scala:

ScalamdTemplateLoader.init

, где ScalamdTemplateLoader.scala равен

... other imports ...
import net.liftmodules.scalate.LiftTemplateEngine

object ScalamdTemplateLoader extends Loggable {
  val renderer = new LiftTemplateEngine
  def init = {
    LiftRules.externalTemplateResolver.default.set(scalateTemplateLoader _)
  }

  protected def createUri(path: List[String], ext: String): String = path.mkString("/") +
    (if (ext.length > 0) "." + ext else "")

  protected def canLoad(v: String): Boolean = {
    renderer.canLoad(v)
  }

  def canRender(path: List[String], ext: String): Boolean = {
    if (ext == "") {
      canLoad(createUri(path, "scaml")) || canLoad(createUri(path, "ssp"))
    } else {
      val uri = createUri(path, ext)
      (uri.endsWith(".ssp") || uri.endsWith(".scaml")) && canLoad(uri)
    }
  }

  def scalateTemplateLoader: PartialFunction[(Locale, List[String]), Box[NodeSeq]] = {
    case (l: Locale, path: List[String]) if (canRender(path, "")) => {
      val uri: String = List("scaml", "ssp").map(createUri(path, _)).find(renderer.canLoad(_)).get
      val rawTemplate = renderer.layout(uri)
      val is = new ByteArrayInputStream(rawTemplate.getBytes("UTF-8"));
      val parserFunction: InputStream => Box[NodeSeq] = S.htmlProperties.htmlParser
      parserFunction(is)
    }
  }
}

большая часть этого кода извлекается непосредственно из модуля (см. ScalateView... что приводит к LiftResponse) ... подставляя его в качестве внешнего загрузчика шаблонов и выполняя его через S.htmlParser, мы получаем шаблон, который подается во все подсистемы лифта ...используется в качестве источника шаблона для Lift вместо источника ответа.

Когда я передаю шаблон, подобный этому:

%html{:xmlns => "http://www.w3.org/1999/xhtml", "xml:lang" => "en", :lang => "en"}
  %body
    %p Hi there
    %div.crap This is some crap
    %div(class="lift:Demo1.currentTime")
      %p I am having fun at 
      %span.time

Я получаю ожидаемый ответ из фрагмента Demo1:

class Demo1 {
  def currentTime(n : NodeSeq) : NodeSeq = <span class="time">{ new Date().toString }</span>
}
0 голосов
/ 19 октября 2011

Вы найдете их в This pdf

0 голосов
/ 28 марта 2011

Так же, как и с любым другим механизмом шаблонов Lift.

Фрагменты могут быть вызваны:

<div class="lift:MySnippet">...</div>

и Comet это просто фрагмент:

<div class="lift:comet?type=MyCometThing">...</div>

https://groups.google.com/d/topic/liftweb/f_zOj3ZOLQg/discussion

...