2013-05-17 9 views
7

W moim formularzu, jakie zdefiniowano rozwijaną:Jak zezwolić na domyślny wybór wartości w helperie @select?

@select(
myForm("category_id"), 
options(Category.options()), 
'_label -> "Category", 
'_default -> "-- Choose a Category --", 
'_showConstraints -> false 
) 

w kodzie kontrolera:

Form<Category> catForm = form(Category.class).bindFromRequest(); 
if(catForm.hasErrors()) { 
return badRequest(categoryEdit.render(catForm)); 
} 

Złożenie forma nie pozwala mi wybrać domyślną wartość i catForm.hasErrors() jest prawdziwe, jeśli nie dokonam selekcji. Dwa pytania:

  1. Jak ustawić domyślną wartość na liście rozwijanej?

  2. Chcę ustawić domyślną wartość na -1, gdzie ją ustawić? (Może to gdzie jest problem, nie ma wartości związane z -- Choose a Category -- opcji?)

Odpowiedz

1

Można napisać alternatywę dla Play's HTML select helper który akceptuje krotki dla opcji domyślnej. W ten sposób możesz określić zarówno wartość bazową, jak i tekst, który ma zostać wyświetlony.

Oto pierwsza próba, niektóre Scala tutaj jest co prawda trochę amator:

app/views/_my_select.scala.html

@(field: play.api.data.Field, options: Seq[(String,String)], args: (Symbol,Any)*)(implicit handler: helper.FieldConstructor, lang: play.api.i18n.Lang) 

@import helper.input 

@getAsTuple(x : Any) = @{ 
    x match { 
    case (value: String, text: String) => (value, text) 
    case _ => ("-1", "Select") 
    } 
} 

@input(field, args:_*) { (id, name, value, htmlArgs) => 
    <select id="@id" name="@name" @toHtmlArgs(htmlArgs)> 

    @args.toMap.get('_default).map { dv => 
     <option class="blank" value="@getAsTuple(dv)._1">@getAsTuple(dv)._2</option> 
    } 

    @options.map { v => 
     <option value="@v._1" @(if(value == Some(v._1)) "selected" else "")>@v._2</option> 
    } 
    </select> 
} 

Wykorzystanie

@_my_select(
    myForm("category_id"), 
    options(Category.options()), 
    '_label -> "Category", 
    '_default -> ("-1" -> "-- Choose a category --"), 
    '_showConstraints -> false 
) 
+0

Otrzymuję ten błąd -> niedopasowanie typu; found: (play.api.data.Field, Seq [(String, String)], Array [(Symbol, Any)]) => play.api.templates.Html required: views.html.helper.FieldElements => graj .api.templates.Html Uwaga: niejawna metoda implicitFieldConstructor nie ma tutaj zastosowania, ponieważ pojawia się po punkcie aplikacji i nie ma jawnego typu wyniku. – Manoj

3

aviks sugestia działa. Być może nie zaimportowałeś szablonu poprawnie. Zrobiłem to w ten sposób. Najpierw stworzył customSelectField.scala.html w views/helper/ jak sugeruje Avik:

@(field: play.api.data.Field, options: Seq[(String,String)], args: (Symbol,Any)*)(implicit handler: FieldConstructor, lang: play.api.i18n.Lang) 

@getAsTuple(x : Any) = @{ 
    x match { 
     case (value: String, text: String) => (value, text) 
     case _ => ("-1", "Select") 
    } 
} 

@input(field, args:_*) { (id, name, value, htmlArgs) => 
    <select id="@id" name="@name" @toHtmlArgs(htmlArgs)> 


@args.toMap.get('_default).map { dv => 
    <option class="blank" value="@getAsTuple(dv)._1">@getAsTuple(dv)._2</option> 
} 

@options.map { v => 
    <option value="@v._1" @(if(value == Some(v._1)) "selected" else "")>@v._2</option> 
} 
</select> 
} 

a potem w moim szablonu np index.scala.html gdzie chcę wybierz robię:

@import helper._ 

@helper.customSelectField(
field = proposeNewTimeForm("selectTime"), 
options = times.get, 
'_label -> "Category", 
'_default -> ("-1" -> "-- Choose a category --"), 
'_showConstraints -> false 
) 

Zapamiętaj należy NIE zrobić:

@implicitField = @{ 
     FieldConstructor(helper.customSelectField.f) 
    } 

ponieważ spowoduje to Twój erro r.

Jeśli chcesz sformatować html otaczający wybierz jakoś można zrobić tak jak z customField.scala.html w widokach/pomocnik /:

@(elements: helper.FieldElements) 

@elements.input 
<span class="errors">@elements.errors.mkString(", ")</span> 
<span class="help">@elements.infos.mkString(", ")</span> 

a następnie w górnej części index.scala.html:

@import helper._ 
@implicitField = @{ 
    FieldConstructor(helper.customField.f) 
} 

Mam nadzieję, że to pomoże!

+0

Dzięki Jakob, spróbuję i wrócić, jeśli potrzebna jest jakakolwiek dalsza pomoc. – Manoj

1

Miałem podobny problem i znalazłem prostsze rozwiązanie.
Zamiast gry!pomocnicy wypróbowują to w swoim formularzu:

<select name="category_id"> 
    <option value="-1">-- Choose a Category --</option> 
    @(for((key, value) <- Category.options()){ 
     <option value="@value"> @key </option> 
    } 
</select> 
+0

Dziękuję Arturas, spróbuję – Manoj

Powiązane problemy