Grails Paginate tag generates links with max and offset params. Example

/?max=30&offset=0
/?max=30&offset=30

Say we have constant max equals 30.

Is there any possibility to make it generate page numbers instead?

/?page=1
/?page=2
有帮助吗?

解决方案 2

This is my solution

In controller:

params.max = 30
if(params.long('page')) {
    params.offset = (params.long('page') - 1) * params.max
}

In tag lib:

static namespace = "my"

private final static Pattern OFFSET_PATTERN = Pattern.compile("offset=(\\d+)");

def paginate = { attrs, body ->
    String str = g.paginate(attrs) // using grails gsp paginate tag
    // make sure we delete max param with & (before or after)
    str = str.replaceAll(/&max=\d+/, '').replaceAll(/max=\d+&/, '')
    while (true) {
        Matcher matcher = OFFSET_PATTERN.matcher(str)
        if (matcher.find()) {
            long pageNum = (matcher.group(1) as long)/params.long('max') + 1
            // replace offset=0 with page=1, offset=30 with page=2, etc
            str = matcher.replaceFirst('page=' + pageNum)
        } else {
            break;
        }
    }
    out << str
}

So we can use my.paginate in our gsp views the same way we use standard grails gsp paginate tag. Looking forward your feedbacks and improvements

其他提示

You could change the controller itself. Something along the line of:

def myMethod() {
    params.max = 30
    params.offset = (params.max * params.page) - params.max //todo - make sure page is bigger than one :-)
    def listOfItemsYouWantToShow = MyPerfectDomainClass.list(params)
    ....
}

not tested, but should work.

The view tag should be also changed, just like the first comment.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top