我在Play 2中制作自定义字段构造函数:
@(elements : helper.FieldElements)
<div class="@if(elements.hasErrors) {error}">
<label for="@elements.id">@elements.label</label>
<div class="input">
@elements.input
<span class="errors">@elements.errors.mkString(", ")</span>
<span class="help">@elements.infos.mkString(", ")</span>
</div>
</div>
我需要输入元素始终具有特定的类“my-class”。我怎样才能做到这一点? FieldElements类有一个args成员。我尝试将带有“my-class”的元素的副本附加到与args中的'_class相关联的值,但这似乎不会影响input元素。
答案 0 :(得分:3)
Play Framework中自定义输入的一种方法是
@(elements: helper.FieldElements)
<div class="form-group @elements.args.get('_class) @if(elements.hasErrors) {has-error}" id="@elements.args.get('_id).getOrElse(elements.id + "_field")">
@if(elements.hasName) {
<label class="control-label" for="@elements.id">@elements.name</label>
} else {
<label class="control-label" for="@elements.id">@elements.label(elements.lang)</label>
}
@if(elements.input.toString().contains("class=")) {
@Html(elements.input.toString().replaceFirst("(class=[\"'])", "$1form-control "))
} else {
@Html(elements.input.toString().replaceFirst("(<\\w+ )", "$1class=\"form-control\" "))
}
@elements.errors.map { error =>
<p class="help-block">@error</p>
}
@elements.infos.map { info =>
<span class="help-block">@info</span>
}
</div>
答案 1 :(得分:1)
这应该可以解决问题:
@inputText(myForm("fieldName"), 'class -> "my-class")
更新:
好的,你想覆盖@element.input
对吗?您可以查看源代码并创建自己的标记(帮助程序):https://github.com/playframework/playframework/blob/master/framework/src/play/src/main/scala/views/helper/inputText.scala.html
答案 2 :(得分:1)
在Field构造函数中替换
@elements.input
使用:
@Html(elements.input.body.dropRight(2)+"class='form-control'>")
这可能不是最正确的但是它可以完成这项工作 但要注意文本区域,这需要额外的努力。
答案 3 :(得分:1)
基于Nguyen answer我创建了一个更健壮的方法,它只修改所需的元素,并且还会重用正则表达式。
object Helper {
import views.html.helper.FieldConstructor
implicit val inlineBootstrapConstructor = FieldConstructor(fieldConstructorTemplate.f)
val classRegex = "(?s)(<(?:input|textarea|select)[^>]*\\sclass=[\"'])".r
val noClassRegex = "(?s)(<(?:input|textarea|select))((?:(?!\\sclass=\").+)>)".r
def addClassValue(text: String, classValue: String) = {
val str = classRegex.replaceFirstIn(text, s"$$1$classValue ")
noClassRegex.replaceFirstIn(str, s"""$$1 class="$classValue"$$2""")
}
}
该方法非常简单,它会尝试修改第一个class
,input
或textarea
HTML元素的select
元素,然后创建{{ 1}}元素,如果它尚不存在。如有必要,您可以向class
列表添加更多元素。这适用于某些引导模板,您必须在另一个input|textarea|select
中嵌入一些元素。
然后,在您的模板中,只需导入此方法并使用您的类值调用它:
div