Оказывается, что текущее воплощение скалирующего модуля 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>
}