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) {




Reply via email to