Open SandrineProusteau opened 12 years ago
This is my patch (sorry for the comments in french) :
if (field.needsItems()) { // create items for checkboxes, radio buttons and selectboxes String fieldValue = content.getStringValue(cms, inputFieldPath + NODE_FIELDDEFAULTVALUE, locale); if (CmsStringUtil.isNotEmpty(fieldValue)) { // get items from String boolean showInRow = false; if (fieldValue.startsWith(MACRO_SHOW_ITEMS_IN_ROW)) { showInRow = true; fieldValue = fieldValue.substring(MACRO_SHOW_ITEMS_IN_ROW.length()); } // -------------------PATCH 1 : Traitement de fieldValue au macroResolver // 1. au lieu de tester directement le fieldValue, et de renvoyer une erreur si il est vide, // on le resout avec CmsMacroResolver d'abord. String oldFieldValue = fieldValue; CmsMacroResolver resolver = CmsMacroResolver.newInstance().setCmsObject(cms).setJspPageContext(jsp.getJspContext()); fieldValue = resolver.resolveMacros(fieldValue); LOG.debug(" PATCH 1 (traitement du FieldValue au CmsMacroResolver) : oldFieldValue = '" + oldFieldValue + "' ... fieldValue is now = '" + fieldValue + "'"); // -------------------FIN EURELIS 1 if (CmsStringUtil.isNotEmpty(fieldValue)) { // -------------------PATCH 2 : Recherche option selectionnee par parametre // 2. on fait d'abord un passage sur les options et on regarde si on a une option qui est selectionnee par un parametre en requete. // si oui, on fait le flad "flagFoundSelected" a true. boolean flagFoundSelected = false; StringTokenizer T = new StringTokenizer(fieldValue, "|"); Listitems = new ArrayList (T.countTokens()); while (T.hasMoreTokens()) { String part = T.nextToken(); // check pre selection of current item boolean isPreselected = part.indexOf('*') != -1; String value = ""; //String selected = ""; int delimPos = part.indexOf(':'); if (delimPos != -1) { // a special label text is given value = part.substring(0, delimPos); } else { // no special label text present, use complete String value = part; } if (isPreselected) { // remove preselected flag marker from Strings value = CmsStringUtil.substitute(value, "*", ""); } String selectedFromRequest = readSelectedFromRequest(field, value); if(selectedFromRequest.equalsIgnoreCase("true")){ flagFoundSelected = true; } } LOG.debug(" PATCH 2 (Recherche option selectionnee par parametre) : flagFoundSelected = '" + flagFoundSelected + "'"); // -------------------FIN EURELIS 2 T = new StringTokenizer(fieldValue, "|"); items = new ArrayList (T.countTokens()); while (T.hasMoreTokens()) { String part = T.nextToken(); // check pre selection of current item boolean isPreselected = part.indexOf('*') != -1; String value = ""; String label = ""; String selected = ""; int delimPos = part.indexOf(':'); if (delimPos != -1) { // a special label text is given value = part.substring(0, delimPos); label = part.substring(delimPos + 1); } else { // no special label text present, use complete String value = part; label = value; } if (isPreselected) { // remove preselected flag marker from Strings value = CmsStringUtil.substitute(value, "*", ""); label = CmsStringUtil.substitute(label, "*", ""); } // -------------------PATCH 3 : Prise en compte des parametres et du flag du Patch 2 // 3. on regarde si l'option est celle passee en parametre (si existence). String selectedFromRequest = readSelectedFromRequest(field, value); if (initial) { // only fill in values from configuration file if called initially if (isPreselected) { if(!flagFoundSelected){ selected = Boolean.toString(true); }else{ // get selected flag from request for current item selected = selectedFromRequest; } }else{ // get selected flag from request for current item selected = selectedFromRequest; } } else { // get selected flag from request for current item selected = selectedFromRequest; } // -------------------FIN PATCH 3 // add new item object items.add(new CmsFieldItem(value, label, Boolean.valueOf(selected).booleanValue(), showInRow)); } field.setItems(items); }else{ // no items specified for checkbox, radio button or selectbox, after CmsMacroResolver throw new CmsConfigurationException(Messages.get().container( Messages.ERR_INIT_INPUT_FIELD_MISSING_ITEM_2, field.getName(), field.getType())); } } else { // no items specified for checkbox, radio button or selectbox, before CmsMacroResolver throw new CmsConfigurationException(Messages.get().container( Messages.ERR_INIT_INPUT_FIELD_MISSING_ITEM_2, field.getName(), field.getType())); } }
I have created a basic form with some Text input fields and some Selectbox fields. My Selectbox field 'model' have as Default value a list of options with a default one: var1*:Val 1|var2:Val 2
When I display my page with the form, and send to it no parameters, the field is displayed with the default value var1. Good. But when I display my page with the parameter "model=var2" in ther URL, the field is also displayed with the default value var1!! It should be var2!
I found a solution in CmsForm, on function I_CmsField createInputField( String xPath, CmsXmlContent content, CmsJspActionElement jsp, Locale locale, CmsMessages messages, Map fieldTexts, Map> subFieldPaths, Map fileUploads, String subFieldNameSuffix, boolean initial, boolean subField) It's near line 2850. I do a first check with the selectedFormRequest, and use a flag to memore the selected option.