Играть в framework-1.x нумерация страниц начинается с определенной позиции
У меня есть вопрос о модуле разбивки на страницы в Play Framework (версия 1.x), у меня есть разбивка на страницы, чтобы показать только один объект на страницу, и некоторые другие индивидуальные настройки в контроллере:
import java.util.ArrayList;
import java.util.List;
import play.modules.paginate.ValuePaginator;
import play.mvc.Controller;
public class Application extends Controller {
public static void index() {
List<String> strings = new ArrayList<String>();
strings.add("Kalle");
strings.add("Karin");
strings.add("Dixie");
strings.add("Edvin");
strings.add("Gustav");
strings.add("Axel");
int pos = 0;
for(String str : strings){
if(str.equals("Axel")){
pos += strings.indexOf(str);
break;
}
}
ValuePaginator namePaginator = new ValuePaginator(strings);
namePaginator.setPageSize(1);
namePaginator.setBoundaryControlsEnabled(false);
namePaginator.setPagesDisplayed(0);
renderArgs.put("pos", pos);
renderArgs.put("namePaginator", namePaginator);
render();
}
И в шаблоне:
#{extends 'main.html' /}
#{set title:'Home' /}
*{#{welcome /}}*
${pos}
#{paginate.controls items:namePaginator /}
#{paginate.list items:namePaginator, as:'name'}
${name}
#{/paginate.list}
*{#{list items:strings[pos], as:'string'}
${string}
#{/list}}*
Теперь, как вы могли видеть в последней части шаблона, есть закомментированная часть, использующая обычный тег groovy list, и, поскольку он имеет фактический список, я могу заставить список начинаться с заданной позиции "pos", это однако невозможно в случае использования нумерации страниц. В случае "items:namePaginator" это просто заполнитель имени для базового списка и не является итеративным, есть ли способ начать нумерацию страниц с указанной позиции в упакованном списке?
Большое спасибо!
1 ответ
Мне удалось решить эту проблему с помощью JQuery вместо использования модуля разбивки на страницы Play Frameworks для этого особого случая разбивки на страницы.
Принцип работает следующим образом: в действии контроллеров обычный Java ArrayList, состоящий из объектов на мой взгляд, этот ArrayList затем преобразуется в jsonObject с использованием включенной библиотеки Gson (в Play Framework).
Gson gson = new Gson();
String jsonObj = gson.toJson(objects);
Используя
renderArgs.put("jsonObj", jsonObj);
в действии контроллера для передачи json в шаблон, кстати, в первую очередь моей причиной было сделать все возможное, чтобы начать "разбивать на страницы" через объекты клиентов с любой позиции в списке объектов, и скрытый div в шаблоне.
Далее я использую JQuery, чтобы забрать список,
$.parseJSON($('#myhiddenlist'));
А затем снова используйте JQuery для перехода назад и вперед (перехват событий щелчка по тегам привязки для prev и next) по списку и отображение соответствующего объекта на странице. Еще одним преимуществом использования JQuery (или, если на то пошло, javascript) является то, что мне не нужно беспокоиться о перезагрузке страницы, как в случае с модулем разбиения на страницы Play Frameworks.
JQuery-часть
$(function(){
var ourlist = $('#ourlist').text();
var jsonOur = $.parseJSON(ourlist);
var length = jsonOur.length;
var pos = parseInt($('#ourpos').text());
var showList = $('#showlist');
showList.append(jsonOur[pos].name);
initControls();
function hasPrev(){
if(pos > 0){
return true;
}else{
return false;
}
}
function hasNext(){
if(pos < (length - 1)){
return true;
}else{
return false;
}
}
function showItem(pos){
showList.empty();
showList.append(jsonOur[pos].name);
}
$('.previous a').click(function(e){
if(hasPrev()){pos--;}
if(hasPrev()){
$('li.next').removeClass('off');
$('li.next a').css('color', 'blue');
}else{
$('li.previous').addClass('off');
$('li.previous.off a').css('color', 'grey');
}
showItem(pos);
});
$('.next a').click(function(e){
if(hasNext()){pos++;}
if(hasNext()){
$('li.previous').removeClass('off');
$('li.previous a').css('color', 'blue');
}else{
$('li.next').addClass('off');
$('li.next.off a').css('color', 'grey');
}
showItem(pos);
});
function initControls(){
if(hasNext()){
$('li.previous').removeClass('off');
}else{
$('li.next').addClass('off');
$('li.next.off a').css('color', 'grey');
}
if(hasPrev()){
$('li.next').removeClass('off');
}else{
$('li.previous').addClass('off');
$('li.previous.off a').css('color', 'grey');
}
}
//for testing only
function showPos(pos){
console.log(pos);
}
});
HTML часть
#{extends 'main.html' /}
#{set title:'Home' /}
#{content.rightside Pos: pos /}<!-- loads the side content -->
<div id="ourlist" class="hide">${jsonOurList}</div>
<div id="ourpos" class="hide">${pos}</div>
<ul class="pagination">
<li class="previous"><a href="#">Prev</a></li>
<li class="next"><a href="#">Next</a></li>
</ul>
<div id="showlist"></div>
CSS часть
ul.pagination li {
display: inline;
}
ul.pagination li a {
outline: none;
text-decoration: none;
}
li.previous.off a,
li.next.off a {
color: grey;
cursor: default;
}
li.previous a,
li.next a {
color: blue;
cursor: pointer;
}
.hide {
display: none;
}
Итак, на самом деле это не решение для настройки модуля Play, а более прагматичный подход с использованием JQuery.
Надеюсь, что это может помочь любому, имеющему подобную проблему.
// Kalle