Играть в 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

Другие вопросы по тегам