Hi,
I don't know spring binding, but I think you should try and make a
difference between the pagination (the submitting of the form when
paginating and sorting) and the submiting using the other buttons (search,
cancel) - maybe using a "DispatchAction".
One method for search and another one when paginating (making the same
seach, with the initial parameters).
The form has to be submitted when pagination occurs so it can retrieve the
checked checkboxes.
Cheers,
Narcis
On Fri, Nov 13, 2009 at 10:55 AM, Julien Gribonvald <
julien.gribonv...@recia.fr> wrote:
> Hi,
>
> Nobody can help me ? I will try a better explaination ! (sorry for my
> english)
>
> I'm facing to some problems with displaytag lib and with pagination and
> ordering options of datatable.
>
> My problem is that i have a search result where the user can select
> multi results on pagined and sorted pages if he wants, and the problem
> is when the user make a sort or go on an other page, he loose his
> selection.
>
> On the doc of displaytag and with the exemples it says that i need to
> set the form option in <display:table ... form="...."> to save the
> selection better sorts and pages. I'm trying to do that, but it doesn't
> work and it's submiting the form each time that the user make a sort or
> go to next pagnied page ( I have a validator which return an error about
> selected values, validator called after submit normaly)... when i remove
> the form i can navigate on all pagined pages and i can make all sorts,
> but with the form I stay on the first page and i can't make any sort.
> Also with the form option the buttons (next, previous, cancel...)
> doesn't works correctly
>
> It make some days that I'm trying to solve that but without success, any
> help would be appreciate.
>
> Else here is a part of my form :
>
> [CODE]
> <spring:nestedPath
> path="subForm">
> <portlet:actionURL var="submitAudience">
> <portlet:param name="action" value="addAudience" />
> <portlet:param name="_page" value="${page}" />
> </portlet:actionURL>
> <form name="${namespace}AddAud" method="post"
> action="${submitAudience }">
>
> ....
> <spring:bind path="subKey">
> <table border=0 cellpadding=5 width="90%">
> <tr>
> <td><d:table name="${userList}" id="user" sort="list"
> requestURI="${submitAudience}" form="${namespace}AddAud"
> export="false" class="dataTable" defaultsort="2"
> defaultorder="ascending" cellspacing="1"
> pagesize="${nbItemsToShow}"
> decorator="org.displaytag.decorator.TotalTableDecorator">
>
> <d:column title="Select">
> <input type="checkbox" name="${status.expression}"
> value="${user.userId}" />
> </d:column>
>
> <c:forEach items="${attrDisplay}" var="displayAttr">
> <d:column titleKey="news.label.${displayAttr}"
> sortable="true" headerClass="sortable">
> <c:forEach items="${user.attributes[displayAttr]}"
> var="attrValue">
> <c:out value="${attrValue}" />
> </c:forEach>
> </d:column>
> </c:forEach>
>
>
> <d:setProperty name="paging.banner.item_name"
> value="${tit}" />
> <d:setProperty name="paging.banner.items_name"
> value="${tit}s" />
>
> </d:table></td>
> </tr>
> <tr>
> <td><span
> class="portlet-msg-error">${status.errorMessage}</span></td>
> </tr>
> </table>
> </spring:bind>[/CODE]
>
> Subkey is a table of string a property of subForm.
>
>
> and here is my controller :
>
> [CODE]
>
> public class SubcribeController extends AbstractWizardFormController {
>
> ...
>
> public SubcribeController() {
> setCommandClass(SubForm.class);
> setCommandName(Constants.CMD_SUB_F);
> setAllowDirtyBack(true);
> setAllowDirtyForward(false);
> setSessionForm(true);
> setPageAttribute(Constants.ATT_PAGE);
> setPages(new String[] {Constants.ACT_ADD_AUDIENCE,
> Constants.ACT_ADD_AUDIENCE, Constants.ACT_ADD_AUDIENCE});
>
> }
>
> public void afterPropertiesSet() throws Exception {
> ...
> }
>
> @Override
> protected void processFinish(
> ActionRequest request, ActionResponse response,
> Object command, BindException errors)
> throws Exception {
> SubForm cmd= (SubForm)command;
> this.subService.addSubscribers(cmd.getSubKey(),
> cmd.getSubscriber());
>
>
> response.setRenderParameter(Constants.ATT_CTX_ID,String.valueOf(cmd.getSubscriber().getCtxId()));
>
> response.setRenderParameter(Constants.ACT,
> Constants.ACT_VIEW_AUDIENCE+cmd.getSubscriber().getCtxType());
> }
>
> @Override
> protected void processCancel(
> ActionRequest request, ActionResponse response,
> Object command, BindException errors)
> throws Exception {
> SubForm cmd= (SubForm)command;
> response.setRenderParameter(Constants.ACT,
> Constants.ACT_VIEW_AUDIENCE+cmd.getSubscriber().getCtxType());
>
>
> response.setRenderParameter(Constants.ATT_CTX_ID,String.valueOf(cmd.getSubscriber().getCtxId()));
>
> }
>
> @Override
> protected void validatePage(
> Object command, Errors errors, int page, boolean finish) {
>
> SubForm subF = (SubForm)command;
> SubValidator subValidator = (SubValidator) getValidator();
> if (finish) {
> this.getValidator().validate(command, errors);
> return;
> }
> switch (page) {
> case 0: subValidator.validateSearch(subF, errors); break;
> case 1: subValidator.validateSubscriberKey(subF, errors); break;
> }
>
> }
>
> @Override
> protected Object formBackingObject(PortletRequest request) throws
> Exception {
> SubForm subForm = new SubForm();
> String ctx = request.getParameter(Constants.ATT_CTX);
> subForm.getSubscriber().setCtxType(ctx);
>
>
> subForm.getSubscriber().setCtxId(PortletRequestUtils.getLongParameter(request,
> Constants.ATT_CTX_ID));
> return subForm;
> }
>
> @Override
> protected Map referenceData(PortletRequest request, Object command,
> Errors errors, int page) throws Exception {
>
> boolean isGrp = ((SubForm) command).getSubscriber().getIsGroup()
> == 1 ? true : false;
> Long ctxId = ((SubForm) command).getSubscriber().getCtxId();
> String ctx = ((SubForm) command).getSubscriber().getCtxType();
>
> if (!this.um.isUserAdminInCtx(ctxId, ctx,
> request.getRemoteUser())) {
> log.warn("SubcribeController:: user " +
> request.getRemoteUser() + " has no role admin");
> throw new PortletSecurityException("you are not authorized
> for this action");
> }
>
> Map<String, Object> model = new HashMap<String, Object>();
> if (ctx.equalsIgnoreCase(NewsConstants.CTX_C)) {
> model.put(Constants.CMD_CATEGORY,
> this.cm.getCategoryById(ctxId));
> } else if (ctx.equalsIgnoreCase(NewsConstants.CTX_T)) {
> model.put(Constants.CMD_TOPIC, this.tm.getTopicById(ctxId));
> Long cId = this.tm.getTopicById(ctxId).getCategoryId();
> model.put(Constants.ATT_CNAME,
> this.cm.getCategoryById(cId).getName());
> }
> model.put(Constants.ATT_PM,
> RolePerm.valueOf(this.um.getUserRoleInCtx(ctxId, ctx,
> request.getRemoteUser())).getMask());
> if (page == 0) {
> model.put("subTypeList", SubscribeType.values());
> } else if (page == 1) {
> model.put(Constants.CMD_SUB_F, (SubForm) command);
> if (isGrp) {
> groups = this.subService.searchGroups(((SubForm)
> command).getToken());
> model.put("grps", groups);
> } else {
> users = this.um.findPersonsByToken(((SubForm)
> command).getToken());
> model.put(Constants.ATT_USER_LIST, users);
> }
> model.put(Constants.ATT_LDAP_DISPLAY,
> um.getLdapUserService().getSearchDisplayedAttributes());
> model.put(Constants.ATT_NB_ITEM_TO_SHOW, this.nbItemsToShow);
> model.put(Constants.ERRORS, errors);
> } else if (page == 2) {
> model.put(Constants.CMD_SUB_F, (SubForm) command);
> List<EscoUser> lu = null;
> if (((SubForm) command).getSubscriber().getIsGroup() == 0) {
> lu = new ArrayList<EscoUser>();
> for (String id : ((SubForm) command).getSubKey()) {
> for (IEscoUser user : users) {
> if (user.getUserId().equalsIgnoreCase(id)) {
> lu.add((EscoUser) user);
> }
> }
> }
> }
> model.put(Constants.ATT_USER_LIST, lu);
> model.put(Constants.ATT_LDAP_DISPLAY,
> um.getLdapUserService().getSearchDisplayedAttributes());
> }
> return model;
> }
>
> @Override
> protected ModelAndView renderInvalidSubmit(RenderRequest request,
> RenderResponse response)
> throws Exception {
> return null;
> }
> @Override
> protected void handleInvalidSubmit(ActionRequest request,
> ActionResponse response)
> throws Exception {
> log.warn("SubcribeController:: handleInvalidSubmit: goto home
> page");
> response.setRenderParameter(Constants.ACT,
> Constants.VIEW_NEWSSTORE);
>
> }
>
> ...
>
> @Override
> protected boolean isFormSubmission(PortletRequest request) {
> for (Enumeration params = request.getParameterNames();
> params.hasMoreElements();) {
> String paramName = (String) params.nextElement ();
> if (paramName.startsWith(PARAM_TARGET) ||
> paramName.equals(PARAM_FINISH) || paramName.equals(PARAM_FINISH)) {
> return true;
> }
> }
> return super.isFormSubmission (request);
> }
>
> }
> [/CODE]
>
>
> Thanks for all the help you will be able to provide.
>
>
>
> Julien Gribonvald a écrit :
> > Hello,
> >
> > It makes several hours that after a problem with my multiselect checkbox
> > in a pagined table.
> >
> > My problem is that my checkbox which are selected in one page aren't
> > kept when i go on a next pagined page, someone have experienced a such
> > thing or have exemples on how to works with a such case ?
> > An other problem is that when i go back to the previous pagined page i
> > can't obtain my next selections.
> >
> > So here is my code :
> >
> > <spring:bind path="subKey">
> > <d:table name="${userList}"
> > id="user" sort="list" requestURI="${submitAudience}"
> > export="false"
> > class="dataTable" defaultsort="2" defaultorder="ascending"
> >
> > pagesize="${nbItemsToShow}"
> > decorator="org.displaytag.decorator.TotalTableDecorator">
> >
> > <d:column
> > title="Select">
> > <input
> > type="checkbox" name="subKey"
> >
> > value="${user.userId}" />
> > </d:column>
> >
> > <c:forEach
> > items="${attrDisplay}" var="displayAttr">
> > <d:column
> > titleKey="news.label.${displayAttr}" sortable="true">
> > <c:forEach
> > items="${user.attributes[displayAttr]}"
> >
> > var="attrValue">
> > <c:out
> > value="${attrValue}" />
> > </c:forEach>
> > </d:column>
> > </c:forEach>
> >
> >
> > <d:setProperty
> > name="paging.banner.item_name"
> > value="${tit}" />
> > <d:setProperty
> > name="paging.banner.items_name"
> > value="${tit}s"
> />
> >
> > </d:table>
> > </spring:bind>
> > subKey is a String[] parameter.
> >
> > When I submit my selection I have also the current page selection only.
> >
> > Thanks for those who can help me for this problem, i tryed many things
> > but without success.
> >
> > Thanks
> >
> > - Julien
> >
> >
> ------------------------------------------------------------------------------
> > Let Crystal Reports handle the reporting - Free Crystal Reports 2008
> 30-Day
> > trial. Simplify your report design, integration and deployment - and
> focus on
> > what you do best, core application coding. Discover what's new with
> > Crystal Reports now. http://p.sf.net/sfu/bobj-july
> > _______________________________________________
> > displaytag-user mailing list
> > displaytag-user@lists.sourceforge.net
> > https://lists.sourceforge.net/lists/listinfo/displaytag-user
> >
> >
> >
>
>
>
> ------------------------------------------------------------------------------
> Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day
> trial. Simplify your report design, integration and deployment - and focus
> on
> what you do best, core application coding. Discover what's new with
> Crystal Reports now. http://p.sf.net/sfu/bobj-july
> _______________________________________________
> displaytag-user mailing list
> displaytag-user@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/displaytag-user
>
------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day
trial. Simplify your report design, integration and deployment - and focus on
what you do best, core application coding. Discover what's new with
Crystal Reports now. http://p.sf.net/sfu/bobj-july
_______________________________________________
displaytag-user mailing list
displaytag-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/displaytag-user