| /* |
| * 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. |
| */ |
| |
| import java.lang.* |
| import java.util.* |
| import org.apache.ofbiz.base.util.* |
| import org.apache.ofbiz.entity.* |
| import org.apache.ofbiz.service.* |
| import org.apache.ofbiz.product.catalog.* |
| import org.apache.ofbiz.product.category.* |
| import org.apache.ofbiz.product.product.ProductWorker |
| import org.apache.ofbiz.product.product.ProductContentWrapper |
| import org.apache.ofbiz.entity.util.EntityUtil |
| |
| contentPathPrefix = CatalogWorker.getContentPathPrefix(request) |
| catalogName = CatalogWorker.getCatalogName(request) |
| currentCatalogId = CatalogWorker.getCurrentCatalogId(request) |
| requestParams = UtilHttp.getParameterMap(request) |
| |
| detailScreen = "productdetail" |
| productId = requestParams.product_id ?: request.getAttribute("product_id") |
| |
| pageTitle = null |
| metaDescription = null |
| metaKeywords = null |
| |
| // get the product entity |
| if (productId) { |
| product = from("Product").where("productId", productId).cache(true).queryOne() |
| if (product) { |
| // first make sure this isn't a virtual-variant that has an associated virtual product, if it does show that instead of the variant |
| if("Y".equals(product.isVirtual) && "Y".equals(product.isVariant)){ |
| virtualVariantProductAssocs = from("ProductAssoc").where("productId", productId, "productAssocTypeId", "ALTERNATIVE_PACKAGE").orderBy("-fromDate").filterByDate().cache(true).queryList() |
| if (virtualVariantProductAssocs) { |
| productAssoc = EntityUtil.getFirst(virtualVariantProductAssocs) |
| product = productAssoc.getRelatedOne("AssocProduct", true) |
| } |
| } |
| } |
| |
| // first make sure this isn't a variant that has an associated virtual product, if it does show that instead of the variant |
| virtualProductId = ProductWorker.getVariantVirtualId(product) |
| if (virtualProductId) { |
| productId = virtualProductId |
| product = from("Product").where("productId", productId).cache(true).queryOne() |
| } |
| |
| productPageTitle = from("ProductContentAndInfo").where("productId", productId, "productContentTypeId", "PAGE_TITLE").cache(true).queryList() |
| if (productPageTitle) { |
| pageTitle = from("ElectronicText").where("dataResourceId", productPageTitle.get(0).dataResourceId).cache(true).queryOne() |
| } |
| productMetaDescription = from("ProductContentAndInfo").where("productId", productId, "productContentTypeId", "META_DESCRIPTION").cache(true).queryList() |
| if (productMetaDescription) { |
| metaDescription = from("ElectronicText").where("dataResourceId", productMetaDescription.get(0).dataResourceId).cache(true).queryOne() |
| } |
| productMetaKeywords = from("ProductContentAndInfo").where("productId", productId, "productContentTypeId", "META_KEYWORD").cache(true).queryList() |
| if (productMetaKeywords) { |
| metaKeywords = from("ElectronicText").where("dataResourceId", productMetaKeywords.get(0).dataResourceId).cache(true).queryOne() |
| } |
| |
| context.productId = productId |
| |
| // now check to see if there is a view allow category and if this product is in it... |
| if (product) { |
| viewProductCategoryId = CatalogWorker.getCatalogViewAllowCategoryId(delegator, currentCatalogId) |
| if (viewProductCategoryId) { |
| if (!CategoryWorker.isProductInCategory(delegator, productId, viewProductCategoryId)) { |
| // a view allow productCategoryId was found, but the product is not in the category, axe it... |
| product = null |
| } |
| } |
| } |
| |
| if (product) { |
| context.product = product |
| contentWrapper = new ProductContentWrapper(product, request) |
| |
| if (pageTitle) { |
| context.title = pageTitle.textData |
| } else { |
| context.put("title", contentWrapper.get("PRODUCT_NAME", "html")) |
| } |
| |
| if (metaDescription) { |
| context.metaDescription = metaDescription.textData |
| } else { |
| context.put("metaDescription", contentWrapper.get("DESCRIPTION", "html")) |
| } |
| |
| if (metaKeywords) { |
| context.metaKeywords = metaKeywords.textData |
| } else { |
| keywords = [] |
| keywords.add(contentWrapper.get("PRODUCT_NAME", "html")) |
| keywords.add(catalogName) |
| members = from("ProductCategoryMember").where("productId", productId).cache(true).queryList() |
| members.each { member -> |
| category = member.getRelatedOne("ProductCategory", true) |
| if (category.description) { |
| categoryContentWrapper = new CategoryContentWrapper(category, request) |
| categoryDescription = categoryContentWrapper.get("DESCRIPTION", "html") |
| if (categoryDescription) { |
| keywords.add(categoryDescription) |
| } |
| } |
| } |
| context.metaKeywords = StringUtil.join(keywords, ", ") |
| } |
| |
| // Set the default template for aggregated product (product component configurator ui) |
| if (product.productTypeId && ("AGGREGATED".equals(product.productTypeId) || "AGGREGATED_SERVICE".equals(product.productTypeId)) && context.configproductdetailScreen) { |
| detailScreen = context.configproductdetailScreen |
| } |
| |
| productTemplate = product.detailScreen |
| if (productTemplate) { |
| detailScreen = productTemplate |
| } |
| } |
| } |
| |
| // check the catalog's template path and update |
| templatePathPrefix = CatalogWorker.getTemplatePathPrefix(request) |
| if (templatePathPrefix) { |
| detailScreen = templatePathPrefix + detailScreen |
| } |
| |
| // set the template for the view |
| context.detailScreen = detailScreen |