Author: jacopoc
Date: Tue Jul 3 02:42:10 2007
New Revision: 552765
URL: http://svn.apache.org/viewvc?view=rev&rev=552765
Log:
Applied patch (with some minor changes) by Marco Risaliti (OFBIZ-1095), as a
first step in the implementation of product export features to Google.
Added:
ofbiz/trunk/applications/product/config/productsExport.properties (with
props)
ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductsExportToGoogle.java
(with props)
ofbiz/trunk/applications/product/webapp/catalog/find/ExportForms.xml
(with props)
Modified:
ofbiz/trunk/applications/product/servicedef/services.xml
ofbiz/trunk/applications/product/webapp/catalog/WEB-INF/controller.xml
ofbiz/trunk/applications/product/webapp/catalog/find/keywordsearch.ftl
ofbiz/trunk/applications/product/widget/catalog/FindScreens.xml
Added: ofbiz/trunk/applications/product/config/productsExport.properties
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/config/productsExport.properties?view=auto&rev=552765
==============================================================================
--- ofbiz/trunk/applications/product/config/productsExport.properties (added)
+++ ofbiz/trunk/applications/product/config/productsExport.properties Tue Jul
3 02:42:10 2007
@@ -0,0 +1,26 @@
+###############################################################################
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+###############################################################################
+####
+# OFBiz Product Export Settings
+####
+productsExport.google.developerKey=
+productsExport.google.authenticationUrl=https://www.google.com/accounts/ClientLogin
+productsExport.google.accountEmail=
+productsExport.google.accountPassword=
+productsExport.google.postItemsUrl=
http://www.google.com/base/feeds/items/batch
Propchange: ofbiz/trunk/applications/product/config/productsExport.properties
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: ofbiz/trunk/applications/product/config/productsExport.properties
------------------------------------------------------------------------------
svn:keywords = "Date Rev Author URL Id"
Propchange: ofbiz/trunk/applications/product/config/productsExport.properties
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: ofbiz/trunk/applications/product/servicedef/services.xml
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/servicedef/services.xml?view=diff&rev=552765&r1=552764&r2=552765
==============================================================================
--- ofbiz/trunk/applications/product/servicedef/services.xml (original)
+++ ofbiz/trunk/applications/product/servicedef/services.xml Tue Jul 3
02:42:10 2007
@@ -1115,4 +1115,13 @@
<permission-service service-name="productGenericPermission"
main-action="DELETE"/>
<auto-attributes include="pk" mode="IN" optional="false"/>
</service>
+ <!-- Products Export Services -->
+ <service name="exportToGoogle" engine="java"
+ location="org.ofbiz.product.product.ProductsExportToGoogle"
invoke="exportToGoogle" auth="true">
+ <description>Export products to Google Base</description>
+ <attribute type="String" mode="IN" name="products" optional="false"/>
+ <attribute type="String" mode="IN" name="webSiteUrl" optional="false"/>
+ <attribute type="String" mode="IN" name="imageUrl" optional="false"/>
+ <attribute type="String" mode="IN" name="trackingCodeId"
optional="true"/>
+ </service>
</services>
Added:
ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductsExportToGoogle.java
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductsExportToGoogle.java?view=auto&rev=552765
==============================================================================
---
ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductsExportToGoogle.java
(added)
+++
ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductsExportToGoogle.java
Tue Jul 3 02:42:10 2007
@@ -0,0 +1,338 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+
*******************************************************************************/
+package org.ofbiz.product.product;
+
+import java.io.BufferedReader;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.net.URLEncoder;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.StringTokenizer;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javolution.util.FastMap;
+
+import org.apache.xml.serialize.OutputFormat;
+import org.apache.xml.serialize.XMLSerializer;
+import org.ofbiz.base.util.Debug;
+import org.ofbiz.base.util.StringUtil;
+import org.ofbiz.base.util.UtilFormatOut;
+import org.ofbiz.base.util.UtilMisc;
+import org.ofbiz.base.util.UtilProperties;
+import org.ofbiz.base.util.UtilValidate;
+import org.ofbiz.base.util.UtilXml;
+import org.ofbiz.entity.GenericDelegator;
+import org.ofbiz.entity.GenericValue;
+import org.ofbiz.entity.condition.EntityExpr;
+import org.ofbiz.entity.condition.EntityOperator;
+import org.ofbiz.service.DispatchContext;
+import org.ofbiz.service.LocalDispatcher;
+import org.ofbiz.service.ServiceUtil;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+public class ProductsExportToGoogle {
+
+ private static final String resource = "ProductUiLabels";
+ private static final String module =
ProductsExportToGoogle.class.getName();
+ private static final String xmlHeader = "<?xml version=\'1.0\'
encoding='UTF-8'?>\n";
+
+ public static Map exportToGoogle(DispatchContext dctx, Map context) {
+ Locale locale = (Locale) context.get("locale");
+ try {
+ String configString = "productsExport.properties";
+
+ // get the Developer Key
+ String developerKey =
UtilProperties.getPropertyValue(configString,
"productsExport.google.developerKey");
+
+ // get the Authentication Url
+ String authenticationUrl =
UtilProperties.getPropertyValue(configString,
"productsExport.google.authenticationUrl");
+
+ // get the Google Account Email
+ String accountEmail =
UtilProperties.getPropertyValue(configString,
"productsExport.google.accountEmail");
+
+ // get the Google Account Password
+ String accountPassword =
UtilProperties.getPropertyValue(configString,
"productsExport.google.accountPassword");
+
+ // get the Url to Post Items
+ String postItemsUrl =
UtilProperties.getPropertyValue(configString,
"productsExport.google.postItemsUrl");
+
+ StringBuffer dataItemsXml = new StringBuffer();
+
+ if (!ServiceUtil.isFailure(buildDataItemsXml(dctx, context,
dataItemsXml))) {
+ String token = authenticate(authenticationUrl, accountEmail,
accountPassword);
+
+ if (token != null) {
+ Map result = postItem(token, postItemsUrl, developerKey,
dataItemsXml);
+ if (ServiceUtil.isFailure(result))
+ return
ServiceUtil.returnFailure(ServiceUtil.getErrorMessage(result));
+ } else {
+ Debug.logError("Error during authentication to Google
Account", module);
+ return
ServiceUtil.returnFailure(UtilProperties.getMessage(resource,
"productsExportToGoogle.errorDuringAuthenticationToGoogle", locale));
+ }
+ }
+ } catch (Exception e) {
+ Debug.logError("Exception in exportToGoogle", module);
+ return
ServiceUtil.returnFailure(UtilProperties.getMessage(resource,
"productsExportToGoogle.exceptionInExportToGoogle", locale));
+ }
+ return ServiceUtil.returnSuccess(UtilProperties.getMessage(resource,
"productsExportToGoogle.productItemsSentCorrecltyToGoogle", locale));
+ }
+
+ private static String authenticate(String authenticationUrl, String
accountEmail, String accountPassword) {
+ String postOutput = null;
+ String token = null;
+ try {
+ postOutput = makeLoginRequest(authenticationUrl, accountEmail,
accountPassword);
+ } catch (IOException e) {
+ Debug.logError("Could not connect to authentication server: " +
e.toString(), module);
+ return token;
+ }
+
+ // Parse the result of the login request. If everything went fine, the
+ // response will look like
+ // HTTP/1.0 200 OK
+ // Server: GFE/1.3
+ // Content-Type: text/plain
+ // SID=DQAAAGgA...7Zg8CTN
+ // LSID=DQAAAGsA...lk8BBbG
+ // Auth=DQAAAGgA...dk3fA5N
+ // so all we need to do is look for "Auth" and get the token that
comes after it
+
+ StringTokenizer tokenizer = new StringTokenizer(postOutput, "=\n ");
+
+ while (tokenizer.hasMoreElements()) {
+ if (tokenizer.nextToken().equals("Auth")) {
+ if (tokenizer.hasMoreElements()) {
+ token = tokenizer.nextToken();
+ }
+ break;
+ }
+ }
+ if (token == null) {
+ Debug.logError("Authentication error. Response from server:\n" +
postOutput, module);
+ }
+ return token;
+ }
+
+ private static String makeLoginRequest(String authenticationUrl, String
accountEmail, String accountPassword) throws IOException {
+ // Open connection
+ URL url = new URL(authenticationUrl);
+ HttpURLConnection urlConnection = (HttpURLConnection)
url.openConnection();
+
+ // Set properties of the connection
+ urlConnection.setRequestMethod("POST");
+ urlConnection.setDoInput(true);
+ urlConnection.setDoOutput(true);
+ urlConnection.setUseCaches(false);
+ urlConnection.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded");
+
+ // Form the POST parameters
+ StringBuffer content = new StringBuffer();
+ content.append("Email=").append(URLEncoder.encode(accountEmail,
"UTF-8"));
+ content.append("&Passwd=").append(URLEncoder.encode(accountPassword,
"UTF-8"));
+ content.append("&source=").append(URLEncoder.encode("Google Base data
API for OFBiz", "UTF-8"));
+ content.append("&service=").append(URLEncoder.encode("gbase",
"UTF-8"));
+
+ OutputStream outputStream = urlConnection.getOutputStream();
+ outputStream.write(content.toString().getBytes("UTF-8"));
+ outputStream.close();
+
+ // Retrieve the output
+ int responseCode = urlConnection.getResponseCode();
+ InputStream inputStream;
+ if (responseCode == HttpURLConnection.HTTP_OK) {
+ inputStream = urlConnection.getInputStream();
+ } else {
+ inputStream = urlConnection.getErrorStream();
+ }
+
+ return toString(inputStream);
+ }
+
+ private static String toString(InputStream inputStream) throws IOException
{
+ String string;
+ StringBuilder outputBuilder = new StringBuilder();
+ if (inputStream != null) {
+ BufferedReader reader = new BufferedReader(new
InputStreamReader(inputStream));
+ while (null != (string = reader.readLine())) {
+ outputBuilder.append(string).append('\n');
+ }
+ }
+ return outputBuilder.toString();
+ }
+
+ private static Map postItem(String token, String postItemsUrl, String
developerKey, StringBuffer dataItems) throws IOException {
+ HttpURLConnection connection = (HttpURLConnection)(new
URL(postItemsUrl)).openConnection();
+
+ connection.setDoInput(true);
+ connection.setDoOutput(true);
+ connection.setRequestMethod("POST");
+ connection.setRequestProperty("Content-Type", "application/atom+xml");
+ connection.setRequestProperty("Authorization", "GoogleLogin auth=" +
token);
+ connection.setRequestProperty("X-Google-Key", "key=" + developerKey);
+
+ OutputStream outputStream = connection.getOutputStream();
+ outputStream.write(dataItems.toString().getBytes());
+ outputStream.close();
+
+ int responseCode = connection.getResponseCode();
+ InputStream inputStream;
+ Map result = FastMap.newInstance();
+ if (responseCode == HttpURLConnection.HTTP_CREATED) {
+ inputStream = connection.getInputStream();
+ result = ServiceUtil.returnSuccess(toString(inputStream));
+ } else if (responseCode == HttpURLConnection.HTTP_OK) {
+ inputStream = connection.getInputStream();
+ result = ServiceUtil.returnFailure(toString(inputStream));
+ } else {
+ inputStream = connection.getErrorStream();
+ result = ServiceUtil.returnFailure(toString(inputStream));
+ }
+ return result;
+ }
+
+ private static Map buildDataItemsXml(DispatchContext dctx, Map context,
StringBuffer dataItemsXml) {
+ Locale locale = (Locale)context.get("locale");
+ try {
+ GenericDelegator delegator = dctx.getDelegator();
+ LocalDispatcher dispatcher = dctx.getDispatcher();
+ String products = (String)context.get("products");
+ String webSiteUrl = (String)context.get("webSiteUrl");
+ String imageUrl = (String)context.get("imageUrl");
+ String trackingCodeId = (String)context.get("trackingCodeId");
+
+ // Get the list of products to be exported to Google Base
+ List productsList = delegator.findByCondition("Product", new
EntityExpr("productId", EntityOperator.IN, StringUtil.split(products, ",")),
null, null);
+
+ // Get the tracking code
+ if (UtilValidate.isEmpty(trackingCodeId) ||
"_NA_".equals(trackingCodeId)) {
+ trackingCodeId = "";
+ } else {
+ trackingCodeId = "?atc=" + trackingCodeId;
+ }
+
+ try {
+ Document feedDocument = UtilXml.makeEmptyXmlDocument("feed");
+ Element feedElem = feedDocument.getDocumentElement();
+ feedElem.setAttribute("xmlns", "http://www.w3.org/2005/Atom");
+ feedElem.setAttribute("xmlns:openSearch",
"http://a9.com/-/spec/opensearchrss/1.0/");
+ feedElem.setAttribute("xmlns:g",
"http://base.google.com/ns/1.0");
+ feedElem.setAttribute("xmlns:batch",
"http://schemas.google.com/gdata/batch");
+
+ dataItemsXml.append(xmlHeader);
+
+ // Iterate the product list getting all the relevant data
+ Iterator productsListItr = productsList.iterator();
+ while(productsListItr.hasNext()) {
+ GenericValue prod = (GenericValue)productsListItr.next();
+ String price = getProductPrice(dispatcher, prod);
+ if (price == null) {
+ Debug.logInfo("Price not found for product [" +
prod.getString("productId")+ "]; product will not be exported.", module);
+ continue;
+ }
+ String link = webSiteUrl +
"/control/product/~product_id=" + prod.getString("productId") + trackingCodeId;
+ String title =
UtilFormatOut.encodeXmlValue(prod.getString("productName"));
+ String description =
UtilFormatOut.encodeXmlValue(prod.getString("description"));
+ String image_link = "";
+ if
(UtilValidate.isNotEmpty(prod.getString("largeImageUrl"))) {
+ image_link = imageUrl +
prod.getString("largeImageUrl");
+ }
+
+ Element entryElem = UtilXml.addChildElement(feedElem,
"entry", feedDocument);
+ Element batchElem = UtilXml.addChildElement(entryElem,
"batch:operation", feedDocument);
+ batchElem.setAttribute("type", "insert");
+
+ UtilXml.addChildElementValue(entryElem, "title", title,
feedDocument);
+
+ Element contentElem =
UtilXml.addChildElementValue(entryElem, "content", description, feedDocument);
+ contentElem.setAttribute("type", "xhtml");
+
+ UtilXml.addChildElementValue(entryElem, "id", link,
feedDocument);
+
+ Element linkElem = UtilXml.addChildElement(entryElem,
"link", feedDocument);
+ linkElem.setAttribute("rel", "alternate");
+ linkElem.setAttribute("type", "text/html");
+ linkElem.setAttribute("href", link);
+
+ UtilXml.addChildElementValue(entryElem, "g:item_type",
"products", feedDocument);
+ UtilXml.addChildElementValue(entryElem, "g:price", price,
feedDocument);
+
+ if (UtilValidate.isNotEmpty(image_link)) {
+ UtilXml.addChildElementValue(entryElem,
"g:image_link", image_link, feedDocument);
+ }
+
+ Element appControlElem =
UtilXml.addChildElement(entryElem, "app:control", feedDocument);
+ appControlElem.setAttribute("xmlns:app",
"http://purl.org/atom/app#");
+ UtilXml.addChildElementValue(appControlElem, "app:draft",
"yes", feedDocument);
+ }
+ OutputStream os = new ByteArrayOutputStream();
+ OutputFormat format = new OutputFormat();
+ format.setOmitDocumentType(true);
+ format.setOmitXMLDeclaration(true);
+ format.setIndenting(false);
+ XMLSerializer serializer = new XMLSerializer(os, format);
+ serializer.asDOMSerializer();
+ serializer.serialize(feedDocument.getDocumentElement());
+
+ dataItemsXml.append(os.toString());
+ } catch (Exception e) {
+ Debug.logError("Exception during building data items to
Google", module);
+ return
ServiceUtil.returnFailure(UtilProperties.getMessage(resource,
"productsExportToGoogle.exceptionDuringBuildingDataItemsToGoogle", locale));
+ }
+ } catch (Exception e) {
+ Debug.logError("Exception during building data items to Google",
module);
+ return
ServiceUtil.returnFailure(UtilProperties.getMessage(resource,
"productsExportToGoogle.exceptionDuringBuildingDataItemsToGoogle", locale));
+ }
+ return ServiceUtil.returnSuccess();
+ }
+
+ private static String getProductPrice(LocalDispatcher dispatcher,
GenericValue product) {
+ String priceString = null;
+ try {
+ Map map = dispatcher.runSync("calculateProductPrice",
UtilMisc.toMap("product", product));
+ boolean validPriceFound =
((Boolean)map.get("validPriceFound")).booleanValue();
+ boolean isSale = ((Boolean)map.get("isSale")).booleanValue();
+ if (validPriceFound) {
+ // "price" is a mandatory output
+ priceString =
UtilFormatOut.formatPrice((Double)map.get("price"));
+ }
+ /*
+ if (isSale && null != map.get("price")) {
+ priceString =
UtilFormatOut.formatPrice((Double)map.get("price"));
+ } else if (null != map.get("defaultPrice")) {
+ priceString =
UtilFormatOut.formatPrice((Double)map.get("defaultPrice"));
+ } else if (null != map.get("listPrice")) {
+ priceString =
UtilFormatOut.formatPrice((Double)map.get("listPrice"));
+ }
+ */
+ } catch(Exception e){
+ Debug.logError("Exception calculating price for product [" +
product.getString("productId") + "]", module);
+ }
+ return priceString;
+ }
+}
Propchange:
ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductsExportToGoogle.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductsExportToGoogle.java
------------------------------------------------------------------------------
svn:keywords = "Date Rev Author URL Id"
Propchange:
ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductsExportToGoogle.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: ofbiz/trunk/applications/product/webapp/catalog/WEB-INF/controller.xml
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/webapp/catalog/WEB-INF/controller.xml?view=diff&rev=552765&r1=552764&r2=552765
==============================================================================
--- ofbiz/trunk/applications/product/webapp/catalog/WEB-INF/controller.xml
(original)
+++ ofbiz/trunk/applications/product/webapp/catalog/WEB-INF/controller.xml Tue
Jul 3 02:42:10 2007
@@ -2373,6 +2373,18 @@
<request-map uri="LookupFacilityLocation"><security auth="true"
https="true"/><response name="success" type="view"
value="LookupFacilityLocation"/></request-map>
<request-map uri="LookupWorkEffort"><security https="true"
auth="true"/><response name="success" type="view"
value="LookupWorkEffort"/></request-map>
+ <request-map uri="ProductsExportToGoogle">
+ <security https="true" auth="true"/>
+ <response name="success" type="view" value="ProductsExportToGoogle"/>
+ </request-map>
+
+ <request-map uri="exportProductsToGoogle">
+ <security https="true" auth="true"/>
+ <event type="service" path="" invoke="exportToGoogle"/>
+ <response name="success" type="view" value="ProductsExportToGoogle"/>
+ <response name="error" type="view" value="ProductsExportToGoogle"/>
+ </request-map>
+
<!-- end of request mappings -->
<!-- View Mappings -->
@@ -2504,6 +2516,8 @@
<view-map name="ListShipmentMethodTypes" type="screen"
page="component://product/widget/catalog/ShippingScreens.xml#ListShipmentMethodTypes"/>
<view-map name="ListCarrierShipmentMethods" type="screen"
page="component://product/widget/catalog/ShippingScreens.xml#ListCarrierShipmentMethods"/>
+ <view-map name="ProductsExportToGoogle" type="screen"
page="component://product/widget/catalog/FindScreens.xml#ProductsExportToGoogle"/>
+
<!-- Lookup request mappings -->
<view-map name="LookupContent"
page="component://content/widget/content/ContentScreens.xml#LookupContent"
type="screen"/>
<view-map name="LookupFixedAsset" type="screen"
page="component://accounting/widget/LookupScreens.xml#LookupFixedAsset"/>
Added: ofbiz/trunk/applications/product/webapp/catalog/find/ExportForms.xml
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/webapp/catalog/find/ExportForms.xml?view=auto&rev=552765
==============================================================================
--- ofbiz/trunk/applications/product/webapp/catalog/find/ExportForms.xml (added)
+++ ofbiz/trunk/applications/product/webapp/catalog/find/ExportForms.xml Tue
Jul 3 02:42:10 2007
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+<forms xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+
xsi:noNamespaceSchemaLocation="http://www.ofbiz.org/dtds/widget-form.xsd">
+
+ <form name="ProductsExportToGoogle" type="single"
target="exportProductsToGoogle">
+ <field name="products"><hidden/></field>
+ <field name="webSiteUrl"><text size="50" maxlength="250"/></field>
+ <field name="imageUrl"><text size="50" maxlength="250"/></field>
+ <field name="trackingCodeId" widget-style="selectBox">
+ <drop-down no-current-selected-key="_NA_">
+ <option key="_NA_"
description="${uiLabelMap.ProductExportNoTrackingRequested}"/>
+ <entity-options entity-name="TrackingCode"
description="${description}">
+ <entity-order-by field-name="description"/>
+ </entity-options>
+ </drop-down>
+ </field>
+ <field name="submitButton"
title="${uiLabelMap.ProductExportToGoogle}"><submit
button-type="button"/></field>
+ </form>
+</forms>
Propchange: ofbiz/trunk/applications/product/webapp/catalog/find/ExportForms.xml
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: ofbiz/trunk/applications/product/webapp/catalog/find/ExportForms.xml
------------------------------------------------------------------------------
svn:keywords = "Date Rev Author URL Id"
Propchange: ofbiz/trunk/applications/product/webapp/catalog/find/ExportForms.xml
------------------------------------------------------------------------------
svn:mime-type = text/xml
Modified: ofbiz/trunk/applications/product/webapp/catalog/find/keywordsearch.ftl
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/webapp/catalog/find/keywordsearch.ftl?view=diff&rev=552765&r1=552764&r2=552765
==============================================================================
--- ofbiz/trunk/applications/product/webapp/catalog/find/keywordsearch.ftl
(original)
+++ ofbiz/trunk/applications/product/webapp/catalog/find/keywordsearch.ftl Tue
Jul 3 02:42:10 2007
@@ -67,21 +67,43 @@
}
}
}
+
+ function exportToGoogle() {
+ var products = new Array();
+ var idx = 0;
+ for (var i = 0; i < document.products.elements.length; i++) {
+ var element = document.products.elements[i];
+ var sname = element.name.substring(0,12);
+ var product = "product" + element.name.substring(12);
+ if (sname == "selectResult" && element.checked) {
+ products[idx] = document.products.elements[product].value;
+ idx++;
+ }
+ }
+ if (idx == 0) {
+ alert('At least one product has to be selected');
+ } else {
+
document.exportToGoogle.action="<@ofbizUrl>ProductsExportToGoogle</@ofbizUrl>";
+ document.exportToGoogle.products.value = products;
+ document.exportToGoogle.submit();
+ }
+ }
</script>
-<center>
+<form name="products">
<table width="100%" cellpadding="0" cellspacing="0">
<#assign listIndex = lowIndex>
<#list productIds as productId><#-- note that there is no boundary range
because that is being done before the list is put in the content -->
<#assign product = delegator.findByPrimaryKey("Product",
Static["org.ofbiz.base.util.UtilMisc"].toMap("productId", productId))>
<tr>
<td>
+ <input type="hidden" name="product${productId_index}"
value="${productId}"/>
<input type="checkbox" name="selectResult${productId_index}"
onchange="checkProductToBagTextArea(this, '${productId}');"/>
<a href="<@ofbizUrl>EditProduct?productId=${productId}</@ofbizUrl>"
class="buttontext">[${productId}] ${(product.internalName)?if_exists}</a>
</td>
</tr>
</#list>
</table>
-</center>
+<form>
</#if>
<#if productIds?has_content>
@@ -188,8 +210,8 @@
<div class="tabletext">
<form method="post" action="" name="searchShowParams">
<#assign searchParams =
Static["org.ofbiz.product.product.ProductSearchSession"].makeSearchParametersString(session)>
- <div><b>Plain Search Parameters:</b><input type="text" size="60"
name="searchParameters" value="${searchParams}" class="inputBox"></div>
- <div><b>HTML Search Parameters:</b><input type="text" size="60"
name="searchParameters" value="${searchParams?html}" class="inputBox"></div>
+ <div><b>${uiLabelMap.ProductPlainSearchParameters}:</b><input type="text"
size="60" name="searchParameters" value="${searchParams}"
class="inputBox"></div>
+ <div><b>${uiLabelMap.ProductHtmlSearchParameters}:</b><input type="text"
size="60" name="searchParameters" value="${searchParams?html}"
class="inputBox"></div>
<input type="hidden" name="clearSearch" value="N">
</form>
</div>
@@ -197,5 +219,11 @@
<hr class="sepbar"/>
<div class="tabletext">
<b>${uiLabelMap.ProductSearchExportProductList}:</b> <a
href="<@ofbizUrl>searchExportProductList?clearSearch=N</@ofbizUrl>"
class="buttontext">${uiLabelMap.ProductSearchExport}</a>
+ <#if productIds?has_content>
+ <a href="javascript:exportToGoogle();"
class="buttontext">${uiLabelMap.ProductExportToGoogle}</a>
+ <form method="post" name="exportToGoogle">
+ <input type="hidden" name="products">
+ </form>
+ </#if>
</div>
</#if>
Modified: ofbiz/trunk/applications/product/widget/catalog/FindScreens.xml
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/widget/catalog/FindScreens.xml?view=diff&rev=552765&r1=552764&r2=552765
==============================================================================
--- ofbiz/trunk/applications/product/widget/catalog/FindScreens.xml (original)
+++ ofbiz/trunk/applications/product/widget/catalog/FindScreens.xml Tue Jul 3
02:42:10 2007
@@ -132,4 +132,23 @@
</widgets>
</section>
</screen>
+
+ <screen name="ProductsExportToGoogle">
+ <section>
+ <actions>
+ <set field="titleProperty"
value="PageTitleProductsExportToGoogle"/>
+ </actions>
+ <widgets>
+ <decorator-screen name="CommonProductDecorator"
location="${parameters.mainDecoratorLocation}">
+ <decorator-section name="body">
+ <container>
+ <label
style="head1">${uiLabelMap.PageTitleProductsExportToGoogle}</label>
+ </container>
+ <include-form name="ProductsExportToGoogle"
location="component://product/webapp/catalog/find/ExportForms.xml"/>
+ </decorator-section>
+ </decorator-screen>
+ </widgets>
+ </section>
+ </screen>
+
</screens>