Виджеты Play 2.0

Я изучаю учебные пособия для Play 2.0 со Scala и работаю с шаблонами форм и конструкторами полей.

Есть ли хороший способ добавить поле календаря, например, с Primefaces (JSF):

<p:calendar value="#{home.to}" pattern="dd.MM.yyyy" />

Я могу представить себе такого помощника, как:

@helper.calendar(form("to"))

Если он не существует, находится ли он в разработке?


person John Smith    schedule 22.09.2012    source источник


Ответы (1)


В Play нет тега выбора даты/времени, причина довольно проста: поскольку Play — это фреймворк, а не CMS, по умолчанию нет внешней библиотеки, включенные теги Bootstrap де-факто помещаются в Play... случайно :).

В прошлый раз, когда мне понадобилось такое поле, я использовал комбинацию двух плагинов Bootstrap:

Поскольку они мне нравятся по отдельности... Конечно, вы можете поискать другое решение, объединяющее средства выбора даты и времени, например: http://dl.dropbox.com/u/143355/datepicker/datepicker.html, все зависит от ваших потребностей и используемых решений FE (если вы не используете Bootstrap, вы можете для например, используйте образцы jQuery UI).

Редактировать: helpers представляют собой не что иное, как готовые к использованию мини-шаблоны, встроенные в Play, написанные с использованием синтаксиса Scala для динамических частей, единственной задачей которых является создание фрагментов HTML. Как я уже сказал, в Play нет такой большой библиотеки, как вы показали, однако вы также можете написать такие вещи (т.е. в пакет tags) также с динамическими параметрами, а затем использовать их точно так же, как они были помощниками.

На самом деле я использую эти упомянутые плагины Bootstrap таким образом:

app/views/tags/datePickerJs.scala.html

<!-- first line has to be empty, as that's place for defining views arguments - remove this comment...-->
<script type="text/javascript">
    function setToday(datePickerSetId) {
        var currentServerDate = "@DatepickerUtils.getCurrentDate()";
        var currentServerTime = "@DatepickerUtils.getCurrentTime()";
        $("#" + datePickerSetId + "Date").val(currentServerDate);
        $("#" + datePickerSetId + "Time").val(currentServerTime);
        $("#" + datePickerSetId + "DateContainer").data('date', currentServerDate);
        $("#" + datePickerSetId + "DateContainer").datepicker('update');
    }
</script>

app/views/tags/dateTimePicker.scala.html

@(label: String, prefix: String, dateString: String=null)

<label for="@{prefix}Date">@label </label>

<btn id="@{prefix}" class="datePickerSetNow btn pull-left" onclick="setToday('@{prefix}'); return false;">teraz</btn>
<div class="input-append date pull-left datePickerDateContainer" id="@{prefix}DateContainer" data-date='@DatepickerUtils.splitDateTime(dateString, 0, true)' da$
<input class="span2" size="16" type="text" value='@DatepickerUtils.splitDateTime(dateString, 0)' name="@{prefix}Date" id="@{prefix}Date">
<span class="add-on"><i class="icon-calendar"></i></span>
</div>

<div class="input-append bootstrap-timepicker-component datePickerTimeContainer">
    <input type="text" class="@{prefix}Time input-small" name="@{prefix}Time" id="@{prefix}Time">
    <span class="add-on"><i class="icon-time"></i></span>
</div>

<script type="text/javascript">
    $('#@{prefix}DateContainer').datepicker({weekStart:1, language:'pl'});
    $('#@{prefix}Time').timepicker({
        minuteStep:5, template:'dropdown', showMeridian:false, defaultTime:'@DatepickerUtils.splitDateTime(dateString, 1)'
    });</script>

Таким образом, в любом представлении вы можете использовать его позже:

@tags.dateTimePicker(
   "Event's start",
   "eventStartDate",
   myForm("eventStart").value
)

@tags.dateTimePicker(
   "Event's end",
   "eventEndDate",
   myForm("eventEnd").value
)

<!-- once per view at the end -->
@tags.datePickerJs()

Конечно, этот пример для Bootsrtap подготовлен для моих полей и требует дополнительных методов в классах Java, поэтому без изменений он не будет работать. В общем хочу продемонстрировать вам идею tags.

Конечно, я согласен с вами, что было бы идеально, если бы подобный API был доступен для простой установки для фреймворка Play, но я не уверен, планируют ли это разработчики Play... Вы должны спросить их. Скорее всего, это задача для автономного модуля, который нацелен на какую-то библиотеку JS, потому что, как я писал ранее, нет библиотеки внешнего интерфейса по умолчанию, которую вы должны использовать.

person biesior    schedule 23.09.2012
comment
Может быть, мне нужно немного изменить вопрос. Ни одно из этих решений не связано со Scala, это просто JS-библиотеки. Я хочу знать, будет ли библиотека помощников, чтобы я мог писать на Scala, например: @helper.calendar(form(to)) или @helper.rater(form(rating), readOnly -> false) и эти вызовы методов будут генерировать все HTML и javascript, необходимые для отображения календаря или виджета рейтинга. См. www.primefaces.org — там есть сотни готовых пакетов виджетов, которые можно интегрировать в JSF. Теоретически то же самое можно сделать и для Play. - person John Smith; 23.09.2012
comment
Да, я понял, о чем вы спросили. Я добавил некоторые уточнения. Я надеюсь, что это поможет вам лучше понять концепцию. В общем, что я хочу сказать, такого «сниппета» пока нет, но вы можете добавить его с помощью tags. - person biesior; 23.09.2012
comment
biesior, откуда берется DatepickerUtils? - person Mike Slinn; 05.02.2013