2012-12-13 9 views
7

Play Framework 2テンプレート言語はかなりいいです。しかし、それはMicrosoftのRazor言語に触発されていますが、重要な設計上の決定事項の1つは、HTMLへのエスケープ方法です。 RazorはHTMLスタイルのタグを探し、Play 2は何らかのヒューリスティックを使用します。Play Framework 2でargsの可変数を受け入れるテンプレートを呼び出す方法

私はHTMLの複数のセクションを取り、ヘッダーと目次を含むページを生成するテンプレートを作成しようとしています。その2番目のパラメータはセクションの可変数であることを

@(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> 
    } 
} 

注:私の「structuredpage.scala.html」は、このようになります。 ではなく、が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> 
    } 
) 

... 5行目、すなわち上type mismatch; found : scala.xml.Elem required: play.api.templates.Htmlを与える、<p>Blah</p>がありますテンプレート文書HTMLではなく、Scalaとして解釈されます。

そして、この:

@() 
@import views.Common.section 

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

... 3行目type mismatch; found : play.api.templates.Html required: (String, play.api.templates.Html)を与える、すなわち、全体の外側のカーリーブレースブロックは、テンプレートドキュメントのHTMLとして解釈され、ない Scalaのコードのように! http://www.playframework.org/documentation/2.0/ScalaTemplateUseCases

任意のアイデア:

イライラ彼らは例えば、公式プレイ2ドキュメントのいくつかのコードのサンプルよりも非常に異なるように見えるではないのですか? (AUXILIAR方法の必要はありません)私はこのマシンでは今、この権利をテストすることはできませんプレイフレームワーク2.0.4

+0

あなたが得るコンパイルエラーは何ですか? –

+0

コンパイラのエラーとその問題に対する私の解釈を追加しました。要点は、Scalaコードとしてテンプレートをあまりにも多すぎるか小さすぎると解釈しているということです。 – andrewf

答えて

1

あなたが探しているものは次のとおりです。

structuredpage.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> 
    } 
} 

切断法けれどもそれはまさにFPはありません。

def section(title: String)(content: Html)(implicit sections: scala.collection.mutable.MutableList[Pair[String, Html]]) { 
    sections += title -> content 
} 
+0

ハハ!それは厄介で邪悪です!本当にそれは機能的ではありませんが、少なくとも不快感のほとんどは隠されています。それは動作し、セクションヘッダーはその内容に近接しています。 私は、Play Frameworkの人々がテンプレート言語のエスケープルールをもう一度見てもらいたいと思っていますが、このハックはその意味で役立ちます。 – andrewf

0

を使用していないんだけど、次は動作するはずです:ここでは

@() 

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

残念ながら!ちょうどそれを試して、それは私の2番目のコードの例と同じ方法で失敗します。 '型不一致。見つかった:play.api.templates.Html required :(String、play.api.templates.Html) '3行目。テンプレートコンパイラは、外側のcurley-bracesの内容全体をHTMLテンプレートの素材として解釈します。 – andrewf

+0

wlilこの夜にダブルチェックをしようとする理由 –

+0

(もちろん、追加の機能/テンプレートを避けることについて言及しています) – andrewf

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> 

structuredpage.scala.html

@(title: String)(sections: Html) 

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

私はその要旨を作りました:https://gist.github.com/4280577。だからあなたはそれをチェックして遊ぶことができます。

+0

ありがとうございますが、残念ながらそれは良いことではありません!元の質問を過度に単純化する私のせいで:私は 'セクション'のリストから '目次'を動的に作成したいので、 'セクション'をHTMLの一塊として取ることはできません。テンプレートはできるだけシンプルでなければならないと私は同意します。しかし、この場合、どのようにしてよりシンプルにして、私が望むことをやり遂げることができるかを知ることは難しいです。 – andrewf

+0

私は少なくとも私の答えにあなたのための回避策を追加しました。 – Schleichardt

+0

それはうまくいくかもしれない、ありがとう。タイトルはコンテンツの隣にはありませんが、それ以外は仕事をしているようです。私はそれを試してみる機会があったときにお知らせします。 – andrewf

関連する問題