Playテンプレートレイヤーでジェネリックスのサポートが不足しているため、キャッチ22の状況に陥っています。
私はいくつかのショッピングカート画面を持っていますが、それらはすべてユーザーと支払い+オプションのカスタムフィールドを必要とします。
case class Conference(
user: User,
payment: Payment
... custom fields here
)
そのため、ショップカートモデルごとにすべてのユーザーフィールドと支払いフォームフィールドを複製するのではなく、上記のように統合し、ネストされたフォームを実装しました。
現在、この問題は、現在ジェネリックスがサポートされていないテンプレートレイヤーで発生します。
親/コンテナフォームは、次のようにネストされた子フォームをプルします。
@(_form: Form[Conference])
@user.nested( UserForm.form.fill(_form.get.user) )
@payment.nested( PaymentForm.form.fill(_form.get.payment) )
子のユーザーフォームは次のようになります。
@(_form: Form[User])
@inputText(_form("user.firstName"), '_label-> "First Name*", 'class-> "required")
@inputText(_form("user.lastName"), '_label-> "Last Name*", 'class-> "required")
...
およびユーザーモデル:
case class User(firstName: String, lastName: String ...)
ユーザーモデルにユーザープロパティがない場合、「user.firstName」、「user.lastName」などにアクセスするにはどうすればよいですか?Playフォームの適用方法は次のとおりです。
def apply(key: String): Field = Field(
this,
key,
constraints.get(key).getOrElse(Nil),
formats.get(key),
errors.collect { case e if e.key == key => e },
data.get(key))
data.user.firstName
基本的には、明らかに機能しないプロパティを探します。
ユーザーモデルにユーザープロパティを追加することを考えました。
case class User(firstName: String, lastName: String ...) {
val user: User
}
しかし、それが機能するかどうか、および/またはケースクラスのコンパニオンオブジェクトが適用/非適用で大混乱を引き起こすかどうかはわかりません。
とにかく、ジェネリックが不足していることを考えると、問題の実行可能な解決策は何ですか?
ジェネリックスがサポートされていれば、上限を渡すことができ、すべてがバラ色になります。
trait CartOrder {
user: User,
payment: Payment
}
case class Conference(...) extends CartOrder
次に、ネストされたユーザーフォームに、ユーザープロパティを含むインスタンスが渡されます。
@[T <: CartOrder](_form: Form[T])
@inputText(_form("user.firstName"), '_label-> "First Name*", 'class-> "required")
...