Liferay search container pagination problem when passing form parameter SOLVED
Hello, guys!
I’ve been struggling for a couple of days trying to make my seach container pagination works.
When you clicking on the next page and you need to use a form parameter value submitted to get the rows, you need to store it in the portlet preferences, otherwise you lose it in the page “refresh”.
I haven’t found a solution on the web so far, so I’m posting my code snippets… that WORKS lol:
but I’m using portlet preferences … check it out!
[b]action method in the controller:[/b]
public void searchVolume(ActionRequest request, ActionResponse response) throws IOException, PortletException, PortalException, SystemException, NoSuchVolumeException { String volumeIdentifier = request.getParameter("volumeId"); long volumeId = (long) Integer.parseInt(volumeIdentifier); long idVol = 0; boolean found = false; boolean emptyList = false; List volume = new ArrayList(); volume = VolumeLocalServiceUtil.getAllVolumes(); List caseArchive = new ArrayList(); caseArchive = CaseArchiveLocalServiceUtil .getAllCasesbyVolumeId(volumeId); if (caseArchive.size() == 0) { emptyList = true; } for (Volume itemVolume : volume) { if (itemVolume.getVolumeId() == volumeId) found = true; } if (found && emptyList) { SessionMessages.add(request, "no-cases-found"); } else if (found && !emptyList) { Volume vol = DBUtil.getVolumefromRequest(request); idVol = vol.getVolumeId(); if (idVol == 1) { System.out.println("Volume id iniziale: " + volumeId); SessionErrors.add(request, "error-volume"); } else if (SearchValidator.volumeNotNull(idVol) && !(idVol == 1)) { System.out.println("Volume id action : " + vol.getVolumeId()); response.setRenderParameter("volId", volumeIdentifier); System.out.println("search volume clicked"); PortletPreferences prefs = request.getPreferences(); String volumeIdent = request.getParameter("volumeId"); if (volumeIdent != null) { prefs.setValue("volumeIdPref", volumeIdent); prefs.store(); } VolumeLocalServiceUtil.clearService(); SessionMessages.add(request, "search-volume"); } } else SessionErrors.add(request, "error-volume"); response.setRenderParameter("jspPage", viewDatabaseJSP); }
[b]JSP page[/b]:
CaseArchiveLocalServiceUtil.clearCache(); VolumeLocalServiceUtil.clearCache(); //RoiLocalServiceUtil.clearCache(); //ImageDBLocalServiceUtil.clearCache(); //DicomLocalServiceUtil.clearCache(); ImageTypeLocalServiceUtil.clearCache(); List volumes = VolumeLocalServiceUtil.getAllVolumes(); List cases = CaseArchiveLocalServiceUtil.getAllCases(); Long volumeIdentifier = 1L; Collections.sort(volumes, new Comparator() { public int compare(Volume o1, Volume o2) { Volume p1 = (Volume) o1; Volume p2 = (Volume) o2; return p1.getVolumeName().compareToIgnoreCase( p2.getVolumeName()); } }); PortletURL portletURL = renderResponse.createRenderURL(); portletURL.setParameter("jspPage", "/html/admin/viewDatabase.jsp"); int selected = 0; String volSel = null; PortletPreferences prefs = renderRequest.getPreferences(); String volumeId = (String) prefs.getValue("volumeIdPref", "1"); %> method="post"> 1) { volumeIdentifier = (long) Integer.parseInt(volumeId); } List tempResults = DBUtil .getAllCasesOk(volumeIdentifier); results = ListUtil.subList(tempResults, searchContainer.getStart(), searchContainer.getEnd()); total = tempResults.size(); pageContext.setAttribute("results", results); pageContext.setAttribute("total", total); portletURL.setParameter("cur", searchContainer.getCurParam()); System.out.println("Cur PRINT:" + searchContainer.getCur()); %> href="" name='view Case' /> <a href="<%=cancelURL%>">← Back to Menu</a>
In the example above, volumeId is the form action parameter (passed by the select option), while volumeIdPref is the portlet preferences parameter, which keeps the value while consulting the pages.
In the action method, that is invoked when submitting the form value, i’ve set a response parameter called volId which is used in the jsp to set the variable value when invoking the search-container result page “1”. The render parameter is null when visiting the other pages, but it can be retrieved by the portlet preferences value.
I hope this helps. Let me know if you have questions or suggestions.
Regards
Laura