2

私はPlayFrameworkを初めて使用しますが、新しいScalaテンプレートエンジンを使って頭を悩ませようとしています。

次のパッケージ構造があるとしましょう。

app/
app/controllers/Items.scala
app/models/Item.scala
app/views/layouts/page.scala.html
app/views/item/show.scala.html
app/views/item/details.scala.html  //partial

そしてこれは私のアイテム/ショーテンプレートです:

    @(item: Item, form: Form[Item])(implicit flash: Flash)
    @layout.page() {
        @*want to include details partial, wont work due to item param*@
        @item.details(item)
    }

別のテンプレートを含める(たとえば、上記のアイテム/詳細を含める)ことは、テンプレートパラメータ(たとえば、上記のアイテム)にアクセスするのとまったく同じ構文であるため、この既存の命名規則は、何かを変更しないと機能しないことは明らかです。

「app.views.item」パッケージの名前を「app.views.items」に変更し、単数形/複数形を使用してビューをパラメーター名と区別できることはわかっていますが、これは非常に簡単な解決策とは思えません。また、パラメータ名をビューパッケージと同じにしたい場合はどうすればよいですか?

私が持っているアイデアの1つは、すべてのビューに追加のトップレベルパッケージを追加することです。

 app/views/views/item/details.scala.html

したがって、インクルード構文は@ views.item.details()になりますが、これも明らかにハックです。

この問題を回避するための良い方法は何ですか?このような名前の衝突を回避するために、コードをより適切に整理するにはどうすればよいですか?

他のほとんどのテンプレートエンジンは、「include」や「render」などの操作を使用して、部分的なインクルードを指定します。ここで誰かを怒らせるつもりはありませんが、Play Scalaテンプレートエンジンの構文は非常に簡潔なので、実際にコードの構成を決定しますか?

4

1 に答える 1

1

3つの解決策:

初め

ドキュメントtagsで説明されているように使用する必要がある部分的なテンプレートの典型的な例です。ここで、フォルダはベースです。app/views/tags

ファイル:app/views/tags/product.scala.html

テンプレート内(親ビューの完全な構文で初期インポートは必要ありません。これにより、名前の衝突を回避できます:) @tags.packageName.tagName()

<div id="container">
    @tags.product(item)
</div>

もちろん、あなたの場合、ベースフォルダのパッケージを使用することもできます

ファイル:app/views/tags/item/product.scala.html

<div id="container">
    @tags.item.product(item)
</div>

私はそれがあなたの問題を解決するとかなり確信しています。

2番

パッケージの名前を変更せずに衝突を回避するには、ビューで名前を変更するだけです。また、ヘルパーと競合する可能性があるため、Form[T]itemの名前は使用しないことをお勧めします。form

@(existingItem: Item, existingItemForm: Form[Item])(implicit flash: Flash)
@layout.page() {
    @item.details(existingItem)
}

第3

Form[Item]ビューに渡す前に特定のオブジェクトを入力する場合Itemは、両方を渡す必要はありません。おそらく、フォームからデータを取得できるからです。

@(itemForm: Form[Item])(implicit flash: Flash)
@layout.page() {
    <div>Name of item is: @itemForm("name").value (this is a replacemnet for @@existingItem.name </div>
    @item.details(itemForm)
}

もちろん、product.scala.htmlでは、パラメーターを次のように変更する必要があります@(item: Item)@(itemForm: Form[Item])

于 2012-10-20T15:18:37.463 に答える