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 |