[ 
https://issues.apache.org/struts/browse/WW-992?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=44035#action_44035
 ] 

Maxx commented on WW-992:
-------------------------

Hi,

Currently facing this problem, I tried using another input as "fake" when 
nothing is selected, and it worked !!! :)

Add something like
  <s:hidden id="idOfCheckboxList_0" name="nameOfCheckboxlist" value="" />
in your JSP just before your <s:checkboxlist> and when selecting no checkbox, 
the "target" field will be "emptied".
Well in my case it's a java.util.Set (or more precisely as java.util.EnumSet - 
used alongside a CustomConverter) and the resulting Set is empty.

I haven't tested this with anything else (like an array or List) but I think 
this should be considered.

Probably this empty hidden field should also be included in the 
checkboxlist.ftl to use the same values for the "id" and "name" attributes than 
the checkboxes.

Maxx

> Fixes broken checkbox and checkboxlist implementation.
> ------------------------------------------------------
>
>                 Key: WW-992
>                 URL: https://issues.apache.org/struts/browse/WW-992
>             Project: Struts 2
>          Issue Type: Bug
>          Components: Core Actions, Core Interceptors, Plugin - Tags
>    Affects Versions: WW 2.1.7
>         Environment: N/A
>            Reporter: Peter Molettiere
>            Assignee: Don Brown
>             Fix For: 2.1.1
>
>
> Checkbox handling is broken in webwork, since html checkboxes result in no 
> parameter being sent with the form submission. The parameters interceptor has 
> no way to see the missing checkbox fields, and so never unchecks things with 
> "true" as default, and will not empty a list when a checkboxlist with nothing 
> is selected is submitted.
> This fixes the issue.
> This will make your checkboxes and checkbox lists always set the appropriate 
> values on your model, regardless of whether the checkbox is selected or not. 
> Use the interceptor below in place of the default ParametersInterceptor, and 
> insert this line at the beginning of the checkbox.ftl and checkboxlist.ftl 
> templates:
> <input type="hidden" id="WebWork-checkboxExists" 
> name="${parameters.name?html}" value="${parameters.fieldValue?html}"/>
> Here's the interceptor, written as a subclass of ParametersInterceptor. This 
> could be rolled into ParametersInterceptor.
> import com.opensymphony.xwork.interceptor.ParameterNameAware;
> import com.opensymphony.xwork.interceptor.ParametersInterceptor;
> import com.opensymphony.xwork.util.OgnlValueStack;
> import java.util.Iterator;
> import java.util.Map;
> import java.util.TreeMap;
> public class CheckboxParameterInterceptor extends ParametersInterceptor {
>     protected void setParameters(Object action, OgnlValueStack stack, final 
> Map parameters) {
>         ParameterNameAware parameterNameAware = (action instanceof 
> ParameterNameAware)
>                 ? (ParameterNameAware) action : null;
>         for (Iterator iterator = (new 
> TreeMap(parameters)).entrySet().iterator(); iterator.hasNext();) {
>             Map.Entry entry = (Map.Entry) iterator.next();
>             String name = entry.getKey().toString();
>             boolean acceptableName = acceptableName(name)
>                     && (parameterNameAware == null
>                     || parameterNameAware.acceptableParameterName(name));
>             if (acceptableName) {
>                 Object value = entry.getValue();
>                 if (name.startsWith("WebWork-checkboxExists")) {
>                     String[] checkboxes = (String[]) value;
>                     for (int i = 0; i < checkboxes.length; i++) {
>                         String checkbox = checkboxes[i];
>                         if (! parameters.containsKey(checkbox)) {
>                             stack.setValue(checkbox, new String[0]);
>                         }
>                     }
>                 }
>                 stack.setValue(name, value);
>             }
>         }
>     }
> }

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to