在Play 2自定义FieldConstructor中添加类到输入

时间:2013-12-04 00:53:56

标签: playframework playframework-2.0

我在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元素。

4 个答案:

答案 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""")
  }
}

该方法非常简单,它会尝试修改第一个classinputtextarea HTML元素的select元素,然后创建{{ 1}}元素,如果它尚不存在。如有必要,您可以向class列表添加更多元素。这适用于某些引导模板,您必须在另一个input|textarea|select中嵌入一些元素。

然后,在您的模板中,只需导入此方法并使用您的类值调用它:

div