我正在创建自定义HTML以获取电话号码的输入。这应该是一个控制组,其中包含电话类型的选择框和电话号码的文本框。布局需要与内置HTML帮助程序@select和@inputText的布局不同。所以我的代码如下:
@phoneGroup(field: Field, className: String = "phone") = {
<div class="control-group">
<label class="control-label" for="@field("type").id">@Messages("company.phoneNumbers")</label>
<div class="controls">
<select id="@field("type").id" name="@field("type").name">
@options(models.PhoneType.options)
</select>
<input type="text" id="@field("number").id" name="@field("number").name" value="@field("number").value">
</div>
</div>
}
我在下面的模板中将其称为如下:
@repeat(companyForm("phones"), min = 2) { phone =>
@phoneGroup(phone)
}
在生成的HTML中,除了由
生成的部分外,到目前为止一切看起来都很好@options(models.PhoneType.options)
这是一个生成的HTML:
<div class="control-group">
<label class="control-label" for="phones_0__type">Phone numbers</label>
<div class="controls">
<select id="phones_0__type" name="phones[0].type">
(MAI,Main)(MOB,Mobile)(FAX,Fax)(CUS,Custom)
</select>
<input type="text" id="phones_0__number" name="phones[0].number" value="">
</div>
</div>
显然,@ options只输出我在models.PhoneType.options中传递给它的Map的字符串表示。所以问题是,如何使用@options helper生成以下HTML:
<option value="MAI">Main</option>
<option value="MOB">Mobile</option>
<option value="FAX">Fax</option>
<option value="CUS">Custom</option>
我是一名Java程序员,我对Scala没有任何经验。这可能是一件微不足道的事情,但我没有找到任何例子。
提前谢谢你。 - 德米特里
更新2013-11-07 - 在下面的“答案”部分中发布了解决方案
答案 0 :(得分:0)
@options只是一个对象,不处理输出HTML本身。这是在传递options对象的“select”帮助器中完成的。如果您不能使用@select,则可以将相关位复制出源https://github.com/playframework/playframework/blob/master/framework/src/play/src/main/scala/views/helper/select.scala.html。
答案 1 :(得分:0)
感谢大卫提供的线索。我没有使用@select的原因是因为它还在select标签周围生成了一些格式化HTML,我想控制布局组件。由于我没有弄清楚如何正确定制@select我现在就走这条路了。好的,正如你所建议的那样,我只是复制了Scala代码选项,它就是诀窍:
<select id="@field("type").id" name="@field("type").name" class="input-small">
@options(models.PhoneType.options).map { v =>
<option value="@v._1"
@if(Some(v._1) == (field("type").value)) { selected }>@v._2</option>
}
</select>
唯一的问题是,我必须在inputRadioButtonGroup代码(https://github.com/playframework/playframework/blob/master/framework/src/play/src/main/scala/views/helper/inputRadioGroup.scala.html)中使用Some(v._1),否则比较不起作用。我必须学习一点scala才能理解为什么:)
或者,for循环也可以,如下所示:
<select id="@field("type").id" name="@field("type").name" class="input-small">
@for((value, text) <- models.PhoneType.options) {
<option value="@value"
@if(Some(value) == (field("type").value)) { selected }>@text</option>
}
</select>