如何用grails paginate标签中的页码替换offset和max?

时间:2014-05-12 21:04:57

标签: grails pagination

Grails Paginate标签生成带有max和offset params的链接。实施例

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

假设我们的常数最大值等于30。

是否有可能让它生成页码?

/?page=1
/?page=2

2 个答案:

答案 0 :(得分:1)

您可以更改控制器本身。类似的东西:

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)
    ....
}

未经测试,但应该有效。

视图标记也应该更改,就像第一条评论一样。

答案 1 :(得分:0)

这是我的解决方案

在控制器中:

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

在标签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
}

所以我们可以在gsp视图中使用my.paginate,就像我们使用标准grails gsp paginate标签一样。期待您的反馈和改进