2016-10-10 12 views
0

Я пытаюсь использовать галочку для разбивки списка. Список определяется двумя критериями: строкой «имя» и «inCirculation» логическим.Каким образом можно передавать параметры в тег палитра гранул?

Эти два значения передаются индексного метода моего контроллера в качестве карты searchCriteria:

def index(Integer max) { 
    params.max = Math.min(max ?: 10, 100) 
    def searchCriteria = params.searchCriteria?: [inCirculation:"on", name:""] 

    def criteria = new DetachedCriteria(Copy) 

    if(searchCriteria.inCirculation=="on") { 
     criteria = criteria.and { 
      eq("inCirculation", true) 
     } 
    } 

    if(!searchCriteria.name.isEmpty()) { 
     criteria = criteria.and { 
      game { 
       like("name", "%${searchCriteria.name}%") 
      } 
     } 
    } 

    def results = criteria.list(params) 
    respond results, model:[searchCriteria: searchCriteria, copyInstanceList: results, copyInstanceCount: results.totalCount] 
} 

Карта searchCriteria имеет решающее значение в обеспечении того, что повторные вызовы метода индексной получить тот же набор результатов.

Очевидно, важно, чтобы тэг для разбивки на страницы сохранял критерии поиска, так что, когда пользователь нажимает на ссылку «next», выполняется тот же поиск, но отображается вторая страница результатов.

Я предполагаю, что поле params тега разбиения на страницы - это место, где я должен поместить свою карту поиска в Criteria, однако я не могу понять, как это сделать.

Я попытался очевидное:

<g:paginate params="${[searchCriteria: searchCriteria]}" total="${copyInstanceCount ?: 0}" /> 

но, как представляется, повернуть карту searchCriteria в строку:

| Error 2016-10-10 14:52:12,418 [http-bio-8080-exec-10] ERROR errors.GrailsExceptionResolver - MissingPropertyException occurred when processing request: [GET] /halcon-gaming-library/copy/index 
No such property: inCirculation for class: java.lang.String. Stacktrace follows: 
Message: No such property: inCirculation for class: java.lang.String 
    Line | Method 
->> 14 | index  in halcon.gaming.library.CopyController 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
| 198 | doFilter in grails.plugin.cache.web.filter.PageFragmentCachingFilter 
|  63 | doFilter in grails.plugin.cache.web.filter.AbstractFilter 
| 1145 | runWorker in java.util.concurrent.ThreadPoolExecutor 
| 615 | run . . . in java.util.concurrent.ThreadPoolExecutor$Worker 
^ 745 | run  in java.lang.Thread 

Я в настоящее время пытается взять строку с воссоздавать карту , но код становится запутанным. Это говорит мне, что я делаю что-то неправильно.

Каково правильное использование тегов палитра грааля с параметрами?

Incidently, решение, которое я придумал это:

if(searchCriteria instanceof String) { 
     println searchCriteria 
     searchCriteria = groovy.util.Eval.me(searchCriteria 
      .replaceAll('\\{', '[') 
      .replaceAll('\\}', ']') 
      .replaceAll('=', ':') 
      .replaceAll(':', ':"') 
      .replaceAll(',', '",') 
      .replaceAll(']', '"]')) 
    } 

, который работает только в случае, если пользователь не входит ни в одном из этих символов в поле имени. Это кажется супер опасным.

ответ

0

Попробуйте

<g:paginate params="${params}" total="${copyInstanceCount ?: 0}" />