Author: jleroux
Date: Thu Aug 28 03:02:47 2008 New Revision: 689772 URL: http://svn.apache.org/viewvc?rev=689772&view=rev Log: A patch from Mridul Pathak "Added support for uploading additional Product Views (images)" (https://issues.apache.org/jira/browse/OFBIZ-1930) - OFBIZ-1930 I fixed an, unrelated to patch, problem in EditProductContentContent.groovy. This is not the 1st time I cross this type of issue. I checked it does not appear on demo server and I guess it was not appearing with bsh before. I'm not sure of its origin but it seems related to my configuration. I use, from my machine default, "Central European Summer Time" and demo server uses "Central Daylight Time". But I can't see why it affects my machine and not the demo server : there is no origin here (maybe GMT, but obviously it's not the case) The lines I added are (+ import) } else { fromDate = ObjectType.simpleTypeConvert(fromDate, "Timestamp", null, null, false) } (I intentionnaly let the line without semi-colon as it's not mandatory in Groovy) Added: ofbiz/trunk/framework/images/webapp/images/products/additional/ Modified: ofbiz/trunk/applications/product/data/ProductTypeData.xml ofbiz/trunk/applications/product/servicedef/services.xml ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductServices.java ofbiz/trunk/applications/product/webapp/catalog/WEB-INF/actions/product/EditProductContentContent.groovy ofbiz/trunk/applications/product/webapp/catalog/WEB-INF/controller.xml ofbiz/trunk/applications/product/webapp/catalog/product/ProductForms.xml Modified: ofbiz/trunk/applications/product/data/ProductTypeData.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/data/ProductTypeData.xml?rev=689772&r1=689771&r2=689772&view=diff ============================================================================== --- ofbiz/trunk/applications/product/data/ProductTypeData.xml (original) +++ ofbiz/trunk/applications/product/data/ProductTypeData.xml Thu Aug 28 03:02:47 2008 @@ -231,6 +231,10 @@ <ProductContentType description="Image Alt Text - Medium" hasTable="N" parentTypeId="" productContentTypeId="MEDIUM_IMAGE_ALT"/> <ProductContentType description="Image Alt Text - Large" hasTable="N" parentTypeId="" productContentTypeId="LARGE_IMAGE_ALT"/> <ProductContentType description="Image Alt Text - Detail" hasTable="N" parentTypeId="" productContentTypeId="DETAIL_IMAGE_ALT"/> + <ProductContentType description="Image - Additional View 1" hasTable="N" parentTypeId="" productContentTypeId="ADDITIONAL_IMAGE_1"/> + <ProductContentType description="Image - Additional View 2" hasTable="N" parentTypeId="" productContentTypeId="ADDITIONAL_IMAGE_2"/> + <ProductContentType description="Image - Additional View 3" hasTable="N" parentTypeId="" productContentTypeId="ADDITIONAL_IMAGE_3"/> + <ProductContentType description="Image - Additional View 4" hasTable="N" parentTypeId="" productContentTypeId="ADDITIONAL_IMAGE_4"/> <ProductContentType description="Add To Cart Label" hasTable="N" parentTypeId="" productContentTypeId="ADDTOCART_LABEL"/> <ProductContentType description="Add To Cart Image" hasTable="N" parentTypeId="" productContentTypeId="ADDTOCART_IMAGE"/> <ProductContentType description="Short Sales Pitch" hasTable="N" parentTypeId="" productContentTypeId="SHORT_SALES_PITCH"/> Modified: ofbiz/trunk/applications/product/servicedef/services.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/servicedef/services.xml?rev=689772&r1=689771&r2=689772&view=diff ============================================================================== --- ofbiz/trunk/applications/product/servicedef/services.xml (original) +++ ofbiz/trunk/applications/product/servicedef/services.xml Thu Aug 28 03:02:47 2008 @@ -414,6 +414,16 @@ <override name="localeString" optional="false"/> <override name="contentId" mode="INOUT"/> </service> + + <service name="addAdditionalViewForProduct" default-entity-name="ProductContent" engine="java" + location="org.ofbiz.product.product.ProductServices" invoke="addAdditionalViewForProduct" auth="true"> + <implements service="uploadFileInterface"/> + <auto-attributes include="pk" mode="IN" optional="true"/> + <auto-attributes include="nonpk" mode="IN" optional="true"/> + <attribute mode="IN" name="contentId" optional="true" type="String"/> + <override name="productContentTypeId" optional="false"/> + <override name="productId" optional="false"/> + </service> <!-- SupplierProduct Services --> <service name="createSupplierProduct" default-entity-name="SupplierProduct" engine="simple" Modified: ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductServices.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductServices.java?rev=689772&r1=689771&r2=689772&view=diff ============================================================================== --- ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductServices.java (original) +++ ofbiz/trunk/applications/product/src/org/ofbiz/product/product/ProductServices.java Thu Aug 28 03:02:47 2008 @@ -18,14 +18,23 @@ *******************************************************************************/ package org.ofbiz.product.product; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.RandomAccessFile; +import java.nio.ByteBuffer; import java.sql.Timestamp; import java.util.*; +import javolution.util.FastList; +import javolution.util.FastMap; + import org.ofbiz.base.util.Debug; import org.ofbiz.base.util.UtilDateTime; import org.ofbiz.base.util.UtilMisc; import org.ofbiz.base.util.UtilProperties; import org.ofbiz.base.util.UtilValidate; +import org.ofbiz.base.util.string.FlexibleStringExpander; import org.ofbiz.entity.GenericDelegator; import org.ofbiz.entity.GenericEntityException; import org.ofbiz.entity.GenericValue; @@ -934,5 +943,163 @@ return ServiceUtil.returnSuccess(); } + + public static Map addAdditionalViewForProduct(DispatchContext dctx, Map context) { + LocalDispatcher dispatcher = dctx.getDispatcher(); + GenericDelegator delegator = dctx.getDelegator(); + GenericValue userLogin = (GenericValue) context.get("userLogin"); + String productId = (String) context.get("productId"); + String productContentTypeId = (String) context.get("productContentTypeId"); + ByteBuffer imageData = (ByteBuffer) context.get("uploadedFile"); + + if (UtilValidate.isNotEmpty((String) context.get("_uploadedFile_fileName"))) { + String imageFilenameFormat = UtilProperties.getPropertyValue("catalog", "image.filename.format"); + String imageServerPath = UtilProperties.getPropertyValue("catalog", "image.server.path"); + String imageUrlPrefix = UtilProperties.getPropertyValue("catalog", "image.url.prefix"); + + FlexibleStringExpander filenameExpander = FlexibleStringExpander.getInstance(imageFilenameFormat); + String id = productId + "_View_" + productContentTypeId.charAt(productContentTypeId.length() - 1); + String fileLocation = filenameExpander.expandString(UtilMisc.toMap("location", "products", "type", "additional", "id", id)); + String filePathPrefix = ""; + String filenameToUse = fileLocation; + if (fileLocation.lastIndexOf("/") != -1) { + filePathPrefix = fileLocation.substring(0, fileLocation.lastIndexOf("/") + 1); // adding 1 to include the trailing slash + filenameToUse = fileLocation.substring(fileLocation.lastIndexOf("/") + 1); + } + + List fileExtension = FastList.newInstance(); + try { + fileExtension = delegator.findByAnd("FileExtension", UtilMisc.toMap("mimeTypeId", (String) context.get("_uploadedFile_contentType"))); + } catch (GenericEntityException e) { + Debug.logError(e, module); + ServiceUtil.returnError(e.getMessage()); + } + + GenericValue extension = EntityUtil.getFirst(fileExtension); + if (extension != null) { + filenameToUse += "." + extension.getString("fileExtensionId"); + } + + File file = new File(imageServerPath + "/" + filePathPrefix + filenameToUse); + + try { + RandomAccessFile out = new RandomAccessFile(file, "rw"); + out.write(imageData.array()); + out.close(); + } catch (FileNotFoundException e) { + Debug.logError(e, module); + return ServiceUtil.returnError("Unable to open file for writing: " + file.getAbsolutePath()); + } catch (IOException e) { + Debug.logError(e, module); + return ServiceUtil.returnError("Unable to write binary data to: " + file.getAbsolutePath()); + } + + String imageUrl = imageUrlPrefix + "/" + filePathPrefix + filenameToUse; + + if (UtilValidate.isNotEmpty(imageUrl) && imageUrl.length() > 0) { + String contentId = (String) context.get("contentId"); + + Map dataResourceCtx = FastMap.newInstance(); + dataResourceCtx.put("objectInfo", imageUrl); + dataResourceCtx.put("dataResourceName", (String) context.get("_uploadedFile_fileName")); + dataResourceCtx.put("userLogin", userLogin); + + Map productContentCtx = FastMap.newInstance(); + productContentCtx.put("productId", productId); + productContentCtx.put("productContentTypeId", productContentTypeId); + productContentCtx.put("fromDate", (Timestamp) context.get("fromDate")); + productContentCtx.put("thruDate", (Timestamp) context.get("thruDate")); + productContentCtx.put("userLogin", userLogin); + + if (UtilValidate.isNotEmpty(contentId)) { + GenericValue content = null; + try { + content = delegator.findOne("Content", UtilMisc.toMap("contentId", contentId), false); + } catch (GenericEntityException e) { + Debug.logError(e, module); + ServiceUtil.returnError(e.getMessage()); + } + + if (content != null) { + GenericValue dataResource = null; + try { + dataResource = content.getRelatedOne("DataResource"); + } catch (GenericEntityException e) { + Debug.logError(e, module); + ServiceUtil.returnError(e.getMessage()); + } + + if (dataResource != null) { + dataResourceCtx.put("dataResourceId", dataResource.getString("dataResourceId")); + try { + Map dataResourceResult = dispatcher.runSync("updateDataResource", dataResourceCtx); + } catch (GenericServiceException e) { + Debug.logError(e, module); + ServiceUtil.returnError(e.getMessage()); + } + } else { + dataResourceCtx.put("dataResourceTypeId", "URL_RESOURCE"); + Map dataResourceResult = FastMap.newInstance(); + try { + dataResourceResult = dispatcher.runSync("createDataResource", dataResourceCtx); + } catch (GenericServiceException e) { + Debug.logError(e, module); + ServiceUtil.returnError(e.getMessage()); + } + + Map contentCtx = FastMap.newInstance(); + contentCtx.put("contentId", contentId); + contentCtx.put("dataResourceId", dataResourceResult.get("dataResourceId")); + contentCtx.put("userLogin", userLogin); + try { + Map contentResult = dispatcher.runSync("updateContent", contentCtx); + } catch (GenericServiceException e) { + Debug.logError(e, module); + ServiceUtil.returnError(e.getMessage()); + } + } + + productContentCtx.put("contentId", contentId); + try { + Map productContentResult = dispatcher.runSync("updateProductContent", productContentCtx); + } catch (GenericServiceException e) { + Debug.logError(e, module); + ServiceUtil.returnError(e.getMessage()); + } + } + } else { + dataResourceCtx.put("dataResourceTypeId", "URL_RESOURCE"); + Map dataResourceResult = FastMap.newInstance(); + try { + dataResourceResult = dispatcher.runSync("createDataResource", dataResourceCtx); + } catch (GenericServiceException e) { + Debug.logError(e, module); + ServiceUtil.returnError(e.getMessage()); + } + + Map contentCtx = FastMap.newInstance(); + contentCtx.put("contentTypeId", "DOCUMENT"); + contentCtx.put("dataResourceId", dataResourceResult.get("dataResourceId")); + contentCtx.put("userLogin", userLogin); + Map contentResult = FastMap.newInstance(); + try { + contentResult = dispatcher.runSync("createContent", contentCtx); + } catch (GenericServiceException e) { + Debug.logError(e, module); + ServiceUtil.returnError(e.getMessage()); + } + + productContentCtx.put("contentId", contentResult.get("contentId")); + try { + Map productContentResult = dispatcher.runSync("createProductContent", productContentCtx); + } catch (GenericServiceException e) { + Debug.logError(e, module); + ServiceUtil.returnError(e.getMessage()); + } + } + } + } + return ServiceUtil.returnSuccess(); + } } Modified: ofbiz/trunk/applications/product/webapp/catalog/WEB-INF/actions/product/EditProductContentContent.groovy URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/webapp/catalog/WEB-INF/actions/product/EditProductContentContent.groovy?rev=689772&r1=689771&r2=689772&view=diff ============================================================================== --- ofbiz/trunk/applications/product/webapp/catalog/WEB-INF/actions/product/EditProductContentContent.groovy (original) +++ ofbiz/trunk/applications/product/webapp/catalog/WEB-INF/actions/product/EditProductContentContent.groovy Thu Aug 28 03:02:47 2008 @@ -22,6 +22,7 @@ import org.ofbiz.entity.util.*; import org.ofbiz.base.util.*; import java.sql.Timestamp; +import org.ofbiz.base.util.ObjectType contentId = request.getParameter("contentId"); if ("".equals(contentId)) { @@ -33,8 +34,11 @@ fromDate = request.getParameter("fromDate"); if ("".equals(fromDate)) { fromDate = null; +} else { + fromDate = ObjectType.simpleTypeConvert(fromDate, "Timestamp", null, null, false) } + description = request.getParameter("description"); if ("".equals(description)) { description = null; @@ -115,6 +119,8 @@ context.downloadData = downloadData; } else if ("FULFILLMENT_EXTERNAL".equals(productContentTypeId)) { context.contentFormName = "EditProductContentExternal"; +} else if (productContentTypeId.indexOf("ADDITIONAL_IMAGE") > -1) { + context.contentFormName = "EditProductAdditionalImageContent"; } else { //Assume it is a generic simple text content textData = [:]; @@ -134,4 +140,4 @@ context.productContentData = productContentData; context.content = content; -context.contentId = contentId; \ No newline at end of file +context.contentId = contentId; 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?rev=689772&r1=689771&r2=689772&view=diff ============================================================================== --- ofbiz/trunk/applications/product/webapp/catalog/WEB-INF/controller.xml (original) +++ ofbiz/trunk/applications/product/webapp/catalog/WEB-INF/controller.xml Thu Aug 28 03:02:47 2008 @@ -700,6 +700,12 @@ <response name="success" type="view" value="EditProductContent"/> <response name="error" type="view" value="EditProductContentContent"/> </request-map> + <request-map uri="addAdditionalImageContentForProduct"> + <security https="true" auth="true"/> + <event type="service" path="" invoke="addAdditionalViewForProduct"/> + <response name="success" type="view" value="EditProductContent"/> + <response name="error" type="view" value="EditProductContentContent"/> + </request-map> <!-- ================ Product GoodIdentification Requests ================= --> <request-map uri="EditProductGoodIdentifications"> Modified: ofbiz/trunk/applications/product/webapp/catalog/product/ProductForms.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/webapp/catalog/product/ProductForms.xml?rev=689772&r1=689771&r2=689772&view=diff ============================================================================== --- ofbiz/trunk/applications/product/webapp/catalog/product/ProductForms.xml (original) +++ ofbiz/trunk/applications/product/webapp/catalog/product/ProductForms.xml Thu Aug 28 03:02:47 2008 @@ -662,6 +662,26 @@ <field use-when="contentId == null" name="submitButton" title="${uiLabelMap.CommonCreate}" widget-style="smallSubmit"><submit button-type="button"/></field> <field use-when="contentId != null" name="submitButton" title="${uiLabelMap.CommonUpdate}" widget-style="smallSubmit"><submit button-type="button"/></field> </form> + + <form name="EditProductAdditionalImageContent" type="upload" target="addAdditionalImageContentForProduct" title=""> + <auto-fields-entity entity-name="ProductContent" map-name="productContentData"/> + <field name="productContentTypeId"><display-entity entity-name="ProductContentType" also-hidden="true"/></field> + <field name="fromDate" use-when="contentId==null" title="${uiLabelMap.CommonFromDate}*" ><date-time/></field> + <field name="fromDate" use-when="contentId!=null" title="${uiLabelMap.CommonFromDate}" ><display/></field> + <field name="thruDate" title="${uiLabelMap.CommonThruDate}"></field> + <field use-when="contentId == null" name="contentId"><ignored/></field> + <field use-when="contentId != null" name="contentId" tooltip="${uiLabelMap.ProductNotModificationRecrationProductContentAssociation}" map-name="productContentData" ><display/></field> + <field name="useTime"><hidden/></field> + <field name="useTimeUomId"><hidden/></field> + <field name="useRoleTypeId"><hidden/></field> + <field name="useCountLimit"><hidden/></field> + <field name="purchaseThruDate"><hidden/></field> + <field name="purchaseFromDate"><hidden/></field> + <field name="uploadedFile" title="${uiLabelMap.ProductFile}"><file/></field> + <field name="productId"><hidden/></field> + <field use-when="contentId == null" name="submitButton" title="${uiLabelMap.CommonCreate}" widget-style="smallSubmit"><submit button-type="button"/></field> + <field use-when="contentId != null" name="submitButton" title="${uiLabelMap.CommonUpdate}" widget-style="smallSubmit"><submit button-type="button"/></field> + </form> <!-- SupplierProduct --> <form name="AddSupplierProduct" type="single" target="updateSupplierProduct" title="" default-map-name="supplierProduct" |
Free forum by Nabble | Edit this page |