7

Play Framework 2 模板语言非常好。然而,尽管它受到 Microsoft 的 Razor 语言的“启发”,但一个重要的设计决策却有所不同:如何“转义”为 HTML。Razor 查找 HTML 样式的标签,而 Play 2 使用某种启发式方法。

我正在尝试编写一个模板,该模板采用 HTML 的多个“部分”,并生成一个带有标题和目录的页面。我的 'structuredpage.scala.html' 看起来像这样:

@(title: String)(sections: Pair[String,Html]*)

@main(title){
    <nav class="page-links">
        @makeTableOfContents(sections)
    </nav>
    @for(section <- sections){
        <section id="@section._1">
            <h2>@section._1</h2>
            @section._2
        </section>
    }
}

请注意,它的第二个参数是可变数量的部分。在 Play 模板语言中似乎没有办法调用它。

我创建了一个名为的辅助函数Common.section,如下所示:

    def section(title: String)(content: Html) = title -> content;

我试过这个:

@()
@import views.Common.section

@structuredpage("Dashboard")(
    section("Latest Requests") {
        <p>Blah</p>
    },
    section("Your Details") {
        <p>Blah blah</p>
    }
)

type mismatch; found : scala.xml.Elem required: play.api.templates.Html在第 5 行给出,<p>Blah</p>即被解释为 Scala,而不是模板文档 HTML。

还有这个:

@()
@import views.Common.section

@structuredpage("Dashboard"){
    @section("Latest Requests") {
        <p>Blah</p>
    },
    @section("Your Details") {
        <p>Blah blah</p>
    }
}

type mismatch; found : play.api.templates.Html required: (String, play.api.templates.Html)在第 3 行给出,即整个外花括号块被解释为模板文档 HTML,而不是Scala 代码!

令人沮丧的是,它们似乎与 Play 2 官方文档中的一些代码示例没有太大不同,例如:http ://www.playframework.org/documentation/2.0/ScalaTemplateUseCases

有任何想法吗?我正在使用 Play Framework 2.0.4

4

3 回答 3

1

这就是您可能正在寻找的东西。虽然它不完全是 FP

结构化页面.scala.html

@(title: String)(content: scala.collection.mutable.MutableList[Pair[String, Html]] => Unit)

@main(title){
    @defining(new scala.collection.mutable.MutableList[Pair[String,Html]]()) { sections =>
        @content(sections)
        @for(section <- sections){
            <section id="@section._1">
                <h2>@section._1</h2>
                @section._2
            </section>
        }
    }
}

frontpage.scala.html

@()

@import views.Common.section

@structuredpage("Front Page") { implicit sections =>
    @section("Section 1") {
        <h1>stuff</h1>
    }

    @section("Section 2") {
        <h1>more stuff</h1>
    }
}

分段方法:

def section(title: String)(content: Html)(implicit sections: scala.collection.mutable.MutableList[Pair[String, Html]]) {
    sections += title -> content
}
于 2012-12-14T16:09:47.993 回答
0

我现在无法在这台机器上测试这个,但以下应该可以工作(不需要辅助方法):

@()

@structuredpage("Dashboard"){
   ("Latest Requests", {
        <p>Blah</p>
    }),
   ("Your Details", {
        <p>Blah blah</p>
    })
}
于 2012-12-13T15:52:41.697 回答
0

这是一种解决方法:

@import views.Common.section

@sec1 = { <p>Blah</p> }

@sec2 = { <p>Blah blah</p> }

@structuredpage("Dashboard")(
    section("Latest Requests")(sec1),
    section("Your Details")(sec2)
)

之前的尝试:

我认为你的愿望使它变得复杂。模板应该很简单。这是一个简单的替代方案:

index.scala.html

@structuredpage("Dashboard"){
    @section("Latest Requests") {
        <p>Blah</p>
    }

    @section("Your Details") {
        <p>Blah blah</p>
    }
}

section.scala.html

@(title: String)(content: Html)

<section id="@title">
    <h2>@title</h2>
    @content
</section>

结构化页面.scala.html

@(title: String)(sections: Html)

@main(title){
    <nav class="page-links">
        table-of-contents goes here
    </nav>
    @sections
}

我提出了一个要点:https ://gist.github.com/4280577 。因此,您可以查看并使用它。

于 2012-12-13T22:16:56.917 回答