Administrator
|
I like this feature. In eCommerce it works well in simple cases, but not when you have selected a product and want to change
language (we get "Product not found for Product ID !") and suppose to get right back to the selected product. I 1st thought it was because we have no productId in the URL, so I reverted 743985. As it was not working, I traced a bit and saw that _LAST_VIEW_PARAMS_ was empty when "view-last" is executed (in RequestHandler.doRequest()). This is because UtilMisc.makeMapSerializable(paramMap); remove the URL parameters (only present if you revert 743985). I'd like to allow this feature in thid case. I'd appreciate advises Thanks Jacques > Author: jonesde > Date: Wed Mar 4 10:27:52 2009 > New Revision: 749959 > > URL: http://svn.apache.org/viewvc?rev=749959&view=rev > Log: > Simple implementation of feature discussed on the mailing list to facilitate getting back to a view after some generic action, > like schanging the locale which this commit has use the new feature as a test case; I'm not sure I like this approach, will send > message to dev list about it > > Modified: > ofbiz/trunk/applications/ecommerce/webapp/ecommerce/WEB-INF/controller.xml > ofbiz/trunk/framework/common/webcommon/WEB-INF/common-controller.xml > ofbiz/trunk/framework/common/webcommon/includes/listLocales.ftl > ofbiz/trunk/framework/webapp/dtd/site-conf.xsd > ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ConfigXMLReader.java > ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/RequestHandler.java > > Modified: ofbiz/trunk/applications/ecommerce/webapp/ecommerce/WEB-INF/controller.xml > URL: > http://svn.apache.org/viewvc/ofbiz/trunk/applications/ecommerce/webapp/ecommerce/WEB-INF/controller.xml?rev=749959&r1=749958&r2=749959&view=diff > ============================================================================== > --- ofbiz/trunk/applications/ecommerce/webapp/ecommerce/WEB-INF/controller.xml (original) > +++ ofbiz/trunk/applications/ecommerce/webapp/ecommerce/WEB-INF/controller.xml Wed Mar 4 10:27:52 2009 > @@ -140,7 +140,7 @@ > <request-map uri="setSessionLocale"> > <security https="false" auth="false"/> > <event type="java" path="org.ofbiz.common.CommonEvents" invoke="setSessionLocale"/> > - <response name="success" type="view" value="main"/> > + <response name="success" type="view-last" value="main"/> > <response name="error" type="view" value="main"/> > </request-map> > > > Modified: ofbiz/trunk/framework/common/webcommon/WEB-INF/common-controller.xml > URL: > http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/webcommon/WEB-INF/common-controller.xml?rev=749959&r1=749958&r2=749959&view=diff > ============================================================================== > --- ofbiz/trunk/framework/common/webcommon/WEB-INF/common-controller.xml (original) > +++ ofbiz/trunk/framework/common/webcommon/WEB-INF/common-controller.xml Wed Mar 4 10:27:52 2009 > @@ -88,26 +88,20 @@ > </request-map> > > <!-- Common Mappings used for locales and timezones --> > + <request-map uri="LookupLocales"><security https="true" auth="false"/><response name="success" type="view" > value="LookupLocales" save-last-view="true"/></request-map> > <request-map uri="setSessionLocale"> > <security https="true" auth="false"/> > <event type="java" path="org.ofbiz.common.CommonEvents" invoke="setSessionLocale"/> > - <response name="success" type="request" value="main"/> > + <response name="success" type="view-last" value="main"/> > <response name="error" type="request" value="main"/> > </request-map> > + <request-map uri="LookupTimezones"><security https="true" auth="false"/><response name="success" type="view" > value="LookupTimezones"/></request-map> > <request-map uri="setSessionTimeZone"> > <security https="true" auth="false"/> > <event type="java" path="org.ofbiz.common.CommonEvents" invoke="setSessionTimeZone"/> > <response name="success" type="request" value="main"/> > <response name="error" type="request" value="main"/> > </request-map> > - <request-map uri="LookupLocales"> > - <security https="true" auth="false" /> > - <response name="success" type="view" value="LookupLocales" /> > - </request-map> > - <request-map uri="LookupTimezones"> > - <security https="true" auth="false" /> > - <response name="success" type="view" value="LookupTimezones" /> > - </request-map> > > <!-- User preference mapping --> > <request-map uri="setUserPreference"> > > Modified: ofbiz/trunk/framework/common/webcommon/includes/listLocales.ftl > URL: > http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/webcommon/includes/listLocales.ftl?rev=749959&r1=749958&r2=749959&view=diff > ============================================================================== > --- ofbiz/trunk/framework/common/webcommon/includes/listLocales.ftl (original) > +++ ofbiz/trunk/framework/common/webcommon/includes/listLocales.ftl Wed Mar 4 10:27:52 2009 > @@ -51,7 +51,7 @@ > </#if> > <tr <#if altRow>class="alternate-row"</#if>> > <td lang="${langAttr}" dir="${langDir}"> > - <a > href="<@ofbizUrl>setSessionLocale</@ofbizUrl>?newLocale=${availableLocale.toString()}">${availableLocale.getDisplayName(availableLocale)}</a> > + <a > href="<@ofbizUrl>setSessionLocale</@ofbizUrl>?newLocale=${availableLocale.toString()}">${availableLocale.getDisplayName(availableLocale)} > [${availableLocale.toString()}]</a> > </td> > </tr> > </#list> > > Modified: ofbiz/trunk/framework/webapp/dtd/site-conf.xsd > URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/webapp/dtd/site-conf.xsd?rev=749959&r1=749958&r2=749959&view=diff > ============================================================================== > --- ofbiz/trunk/framework/webapp/dtd/site-conf.xsd (original) > +++ ofbiz/trunk/framework/webapp/dtd/site-conf.xsd Wed Mar 4 10:27:52 2009 > @@ -217,9 +217,9 @@ > </xs:complexType> > </xs:element> > <xs:attributeGroup name="attlist.event"> > - <xs:attribute type="xs:string" name="type" use="required"/> > - <xs:attribute type="xs:string" name="path"/> > - <xs:attribute type="xs:string" name="invoke"/> > + <xs:attribute name="type" type="xs:string" use="required"/> > + <xs:attribute name="path" type="xs:string"/> > + <xs:attribute name="invoke" type="xs:string"/> > <xs:attribute name="global-transaction" default="true"> > <xs:simpleType> > <xs:restriction base="xs:token"> > @@ -238,12 +238,13 @@ > </xs:complexType> > </xs:element> > <xs:attributeGroup name="attlist.response"> > - <xs:attribute type="xs:string" name="name" use="required"/> > + <xs:attribute name="name" type="xs:string" use="required"/> > <xs:attribute name="type" use="required"> > <xs:simpleType> > <xs:restriction base="xs:token"> > <xs:enumeration value="none"/> > <xs:enumeration value="view"/> > + <xs:enumeration value="view-last"><xs:annotation><xs:documentation>Will use the view from the last request > unless there is a saved from some previous request (using the save-last-view > attribute).</xs:documentation></xs:annotation></xs:enumeration> > <xs:enumeration value="request"/> > <xs:enumeration value="request-redirect"/> > <xs:enumeration value="request-redirect-noparam"/> > @@ -251,7 +252,16 @@ > </xs:restriction> > </xs:simpleType> > </xs:attribute> > - <xs:attribute type="xs:string" name="value"/> > + <xs:attribute name="value" type="xs:string"/> > + <xs:attribute name="save-last-view" default="false"> > + <xs:annotation><xs:documentation>Saves the last (previous) request's view for future use, generally with the > view-last type of response.</xs:documentation></xs:annotation> > + <xs:simpleType> > + <xs:restriction base="xs:token"> > + <xs:enumeration value="true"/> > + <xs:enumeration value="false"/> > + </xs:restriction> > + </xs:simpleType> > + </xs:attribute> > </xs:attributeGroup> > <xs:element name="redirect-parameter"> > <xs:annotation><xs:documentation>Adds a parameter with the given name to the redirect. Finds value in a request attribute > if exists, or a request parameter if no attribute is found.</xs:documentation></xs:annotation> > > Modified: ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ConfigXMLReader.java > URL: > http://svn.apache.org/viewvc/ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ConfigXMLReader.java?rev=749959&r1=749958&r2=749959&view=diff > ============================================================================== > --- ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ConfigXMLReader.java (original) > +++ ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ConfigXMLReader.java Wed Mar 4 10:27:52 2009 > @@ -425,12 +425,14 @@ > public String name; > public String type; > public String value; > + public boolean saveLastView = false; > public Map<String, String> redirectParameterMap = FastMap.newInstance(); > > public RequestResponse(Element responseElement) { > this.name = responseElement.getAttribute("name"); > this.type = responseElement.getAttribute("type"); > this.value = responseElement.getAttribute("value"); > + this.saveLastView = "true".equals(responseElement.getAttribute("save-last-view")); > for (Element redirectParameterElement: UtilXml.childElementList(responseElement, "redirect-parameter")) { > String from = redirectParameterElement.getAttribute("from"); > if (UtilValidate.isEmpty(from)) from = redirectParameterElement.getAttribute("name"); > > Modified: ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/RequestHandler.java > URL: > http://svn.apache.org/viewvc/ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/RequestHandler.java?rev=749959&r1=749958&r2=749959&view=diff > ============================================================================== > --- ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/RequestHandler.java (original) > +++ ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/RequestHandler.java Wed Mar 4 10:27:52 2009 > @@ -448,7 +448,14 @@ > > if (Debug.verboseOn()) Debug.logVerbose("[Event Response Selected] type=" + nextRequestResponse.type + ", value=" + > nextRequestResponse.value + ", sessionId=" + UtilHttp.getSessionId(request), module); > > - // Handle the responses - chains/views > + // ========== Handle the responses - chains/views ========== > + > + // if the request has the save-last-view attribute set, save it now before the view can be rendered or other chain done > so that the _LAST* session attributes will represent the previous request > + if (nextRequestResponse.saveLastView) { > + session.setAttribute("_SAVED_VIEW_NAME_", session.getAttribute("_LAST_VIEW_NAME_")); > + session.setAttribute("_SAVED_VIEW_URL_PARAMS_", session.getAttribute("_LAST_VIEW_URL_PARAMS_")); > + } > + > if (nextRequestResponse != null && "request".equals(nextRequestResponse.type)) { > // chained request > Debug.logInfo("[RequestHandler.doRequest]: Response is a chained request." + " sessionId=" + > UtilHttp.getSessionId(request), module); > @@ -488,6 +495,28 @@ > // check for an override view, only used if "success" = eventReturn > String viewName = (UtilValidate.isNotEmpty(overrideViewUri) && (eventReturn == null || > "success".equals(eventReturn))) ? overrideViewUri : nextRequestResponse.value; > renderView(viewName, requestMap.securityExternalView, request, response); > + } else if ("view-last".equals(nextRequestResponse.type)) { > + if (Debug.verboseOn()) Debug.logVerbose("[RequestHandler.doRequest]: Response is a view." + " sessionId=" + > UtilHttp.getSessionId(request), module); > + > + // check for an override view, only used if "success" = eventReturn > + String viewName = (UtilValidate.isNotEmpty(overrideViewUri) && (eventReturn == null || > "success".equals(eventReturn))) ? overrideViewUri : nextRequestResponse.value; > + > + // as a further override, look for the _SAVED and then _LAST session attributes > + Map<String, Object> urlParams = null; > + if (session.getAttribute("_SAVED_VIEW_NAME_") != null) { > + viewName = (String) session.getAttribute("_SAVED_VIEW_NAME_"); > + urlParams = (Map<String, Object>) session.getAttribute("_SAVED_VIEW_URL_PARAMS_"); > + } else if (session.getAttribute("_LAST_VIEW_NAME_") != null) { > + viewName = (String) session.getAttribute("_LAST_VIEW_NAME_"); > + urlParams = (Map<String, Object>) session.getAttribute("_LAST_VIEW_URL_PARAMS_"); > + } > + if (urlParams != null) { > + for (Map.Entry<String, Object> urlParamEntry: urlParams.entrySet()) { > + request.setAttribute(urlParamEntry.getKey(), urlParamEntry.getValue()); > + } > + } > + > + renderView(viewName, requestMap.securityExternalView, request, response); > } else if ("none".equals(nextRequestResponse.type)) { > // no view to render (meaning the return was processed by the event) > if (Debug.verboseOn()) Debug.logVerbose("[RequestHandler.doRequest]: Response is handled by the event." + " > sessionId=" + UtilHttp.getSessionId(request), module); > @@ -613,8 +642,13 @@ > > if (Debug.verboseOn()) Debug.logVerbose("[Getting View Map]: " + view + " sessionId=" + UtilHttp.getSessionId(req), > module); > > - // before mapping the view, set a session attribute so we know where we are > + // before mapping the view, set a request attribute so we know where we are > req.setAttribute("_CURRENT_VIEW_", view); > + > + // save the view in the session for the last view, plus the URL parameters Map; note that this is saved after the > request/view processing has finished so when those run they will get the value from the previous request > + Map<String, Object> queryStringParamMap = UtilHttp.getQueryStringOnlyParameterMap(req); > + req.getSession().setAttribute("_LAST_VIEW_NAME_", view); > + req.getSession().setAttribute("_LAST_VIEW_URL_PARAMS_", queryStringParamMap); > > ConfigXMLReader.ViewMap viewMap = (view == null ? null : getControllerConfig().viewMapMap.get(view)); > if (viewMap == null) { > > |
I wrote this stuff and what you wrote still doesn't make any sense to me... Are you saying this is an issue with the latest version? Are you using the second commit which fixed these issues or are you saying that somehow you don't want to use that and we should fix it in a different way? -David On Mar 5, 2009, at 11:23 AM, Jacques Le Roux wrote: > I like this feature. In eCommerce it works well in simple cases, but > not when you have selected a product and want to change language (we > get "Product not found for Product ID !") and suppose to get right > back to the selected product. > I 1st thought it was because we have no productId in the URL, so I > reverted 743985. As it was not working, I traced a bit and saw that > _LAST_VIEW_PARAMS_ was empty when "view-last" is executed (in > RequestHandler.doRequest()). > This is because UtilMisc.makeMapSerializable(paramMap); remove the > URL parameters (only present if you revert 743985). > > I'd like to allow this feature in thid case. I'd appreciate advises > > Thanks > > Jacques > >> Author: jonesde >> Date: Wed Mar 4 10:27:52 2009 >> New Revision: 749959 >> >> URL: http://svn.apache.org/viewvc?rev=749959&view=rev >> Log: >> Simple implementation of feature discussed on the mailing list to >> facilitate getting back to a view after some generic action, like >> schanging the locale which this commit has use the new feature as a >> test case; I'm not sure I like this approach, will send message to >> dev list about it >> >> Modified: >> ofbiz/trunk/applications/ecommerce/webapp/ecommerce/WEB-INF/ >> controller.xml >> ofbiz/trunk/framework/common/webcommon/WEB-INF/common- >> controller.xml >> ofbiz/trunk/framework/common/webcommon/includes/listLocales.ftl >> ofbiz/trunk/framework/webapp/dtd/site-conf.xsd >> ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ >> ConfigXMLReader.java >> ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ >> RequestHandler.java >> >> Modified: ofbiz/trunk/applications/ecommerce/webapp/ecommerce/WEB- >> INF/controller.xml >> URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/ecommerce/webapp/ecommerce/WEB-INF/controller.xml?rev=749959&r1=749958&r2=749959&view=diff >> = >> = >> = >> = >> = >> = >> = >> = >> = >> ===================================================================== >> --- ofbiz/trunk/applications/ecommerce/webapp/ecommerce/WEB-INF/ >> controller.xml (original) >> +++ ofbiz/trunk/applications/ecommerce/webapp/ecommerce/WEB-INF/ >> controller.xml Wed Mar 4 10:27:52 2009 >> @@ -140,7 +140,7 @@ >> <request-map uri="setSessionLocale"> >> <security https="false" auth="false"/> >> <event type="java" path="org.ofbiz.common.CommonEvents" >> invoke="setSessionLocale"/> >> - <response name="success" type="view" value="main"/> >> + <response name="success" type="view-last" value="main"/> >> <response name="error" type="view" value="main"/> >> </request-map> >> >> >> Modified: ofbiz/trunk/framework/common/webcommon/WEB-INF/common- >> controller.xml >> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/webcommon/WEB-INF/common-controller.xml?rev=749959&r1=749958&r2=749959&view=diff >> = >> = >> = >> = >> = >> = >> = >> = >> = >> ===================================================================== >> --- ofbiz/trunk/framework/common/webcommon/WEB-INF/common- >> controller.xml (original) >> +++ ofbiz/trunk/framework/common/webcommon/WEB-INF/common- >> controller.xml Wed Mar 4 10:27:52 2009 >> @@ -88,26 +88,20 @@ >> </request-map> >> >> <!-- Common Mappings used for locales and timezones --> >> + <request-map uri="LookupLocales"><security https="true" >> auth="false"/><response name="success" type="view" >> value="LookupLocales" save-last-view="true"/></request-map> >> <request-map uri="setSessionLocale"> >> <security https="true" auth="false"/> >> <event type="java" path="org.ofbiz.common.CommonEvents" >> invoke="setSessionLocale"/> >> - <response name="success" type="request" value="main"/> >> + <response name="success" type="view-last" value="main"/> >> <response name="error" type="request" value="main"/> >> </request-map> >> + <request-map uri="LookupTimezones"><security https="true" >> auth="false"/><response name="success" type="view" >> value="LookupTimezones"/></request-map> >> <request-map uri="setSessionTimeZone"> >> <security https="true" auth="false"/> >> <event type="java" path="org.ofbiz.common.CommonEvents" >> invoke="setSessionTimeZone"/> >> <response name="success" type="request" value="main"/> >> <response name="error" type="request" value="main"/> >> </request-map> >> - <request-map uri="LookupLocales"> >> - <security https="true" auth="false" /> >> - <response name="success" type="view" >> value="LookupLocales" /> >> - </request-map> >> - <request-map uri="LookupTimezones"> >> - <security https="true" auth="false" /> >> - <response name="success" type="view" >> value="LookupTimezones" /> >> - </request-map> >> >> <!-- User preference mapping --> >> <request-map uri="setUserPreference"> >> >> Modified: ofbiz/trunk/framework/common/webcommon/includes/ >> listLocales.ftl >> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/webcommon/includes/listLocales.ftl?rev=749959&r1=749958&r2=749959&view=diff >> = >> = >> = >> = >> = >> = >> = >> = >> = >> ===================================================================== >> --- ofbiz/trunk/framework/common/webcommon/includes/listLocales.ftl >> (original) >> +++ ofbiz/trunk/framework/common/webcommon/includes/listLocales.ftl >> Wed Mar 4 10:27:52 2009 >> @@ -51,7 +51,7 @@ >> </#if> >> <tr <#if altRow>class="alternate-row"</#if>> >> <td lang="${langAttr}" dir="${langDir}"> >> - <a href="<@ofbizUrl>setSessionLocale</@ofbizUrl>? >> newLocale=${availableLocale.toString()}">$ >> {availableLocale.getDisplayName(availableLocale)}</a> >> + <a href="<@ofbizUrl>setSessionLocale</@ofbizUrl>? >> newLocale=${availableLocale.toString()}">$ >> {availableLocale.getDisplayName(availableLocale)} [$ >> {availableLocale.toString()}]</a> >> </td> >> </tr> >> </#list> >> >> Modified: ofbiz/trunk/framework/webapp/dtd/site-conf.xsd >> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/webapp/dtd/site-conf.xsd?rev=749959&r1=749958&r2=749959&view=diff >> = >> = >> = >> = >> = >> = >> = >> = >> = >> ===================================================================== >> --- ofbiz/trunk/framework/webapp/dtd/site-conf.xsd (original) >> +++ ofbiz/trunk/framework/webapp/dtd/site-conf.xsd Wed Mar 4 >> 10:27:52 2009 >> @@ -217,9 +217,9 @@ >> </xs:complexType> >> </xs:element> >> <xs:attributeGroup name="attlist.event"> >> - <xs:attribute type="xs:string" name="type" use="required"/> >> - <xs:attribute type="xs:string" name="path"/> >> - <xs:attribute type="xs:string" name="invoke"/> >> + <xs:attribute name="type" type="xs:string" use="required"/> >> + <xs:attribute name="path" type="xs:string"/> >> + <xs:attribute name="invoke" type="xs:string"/> >> <xs:attribute name="global-transaction" default="true"> >> <xs:simpleType> >> <xs:restriction base="xs:token"> >> @@ -238,12 +238,13 @@ >> </xs:complexType> >> </xs:element> >> <xs:attributeGroup name="attlist.response"> >> - <xs:attribute type="xs:string" name="name" use="required"/> >> + <xs:attribute name="name" type="xs:string" use="required"/> >> <xs:attribute name="type" use="required"> >> <xs:simpleType> >> <xs:restriction base="xs:token"> >> <xs:enumeration value="none"/> >> <xs:enumeration value="view"/> >> + <xs:enumeration value="view- >> last"><xs:annotation><xs:documentation>Will use the view from the >> last request unless there is a saved from some previous request >> (using the save-last-view attribute).</xs:documentation></ >> xs:annotation></xs:enumeration> >> <xs:enumeration value="request"/> >> <xs:enumeration value="request-redirect"/> >> <xs:enumeration value="request-redirect-noparam"/> >> @@ -251,7 +252,16 @@ >> </xs:restriction> >> </xs:simpleType> >> </xs:attribute> >> - <xs:attribute type="xs:string" name="value"/> >> + <xs:attribute name="value" type="xs:string"/> >> + <xs:attribute name="save-last-view" default="false"> >> + <xs:annotation><xs:documentation>Saves the last >> (previous) request's view for future use, generally with the view- >> last type of response.</xs:documentation></xs:annotation> >> + <xs:simpleType> >> + <xs:restriction base="xs:token"> >> + <xs:enumeration value="true"/> >> + <xs:enumeration value="false"/> >> + </xs:restriction> >> + </xs:simpleType> >> + </xs:attribute> >> </xs:attributeGroup> >> <xs:element name="redirect-parameter"> >> <xs:annotation><xs:documentation>Adds a parameter with the >> given name to the redirect. Finds value in a request attribute if >> exists, or a request parameter if no attribute is found.</ >> xs:documentation></xs:annotation> >> >> Modified: ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ >> ConfigXMLReader.java >> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ConfigXMLReader.java?rev=749959&r1=749958&r2=749959&view=diff >> = >> = >> = >> = >> = >> = >> = >> = >> = >> ===================================================================== >> --- ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ >> ConfigXMLReader.java (original) >> +++ ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ >> ConfigXMLReader.java Wed Mar 4 10:27:52 2009 >> @@ -425,12 +425,14 @@ >> public String name; >> public String type; >> public String value; >> + public boolean saveLastView = false; >> public Map<String, String> redirectParameterMap = >> FastMap.newInstance(); >> >> public RequestResponse(Element responseElement) { >> this.name = responseElement.getAttribute("name"); >> this.type = responseElement.getAttribute("type"); >> this.value = responseElement.getAttribute("value"); >> + this.saveLastView = >> "true".equals(responseElement.getAttribute("save-last-view")); >> for (Element redirectParameterElement: >> UtilXml.childElementList(responseElement, "redirect-parameter")) { >> String from = >> redirectParameterElement.getAttribute("from"); >> if (UtilValidate.isEmpty(from)) from = >> redirectParameterElement.getAttribute("name"); >> >> Modified: ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ >> RequestHandler.java >> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/RequestHandler.java?rev=749959&r1=749958&r2=749959&view=diff >> = >> = >> = >> = >> = >> = >> = >> = >> = >> ===================================================================== >> --- ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ >> RequestHandler.java (original) >> +++ ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ >> RequestHandler.java Wed Mar 4 10:27:52 2009 >> @@ -448,7 +448,14 @@ >> >> if (Debug.verboseOn()) Debug.logVerbose("[Event Response >> Selected] type=" + nextRequestResponse.type + ", value=" + >> nextRequestResponse.value + ", sessionId=" + >> UtilHttp.getSessionId(request), module); >> >> - // Handle the responses - chains/views >> + // ========== Handle the responses - chains/views ========== >> + >> + // if the request has the save-last-view attribute set, >> save it now before the view can be rendered or other chain done so >> that the _LAST* session attributes will represent the previous >> request >> + if (nextRequestResponse.saveLastView) { >> + session.setAttribute("_SAVED_VIEW_NAME_", >> session.getAttribute("_LAST_VIEW_NAME_")); >> + session.setAttribute("_SAVED_VIEW_URL_PARAMS_", >> session.getAttribute("_LAST_VIEW_URL_PARAMS_")); >> + } >> + >> if (nextRequestResponse != null && >> "request".equals(nextRequestResponse.type)) { >> // chained request >> Debug.logInfo("[RequestHandler.doRequest]: Response is a >> chained request." + " sessionId=" + UtilHttp.getSessionId(request), >> module); >> @@ -488,6 +495,28 @@ >> // check for an override view, only used if >> "success" = eventReturn >> String viewName = >> (UtilValidate.isNotEmpty(overrideViewUri) && (eventReturn == null >> || "success".equals(eventReturn))) ? overrideViewUri : >> nextRequestResponse.value; >> renderView(viewName, >> requestMap.securityExternalView, request, response); >> + } else if ("view- >> last".equals(nextRequestResponse.type)) { >> + if (Debug.verboseOn()) >> Debug.logVerbose("[RequestHandler.doRequest]: Response is a view." >> + " sessionId=" + UtilHttp.getSessionId(request), module); >> + >> + // check for an override view, only used if >> "success" = eventReturn >> + String viewName = >> (UtilValidate.isNotEmpty(overrideViewUri) && (eventReturn == null >> || "success".equals(eventReturn))) ? overrideViewUri : >> nextRequestResponse.value; >> + >> + // as a further override, look for the _SAVED and >> then _LAST session attributes >> + Map<String, Object> urlParams = null; >> + if (session.getAttribute("_SAVED_VIEW_NAME_") != >> null) { >> + viewName = (String) >> session.getAttribute("_SAVED_VIEW_NAME_"); >> + urlParams = (Map<String, Object>) >> session.getAttribute("_SAVED_VIEW_URL_PARAMS_"); >> + } else if >> (session.getAttribute("_LAST_VIEW_NAME_") != null) { >> + viewName = (String) >> session.getAttribute("_LAST_VIEW_NAME_"); >> + urlParams = (Map<String, Object>) >> session.getAttribute("_LAST_VIEW_URL_PARAMS_"); >> + } >> + if (urlParams != null) { >> + for (Map.Entry<String, Object> urlParamEntry: >> urlParams.entrySet()) { >> + >> request.setAttribute(urlParamEntry.getKey(), >> urlParamEntry.getValue()); >> + } >> + } >> + >> + renderView(viewName, >> requestMap.securityExternalView, request, response); >> } else if ("none".equals(nextRequestResponse.type)) { >> // no view to render (meaning the return was >> processed by the event) >> if (Debug.verboseOn()) >> Debug.logVerbose("[RequestHandler.doRequest]: Response is handled >> by the event." + " sessionId=" + UtilHttp.getSessionId(request), >> module); >> @@ -613,8 +642,13 @@ >> >> if (Debug.verboseOn()) Debug.logVerbose("[Getting View Map]: >> " + view + " sessionId=" + UtilHttp.getSessionId(req), module); >> >> - // before mapping the view, set a session attribute so we >> know where we are >> + // before mapping the view, set a request attribute so we >> know where we are >> req.setAttribute("_CURRENT_VIEW_", view); >> + >> + // save the view in the session for the last view, plus >> the URL parameters Map; note that this is saved after the request/ >> view processing has finished so when those run they will get the >> value from the previous request >> + Map<String, Object> queryStringParamMap = >> UtilHttp.getQueryStringOnlyParameterMap(req); >> + req.getSession().setAttribute("_LAST_VIEW_NAME_", view); >> + req.getSession().setAttribute("_LAST_VIEW_URL_PARAMS_", >> queryStringParamMap); >> >> ConfigXMLReader.ViewMap viewMap = (view == null ? null : >> getControllerConfig().viewMapMap.get(view)); >> if (viewMap == null) { >> > > |
After looking into this more, I think I found what you were running into. If you go to the product detail page, ie something like: http://localhost:8080/ecommerce/catalog/PROMOTIONS/p_GZ-2644 and then change the locale using the drop-down in the "Language" box on the right, then you'll get that error message. Looking back this would not have worked for either of my earlier commits. It did work in between, in fact it was the main test case I used (which is part of why what you described didn't make sense, along with the fact that I was having trouble figuring out what in the UI you were referring to). The code I added later to "fix" the serialization problem had a ! in the wrong place so it was removing everything from the Map. The problem turned out to be that the RequestHandler implemented the Serializable interface, but it wasn't really even close to serializable, and after playing with it and trying to make it serializable I decided that it didn't make any sense for it to be given what it does and the objects it depends on... so it isn't any more. This is now fixed, and with no startup or shutdown exceptions, as of rev 750572. -David On Mar 5, 2009, at 11:35 AM, David E Jones wrote: > > I wrote this stuff and what you wrote still doesn't make any sense > to me... > > Are you saying this is an issue with the latest version? Are you > using the second commit which fixed these issues or are you saying > that somehow you don't want to use that and we should fix it in a > different way? > > -David > > > On Mar 5, 2009, at 11:23 AM, Jacques Le Roux wrote: > >> I like this feature. In eCommerce it works well in simple cases, >> but not when you have selected a product and want to change >> language (we get "Product not found for Product ID !") and suppose >> to get right back to the selected product. >> I 1st thought it was because we have no productId in the URL, so I >> reverted 743985. As it was not working, I traced a bit and saw that >> _LAST_VIEW_PARAMS_ was empty when "view-last" is executed (in >> RequestHandler.doRequest()). >> This is because UtilMisc.makeMapSerializable(paramMap); remove the >> URL parameters (only present if you revert 743985). >> >> I'd like to allow this feature in thid case. I'd appreciate advises >> >> Thanks >> >> Jacques >> >>> Author: jonesde >>> Date: Wed Mar 4 10:27:52 2009 >>> New Revision: 749959 >>> >>> URL: http://svn.apache.org/viewvc?rev=749959&view=rev >>> Log: >>> Simple implementation of feature discussed on the mailing list to >>> facilitate getting back to a view after some generic action, like >>> schanging the locale which this commit has use the new feature as >>> a test case; I'm not sure I like this approach, will send message >>> to dev list about it >>> >>> Modified: >>> ofbiz/trunk/applications/ecommerce/webapp/ecommerce/WEB-INF/ >>> controller.xml >>> ofbiz/trunk/framework/common/webcommon/WEB-INF/common- >>> controller.xml >>> ofbiz/trunk/framework/common/webcommon/includes/listLocales.ftl >>> ofbiz/trunk/framework/webapp/dtd/site-conf.xsd >>> ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ >>> ConfigXMLReader.java >>> ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ >>> RequestHandler.java >>> >>> Modified: ofbiz/trunk/applications/ecommerce/webapp/ecommerce/WEB- >>> INF/controller.xml >>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/ecommerce/webapp/ecommerce/WEB-INF/controller.xml?rev=749959&r1=749958&r2=749959&view=diff >>> = >>> = >>> = >>> = >>> = >>> = >>> = >>> = >>> = >>> = >>> ==================================================================== >>> --- ofbiz/trunk/applications/ecommerce/webapp/ecommerce/WEB-INF/ >>> controller.xml (original) >>> +++ ofbiz/trunk/applications/ecommerce/webapp/ecommerce/WEB-INF/ >>> controller.xml Wed Mar 4 10:27:52 2009 >>> @@ -140,7 +140,7 @@ >>> <request-map uri="setSessionLocale"> >>> <security https="false" auth="false"/> >>> <event type="java" path="org.ofbiz.common.CommonEvents" >>> invoke="setSessionLocale"/> >>> - <response name="success" type="view" value="main"/> >>> + <response name="success" type="view-last" value="main"/> >>> <response name="error" type="view" value="main"/> >>> </request-map> >>> >>> >>> Modified: ofbiz/trunk/framework/common/webcommon/WEB-INF/common- >>> controller.xml >>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/webcommon/WEB-INF/common-controller.xml?rev=749959&r1=749958&r2=749959&view=diff >>> = >>> = >>> = >>> = >>> = >>> = >>> = >>> = >>> = >>> = >>> ==================================================================== >>> --- ofbiz/trunk/framework/common/webcommon/WEB-INF/common- >>> controller.xml (original) >>> +++ ofbiz/trunk/framework/common/webcommon/WEB-INF/common- >>> controller.xml Wed Mar 4 10:27:52 2009 >>> @@ -88,26 +88,20 @@ >>> </request-map> >>> >>> <!-- Common Mappings used for locales and timezones --> >>> + <request-map uri="LookupLocales"><security https="true" >>> auth="false"/><response name="success" type="view" >>> value="LookupLocales" save-last-view="true"/></request-map> >>> <request-map uri="setSessionLocale"> >>> <security https="true" auth="false"/> >>> <event type="java" path="org.ofbiz.common.CommonEvents" >>> invoke="setSessionLocale"/> >>> - <response name="success" type="request" value="main"/> >>> + <response name="success" type="view-last" value="main"/> >>> <response name="error" type="request" value="main"/> >>> </request-map> >>> + <request-map uri="LookupTimezones"><security https="true" >>> auth="false"/><response name="success" type="view" >>> value="LookupTimezones"/></request-map> >>> <request-map uri="setSessionTimeZone"> >>> <security https="true" auth="false"/> >>> <event type="java" path="org.ofbiz.common.CommonEvents" >>> invoke="setSessionTimeZone"/> >>> <response name="success" type="request" value="main"/> >>> <response name="error" type="request" value="main"/> >>> </request-map> >>> - <request-map uri="LookupLocales"> >>> - <security https="true" auth="false" /> >>> - <response name="success" type="view" >>> value="LookupLocales" /> >>> - </request-map> >>> - <request-map uri="LookupTimezones"> >>> - <security https="true" auth="false" /> >>> - <response name="success" type="view" >>> value="LookupTimezones" /> >>> - </request-map> >>> >>> <!-- User preference mapping --> >>> <request-map uri="setUserPreference"> >>> >>> Modified: ofbiz/trunk/framework/common/webcommon/includes/ >>> listLocales.ftl >>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/webcommon/includes/listLocales.ftl?rev=749959&r1=749958&r2=749959&view=diff >>> = >>> = >>> = >>> = >>> = >>> = >>> = >>> = >>> = >>> = >>> ==================================================================== >>> --- ofbiz/trunk/framework/common/webcommon/includes/ >>> listLocales.ftl (original) >>> +++ ofbiz/trunk/framework/common/webcommon/includes/ >>> listLocales.ftl Wed Mar 4 10:27:52 2009 >>> @@ -51,7 +51,7 @@ >>> </#if> >>> <tr <#if altRow>class="alternate-row"</#if>> >>> <td lang="${langAttr}" dir="${langDir}"> >>> - <a href="<@ofbizUrl>setSessionLocale</@ofbizUrl>? >>> newLocale=${availableLocale.toString()}">$ >>> {availableLocale.getDisplayName(availableLocale)}</a> >>> + <a href="<@ofbizUrl>setSessionLocale</@ofbizUrl>? >>> newLocale=${availableLocale.toString()}">$ >>> {availableLocale.getDisplayName(availableLocale)} [$ >>> {availableLocale.toString()}]</a> >>> </td> >>> </tr> >>> </#list> >>> >>> Modified: ofbiz/trunk/framework/webapp/dtd/site-conf.xsd >>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/webapp/dtd/site-conf.xsd?rev=749959&r1=749958&r2=749959&view=diff >>> = >>> = >>> = >>> = >>> = >>> = >>> = >>> = >>> = >>> = >>> ==================================================================== >>> --- ofbiz/trunk/framework/webapp/dtd/site-conf.xsd (original) >>> +++ ofbiz/trunk/framework/webapp/dtd/site-conf.xsd Wed Mar 4 >>> 10:27:52 2009 >>> @@ -217,9 +217,9 @@ >>> </xs:complexType> >>> </xs:element> >>> <xs:attributeGroup name="attlist.event"> >>> - <xs:attribute type="xs:string" name="type" use="required"/> >>> - <xs:attribute type="xs:string" name="path"/> >>> - <xs:attribute type="xs:string" name="invoke"/> >>> + <xs:attribute name="type" type="xs:string" use="required"/> >>> + <xs:attribute name="path" type="xs:string"/> >>> + <xs:attribute name="invoke" type="xs:string"/> >>> <xs:attribute name="global-transaction" default="true"> >>> <xs:simpleType> >>> <xs:restriction base="xs:token"> >>> @@ -238,12 +238,13 @@ >>> </xs:complexType> >>> </xs:element> >>> <xs:attributeGroup name="attlist.response"> >>> - <xs:attribute type="xs:string" name="name" use="required"/> >>> + <xs:attribute name="name" type="xs:string" use="required"/> >>> <xs:attribute name="type" use="required"> >>> <xs:simpleType> >>> <xs:restriction base="xs:token"> >>> <xs:enumeration value="none"/> >>> <xs:enumeration value="view"/> >>> + <xs:enumeration value="view- >>> last"><xs:annotation><xs:documentation>Will use the view from the >>> last request unless there is a saved from some previous request >>> (using the save-last-view attribute).</xs:documentation></ >>> xs:annotation></xs:enumeration> >>> <xs:enumeration value="request"/> >>> <xs:enumeration value="request-redirect"/> >>> <xs:enumeration value="request-redirect-noparam"/> >>> @@ -251,7 +252,16 @@ >>> </xs:restriction> >>> </xs:simpleType> >>> </xs:attribute> >>> - <xs:attribute type="xs:string" name="value"/> >>> + <xs:attribute name="value" type="xs:string"/> >>> + <xs:attribute name="save-last-view" default="false"> >>> + <xs:annotation><xs:documentation>Saves the last >>> (previous) request's view for future use, generally with the view- >>> last type of response.</xs:documentation></xs:annotation> >>> + <xs:simpleType> >>> + <xs:restriction base="xs:token"> >>> + <xs:enumeration value="true"/> >>> + <xs:enumeration value="false"/> >>> + </xs:restriction> >>> + </xs:simpleType> >>> + </xs:attribute> >>> </xs:attributeGroup> >>> <xs:element name="redirect-parameter"> >>> <xs:annotation><xs:documentation>Adds a parameter with the >>> given name to the redirect. Finds value in a request attribute if >>> exists, or a request parameter if no attribute is found.</ >>> xs:documentation></xs:annotation> >>> >>> Modified: ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/ >>> control/ConfigXMLReader.java >>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ConfigXMLReader.java?rev=749959&r1=749958&r2=749959&view=diff >>> = >>> = >>> = >>> = >>> = >>> = >>> = >>> = >>> = >>> = >>> ==================================================================== >>> --- ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ >>> ConfigXMLReader.java (original) >>> +++ ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ >>> ConfigXMLReader.java Wed Mar 4 10:27:52 2009 >>> @@ -425,12 +425,14 @@ >>> public String name; >>> public String type; >>> public String value; >>> + public boolean saveLastView = false; >>> public Map<String, String> redirectParameterMap = >>> FastMap.newInstance(); >>> >>> public RequestResponse(Element responseElement) { >>> this.name = responseElement.getAttribute("name"); >>> this.type = responseElement.getAttribute("type"); >>> this.value = responseElement.getAttribute("value"); >>> + this.saveLastView = >>> "true".equals(responseElement.getAttribute("save-last-view")); >>> for (Element redirectParameterElement: >>> UtilXml.childElementList(responseElement, "redirect-parameter")) { >>> String from = >>> redirectParameterElement.getAttribute("from"); >>> if (UtilValidate.isEmpty(from)) from = >>> redirectParameterElement.getAttribute("name"); >>> >>> Modified: ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/ >>> control/RequestHandler.java >>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/RequestHandler.java?rev=749959&r1=749958&r2=749959&view=diff >>> = >>> = >>> = >>> = >>> = >>> = >>> = >>> = >>> = >>> = >>> ==================================================================== >>> --- ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ >>> RequestHandler.java (original) >>> +++ ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ >>> RequestHandler.java Wed Mar 4 10:27:52 2009 >>> @@ -448,7 +448,14 @@ >>> >>> if (Debug.verboseOn()) Debug.logVerbose("[Event Response >>> Selected] type=" + nextRequestResponse.type + ", value=" + >>> nextRequestResponse.value + ", sessionId=" + >>> UtilHttp.getSessionId(request), module); >>> >>> - // Handle the responses - chains/views >>> + // ========== Handle the responses - chains/views >>> ========== >>> + >>> + // if the request has the save-last-view attribute set, >>> save it now before the view can be rendered or other chain done so >>> that the _LAST* session attributes will represent the previous >>> request >>> + if (nextRequestResponse.saveLastView) { >>> + session.setAttribute("_SAVED_VIEW_NAME_", >>> session.getAttribute("_LAST_VIEW_NAME_")); >>> + session.setAttribute("_SAVED_VIEW_URL_PARAMS_", >>> session.getAttribute("_LAST_VIEW_URL_PARAMS_")); >>> + } >>> + >>> if (nextRequestResponse != null && >>> "request".equals(nextRequestResponse.type)) { >>> // chained request >>> Debug.logInfo("[RequestHandler.doRequest]: Response is a >>> chained request." + " sessionId=" + >>> UtilHttp.getSessionId(request), module); >>> @@ -488,6 +495,28 @@ >>> // check for an override view, only used if >>> "success" = eventReturn >>> String viewName = >>> (UtilValidate.isNotEmpty(overrideViewUri) && (eventReturn == null >>> || "success".equals(eventReturn))) ? overrideViewUri : >>> nextRequestResponse.value; >>> renderView(viewName, >>> requestMap.securityExternalView, request, response); >>> + } else if ("view- >>> last".equals(nextRequestResponse.type)) { >>> + if (Debug.verboseOn()) >>> Debug.logVerbose("[RequestHandler.doRequest]: Response is a view." >>> + " sessionId=" + UtilHttp.getSessionId(request), module); >>> + >>> + // check for an override view, only used if >>> "success" = eventReturn >>> + String viewName = >>> (UtilValidate.isNotEmpty(overrideViewUri) && (eventReturn == null >>> || "success".equals(eventReturn))) ? overrideViewUri : >>> nextRequestResponse.value; >>> + >>> + // as a further override, look for the _SAVED and >>> then _LAST session attributes >>> + Map<String, Object> urlParams = null; >>> + if (session.getAttribute("_SAVED_VIEW_NAME_") != >>> null) { >>> + viewName = (String) >>> session.getAttribute("_SAVED_VIEW_NAME_"); >>> + urlParams = (Map<String, Object>) >>> session.getAttribute("_SAVED_VIEW_URL_PARAMS_"); >>> + } else if >>> (session.getAttribute("_LAST_VIEW_NAME_") != null) { >>> + viewName = (String) >>> session.getAttribute("_LAST_VIEW_NAME_"); >>> + urlParams = (Map<String, Object>) >>> session.getAttribute("_LAST_VIEW_URL_PARAMS_"); >>> + } >>> + if (urlParams != null) { >>> + for (Map.Entry<String, Object> urlParamEntry: >>> urlParams.entrySet()) { >>> + >>> request.setAttribute(urlParamEntry.getKey(), >>> urlParamEntry.getValue()); >>> + } >>> + } >>> + >>> + renderView(viewName, >>> requestMap.securityExternalView, request, response); >>> } else if ("none".equals(nextRequestResponse.type)) { >>> // no view to render (meaning the return was >>> processed by the event) >>> if (Debug.verboseOn()) >>> Debug.logVerbose("[RequestHandler.doRequest]: Response is handled >>> by the event." + " sessionId=" + UtilHttp.getSessionId(request), >>> module); >>> @@ -613,8 +642,13 @@ >>> >>> if (Debug.verboseOn()) Debug.logVerbose("[Getting View Map]: >>> " + view + " sessionId=" + UtilHttp.getSessionId(req), module); >>> >>> - // before mapping the view, set a session attribute so we >>> know where we are >>> + // before mapping the view, set a request attribute so we >>> know where we are >>> req.setAttribute("_CURRENT_VIEW_", view); >>> + >>> + // save the view in the session for the last view, plus >>> the URL parameters Map; note that this is saved after the request/ >>> view processing has finished so when those run they will get the >>> value from the previous request >>> + Map<String, Object> queryStringParamMap = >>> UtilHttp.getQueryStringOnlyParameterMap(req); >>> + req.getSession().setAttribute("_LAST_VIEW_NAME_", view); >>> + req.getSession().setAttribute("_LAST_VIEW_URL_PARAMS_", >>> queryStringParamMap); >>> >>> ConfigXMLReader.ViewMap viewMap = (view == null ? null : >>> getControllerConfig().viewMapMap.get(view)); >>> if (viewMap == null) { >>> >> >> > |
Administrator
|
It works great!
Jacques From: "David E Jones" <[hidden email]> > > After looking into this more, I think I found what you were running into. If you go to the product detail page, ie something > like: > > http://localhost:8080/ecommerce/catalog/PROMOTIONS/p_GZ-2644 > > and then change the locale using the drop-down in the "Language" box on the right, then you'll get that error message. > > Looking back this would not have worked for either of my earlier commits. It did work in between, in fact it was the main test > case I used (which is part of why what you described didn't make sense, along with the fact that I was having trouble figuring > out what in the UI you were referring to). > > The code I added later to "fix" the serialization problem had a ! in the wrong place so it was removing everything from the Map. > The problem turned out to be that the RequestHandler implemented the Serializable interface, but it wasn't really even close to > serializable, and after playing with it and trying to make it serializable I decided that it didn't make any sense for it to be > given what it does and the objects it depends on... so it isn't any more. > > This is now fixed, and with no startup or shutdown exceptions, as of rev 750572. > > -David > > > On Mar 5, 2009, at 11:35 AM, David E Jones wrote: > >> >> I wrote this stuff and what you wrote still doesn't make any sense to me... >> >> Are you saying this is an issue with the latest version? Are you using the second commit which fixed these issues or are you >> saying that somehow you don't want to use that and we should fix it in a different way? >> >> -David >> >> >> On Mar 5, 2009, at 11:23 AM, Jacques Le Roux wrote: >> >>> I like this feature. In eCommerce it works well in simple cases, but not when you have selected a product and want to change >>> language (we get "Product not found for Product ID !") and suppose to get right back to the selected product. >>> I 1st thought it was because we have no productId in the URL, so I reverted 743985. As it was not working, I traced a bit and >>> saw that _LAST_VIEW_PARAMS_ was empty when "view-last" is executed (in RequestHandler.doRequest()). >>> This is because UtilMisc.makeMapSerializable(paramMap); remove the URL parameters (only present if you revert 743985). >>> >>> I'd like to allow this feature in thid case. I'd appreciate advises >>> >>> Thanks >>> >>> Jacques >>> >>>> Author: jonesde >>>> Date: Wed Mar 4 10:27:52 2009 >>>> New Revision: 749959 >>>> >>>> URL: http://svn.apache.org/viewvc?rev=749959&view=rev >>>> Log: >>>> Simple implementation of feature discussed on the mailing list to facilitate getting back to a view after some generic action, >>>> like schanging the locale which this commit has use the new feature as a test case; I'm not sure I like this approach, will >>>> send message to dev list about it >>>> >>>> Modified: >>>> ofbiz/trunk/applications/ecommerce/webapp/ecommerce/WEB-INF/ controller.xml >>>> ofbiz/trunk/framework/common/webcommon/WEB-INF/common- controller.xml >>>> ofbiz/trunk/framework/common/webcommon/includes/listLocales.ftl >>>> ofbiz/trunk/framework/webapp/dtd/site-conf.xsd >>>> ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ ConfigXMLReader.java >>>> ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ RequestHandler.java >>>> >>>> Modified: ofbiz/trunk/applications/ecommerce/webapp/ecommerce/WEB- INF/controller.xml >>>> URL: >>>> http://svn.apache.org/viewvc/ofbiz/trunk/applications/ecommerce/webapp/ecommerce/WEB-INF/controller.xml?rev=749959&r1=749958&r2=749959&view=diff >>>> = = = = = = = = = = ==================================================================== >>>> --- ofbiz/trunk/applications/ecommerce/webapp/ecommerce/WEB-INF/ controller.xml (original) >>>> +++ ofbiz/trunk/applications/ecommerce/webapp/ecommerce/WEB-INF/ controller.xml Wed Mar 4 10:27:52 2009 >>>> @@ -140,7 +140,7 @@ >>>> <request-map uri="setSessionLocale"> >>>> <security https="false" auth="false"/> >>>> <event type="java" path="org.ofbiz.common.CommonEvents" invoke="setSessionLocale"/> >>>> - <response name="success" type="view" value="main"/> >>>> + <response name="success" type="view-last" value="main"/> >>>> <response name="error" type="view" value="main"/> >>>> </request-map> >>>> >>>> >>>> Modified: ofbiz/trunk/framework/common/webcommon/WEB-INF/common- controller.xml >>>> URL: >>>> http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/webcommon/WEB-INF/common-controller.xml?rev=749959&r1=749958&r2=749959&view=diff >>>> = = = = = = = = = = ==================================================================== >>>> --- ofbiz/trunk/framework/common/webcommon/WEB-INF/common- controller.xml (original) >>>> +++ ofbiz/trunk/framework/common/webcommon/WEB-INF/common- controller.xml Wed Mar 4 10:27:52 2009 >>>> @@ -88,26 +88,20 @@ >>>> </request-map> >>>> >>>> <!-- Common Mappings used for locales and timezones --> >>>> + <request-map uri="LookupLocales"><security https="true" auth="false"/><response name="success" type="view" >>>> value="LookupLocales" save-last-view="true"/></request-map> >>>> <request-map uri="setSessionLocale"> >>>> <security https="true" auth="false"/> >>>> <event type="java" path="org.ofbiz.common.CommonEvents" invoke="setSessionLocale"/> >>>> - <response name="success" type="request" value="main"/> >>>> + <response name="success" type="view-last" value="main"/> >>>> <response name="error" type="request" value="main"/> >>>> </request-map> >>>> + <request-map uri="LookupTimezones"><security https="true" auth="false"/><response name="success" type="view" >>>> value="LookupTimezones"/></request-map> >>>> <request-map uri="setSessionTimeZone"> >>>> <security https="true" auth="false"/> >>>> <event type="java" path="org.ofbiz.common.CommonEvents" invoke="setSessionTimeZone"/> >>>> <response name="success" type="request" value="main"/> >>>> <response name="error" type="request" value="main"/> >>>> </request-map> >>>> - <request-map uri="LookupLocales"> >>>> - <security https="true" auth="false" /> >>>> - <response name="success" type="view" value="LookupLocales" /> >>>> - </request-map> >>>> - <request-map uri="LookupTimezones"> >>>> - <security https="true" auth="false" /> >>>> - <response name="success" type="view" value="LookupTimezones" /> >>>> - </request-map> >>>> >>>> <!-- User preference mapping --> >>>> <request-map uri="setUserPreference"> >>>> >>>> Modified: ofbiz/trunk/framework/common/webcommon/includes/ listLocales.ftl >>>> URL: >>>> http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/webcommon/includes/listLocales.ftl?rev=749959&r1=749958&r2=749959&view=diff >>>> = = = = = = = = = = ==================================================================== >>>> --- ofbiz/trunk/framework/common/webcommon/includes/ listLocales.ftl (original) >>>> +++ ofbiz/trunk/framework/common/webcommon/includes/ listLocales.ftl Wed Mar 4 10:27:52 2009 >>>> @@ -51,7 +51,7 @@ >>>> </#if> >>>> <tr <#if altRow>class="alternate-row"</#if>> >>>> <td lang="${langAttr}" dir="${langDir}"> >>>> - <a href="<@ofbizUrl>setSessionLocale</@ofbizUrl>? newLocale=${availableLocale.toString()}">$ >>>> {availableLocale.getDisplayName(availableLocale)}</a> >>>> + <a href="<@ofbizUrl>setSessionLocale</@ofbizUrl>? newLocale=${availableLocale.toString()}">$ >>>> {availableLocale.getDisplayName(availableLocale)} [$ {availableLocale.toString()}]</a> >>>> </td> >>>> </tr> >>>> </#list> >>>> >>>> Modified: ofbiz/trunk/framework/webapp/dtd/site-conf.xsd >>>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/webapp/dtd/site-conf.xsd?rev=749959&r1=749958&r2=749959&view=diff >>>> = = = = = = = = = = ==================================================================== >>>> --- ofbiz/trunk/framework/webapp/dtd/site-conf.xsd (original) >>>> +++ ofbiz/trunk/framework/webapp/dtd/site-conf.xsd Wed Mar 4 10:27:52 2009 >>>> @@ -217,9 +217,9 @@ >>>> </xs:complexType> >>>> </xs:element> >>>> <xs:attributeGroup name="attlist.event"> >>>> - <xs:attribute type="xs:string" name="type" use="required"/> >>>> - <xs:attribute type="xs:string" name="path"/> >>>> - <xs:attribute type="xs:string" name="invoke"/> >>>> + <xs:attribute name="type" type="xs:string" use="required"/> >>>> + <xs:attribute name="path" type="xs:string"/> >>>> + <xs:attribute name="invoke" type="xs:string"/> >>>> <xs:attribute name="global-transaction" default="true"> >>>> <xs:simpleType> >>>> <xs:restriction base="xs:token"> >>>> @@ -238,12 +238,13 @@ >>>> </xs:complexType> >>>> </xs:element> >>>> <xs:attributeGroup name="attlist.response"> >>>> - <xs:attribute type="xs:string" name="name" use="required"/> >>>> + <xs:attribute name="name" type="xs:string" use="required"/> >>>> <xs:attribute name="type" use="required"> >>>> <xs:simpleType> >>>> <xs:restriction base="xs:token"> >>>> <xs:enumeration value="none"/> >>>> <xs:enumeration value="view"/> >>>> + <xs:enumeration value="view- last"><xs:annotation><xs:documentation>Will use the view from the last >>>> request unless there is a saved from some previous request (using the save-last-view attribute).</xs:documentation></ >>>> xs:annotation></xs:enumeration> >>>> <xs:enumeration value="request"/> >>>> <xs:enumeration value="request-redirect"/> >>>> <xs:enumeration value="request-redirect-noparam"/> >>>> @@ -251,7 +252,16 @@ >>>> </xs:restriction> >>>> </xs:simpleType> >>>> </xs:attribute> >>>> - <xs:attribute type="xs:string" name="value"/> >>>> + <xs:attribute name="value" type="xs:string"/> >>>> + <xs:attribute name="save-last-view" default="false"> >>>> + <xs:annotation><xs:documentation>Saves the last (previous) request's view for future use, generally with the >>>> view- last type of response.</xs:documentation></xs:annotation> >>>> + <xs:simpleType> >>>> + <xs:restriction base="xs:token"> >>>> + <xs:enumeration value="true"/> >>>> + <xs:enumeration value="false"/> >>>> + </xs:restriction> >>>> + </xs:simpleType> >>>> + </xs:attribute> >>>> </xs:attributeGroup> >>>> <xs:element name="redirect-parameter"> >>>> <xs:annotation><xs:documentation>Adds a parameter with the given name to the redirect. Finds value in a request >>>> attribute if exists, or a request parameter if no attribute is found.</ xs:documentation></xs:annotation> >>>> >>>> Modified: ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/ control/ConfigXMLReader.java >>>> URL: >>>> http://svn.apache.org/viewvc/ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ConfigXMLReader.java?rev=749959&r1=749958&r2=749959&view=diff >>>> = = = = = = = = = = ==================================================================== >>>> --- ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ ConfigXMLReader.java (original) >>>> +++ ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ ConfigXMLReader.java Wed Mar 4 10:27:52 2009 >>>> @@ -425,12 +425,14 @@ >>>> public String name; >>>> public String type; >>>> public String value; >>>> + public boolean saveLastView = false; >>>> public Map<String, String> redirectParameterMap = FastMap.newInstance(); >>>> >>>> public RequestResponse(Element responseElement) { >>>> this.name = responseElement.getAttribute("name"); >>>> this.type = responseElement.getAttribute("type"); >>>> this.value = responseElement.getAttribute("value"); >>>> + this.saveLastView = "true".equals(responseElement.getAttribute("save-last-view")); >>>> for (Element redirectParameterElement: UtilXml.childElementList(responseElement, "redirect-parameter")) { >>>> String from = redirectParameterElement.getAttribute("from"); >>>> if (UtilValidate.isEmpty(from)) from = redirectParameterElement.getAttribute("name"); >>>> >>>> Modified: ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/ control/RequestHandler.java >>>> URL: >>>> http://svn.apache.org/viewvc/ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/RequestHandler.java?rev=749959&r1=749958&r2=749959&view=diff >>>> = = = = = = = = = = ==================================================================== >>>> --- ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ RequestHandler.java (original) >>>> +++ ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ RequestHandler.java Wed Mar 4 10:27:52 2009 >>>> @@ -448,7 +448,14 @@ >>>> >>>> if (Debug.verboseOn()) Debug.logVerbose("[Event Response Selected] type=" + nextRequestResponse.type + ", value=" + >>>> nextRequestResponse.value + ", sessionId=" + UtilHttp.getSessionId(request), module); >>>> >>>> - // Handle the responses - chains/views >>>> + // ========== Handle the responses - chains/views ========== >>>> + >>>> + // if the request has the save-last-view attribute set, save it now before the view can be rendered or other chain >>>> done so that the _LAST* session attributes will represent the previous request >>>> + if (nextRequestResponse.saveLastView) { >>>> + session.setAttribute("_SAVED_VIEW_NAME_", session.getAttribute("_LAST_VIEW_NAME_")); >>>> + session.setAttribute("_SAVED_VIEW_URL_PARAMS_", session.getAttribute("_LAST_VIEW_URL_PARAMS_")); >>>> + } >>>> + >>>> if (nextRequestResponse != null && "request".equals(nextRequestResponse.type)) { >>>> // chained request >>>> Debug.logInfo("[RequestHandler.doRequest]: Response is a chained request." + " sessionId=" + >>>> UtilHttp.getSessionId(request), module); >>>> @@ -488,6 +495,28 @@ >>>> // check for an override view, only used if "success" = eventReturn >>>> String viewName = (UtilValidate.isNotEmpty(overrideViewUri) && (eventReturn == null || >>>> "success".equals(eventReturn))) ? overrideViewUri : nextRequestResponse.value; >>>> renderView(viewName, requestMap.securityExternalView, request, response); >>>> + } else if ("view- last".equals(nextRequestResponse.type)) { >>>> + if (Debug.verboseOn()) Debug.logVerbose("[RequestHandler.doRequest]: Response is a view." + " sessionId=" + >>>> UtilHttp.getSessionId(request), module); >>>> + >>>> + // check for an override view, only used if "success" = eventReturn >>>> + String viewName = (UtilValidate.isNotEmpty(overrideViewUri) && (eventReturn == null || >>>> "success".equals(eventReturn))) ? overrideViewUri : nextRequestResponse.value; >>>> + >>>> + // as a further override, look for the _SAVED and then _LAST session attributes >>>> + Map<String, Object> urlParams = null; >>>> + if (session.getAttribute("_SAVED_VIEW_NAME_") != null) { >>>> + viewName = (String) session.getAttribute("_SAVED_VIEW_NAME_"); >>>> + urlParams = (Map<String, Object>) session.getAttribute("_SAVED_VIEW_URL_PARAMS_"); >>>> + } else if (session.getAttribute("_LAST_VIEW_NAME_") != null) { >>>> + viewName = (String) session.getAttribute("_LAST_VIEW_NAME_"); >>>> + urlParams = (Map<String, Object>) session.getAttribute("_LAST_VIEW_URL_PARAMS_"); >>>> + } >>>> + if (urlParams != null) { >>>> + for (Map.Entry<String, Object> urlParamEntry: urlParams.entrySet()) { >>>> + request.setAttribute(urlParamEntry.getKey(), urlParamEntry.getValue()); >>>> + } >>>> + } >>>> + >>>> + renderView(viewName, requestMap.securityExternalView, request, response); >>>> } else if ("none".equals(nextRequestResponse.type)) { >>>> // no view to render (meaning the return was processed by the event) >>>> if (Debug.verboseOn()) Debug.logVerbose("[RequestHandler.doRequest]: Response is handled by the event." + " >>>> sessionId=" + UtilHttp.getSessionId(request), module); >>>> @@ -613,8 +642,13 @@ >>>> >>>> if (Debug.verboseOn()) Debug.logVerbose("[Getting View Map]: " + view + " sessionId=" + UtilHttp.getSessionId(req), >>>> module); >>>> >>>> - // before mapping the view, set a session attribute so we know where we are >>>> + // before mapping the view, set a request attribute so we know where we are >>>> req.setAttribute("_CURRENT_VIEW_", view); >>>> + >>>> + // save the view in the session for the last view, plus the URL parameters Map; note that this is saved after the >>>> request/ view processing has finished so when those run they will get the value from the previous request >>>> + Map<String, Object> queryStringParamMap = UtilHttp.getQueryStringOnlyParameterMap(req); >>>> + req.getSession().setAttribute("_LAST_VIEW_NAME_", view); >>>> + req.getSession().setAttribute("_LAST_VIEW_URL_PARAMS_", queryStringParamMap); >>>> >>>> ConfigXMLReader.ViewMap viewMap = (view == null ? null : getControllerConfig().viewMapMap.get(view)); >>>> if (viewMap == null) { >>>> >>> >>> >> > |
Free forum by Nabble | Edit this page |