【问题标题】:Product compare in HybrisHybris 中的产品比较
【发布时间】:2018-06-02 14:59:47
【问题描述】:

这用于产品比较功能。产品具有产品代码、名称、图像 URL、评论、价格等属性。我的产品比较面板将只有我计划在会话中存储的每个产品的几个功能。这可以使用 JQuery 完成吗?策略应该是什么?


更新:

组件控制器

@Override
    protected void fillModel(final HttpServletRequest request, final Model model,
            final ProductCompareComponentModel component)

final Cookie[] cookies = request.getCookies();
        String productList = null;
        boolean cookieFound = false;

        logger.info("Displaying session value for product compare" + sessionService.getAttribute("sessionProductCode"));
        if (cookies != null)
        {
            logger.info("Cookies not null");
            for (final Cookie cookie : cookies)
            {
                logger.info("Cookie name" + cookie.getName());
                if (cookie.getName().equals("productList") && cookie.getValue() != null)
                {
                    cookieFound = true;
                    productList = cookie.getValue().toString();
                    logger.info("Product List value" + cookie.getValue().toString());

                }
            }
        }

if (cookieFound == false)
        {
            if (sessionService.getAttribute("sessionProductCode") != null)
            {
                productList = sessionService.getAttribute("sessionProductCode");
            }
        }

        final ArrayList<ProductCompareDTO> prodCompareMapPanelView = populateCompareMap(productList);

        if (component.getDisplayType().toString() == CommonConstants.COMPARE_VIEW_PANEL)
        {
            logger.info("Displaying panel view ");
            model.addAttribute("prodCompareMapPanelView", prodCompareMapPanelView);
        }
        else

        if (component.getDisplayType().toString() == CommonConstants.COMPARE_VIEW_FULL)
        {
            logger.info("Displaying full view ");
        }

        model.addAttribute("displaytype", component.getDisplayType().toString());
        model.addAttribute("maxCount", component.getMaxProductCount());
    }

组件 JSP

    <c:choose>
        <c:when test="${not empty maxCount && not empty displaytype}">


            <div id="compare-pane" class="row comparePanel1">
                <button type='button' onclick='doComparePanelClose()'>Close
                    Compare Panel</button>

                <c:if test="${displaytype == 'PANELVIEW'}">

                    <c:forEach items="${prodCompareMapPanelView}" var="mapEntry">
                        <div class="col-sm-4" id="innerdiv${mapEntry.code}">

                            <c:if test="${(not empty mapEntry.name)}">
                            ${mapEntry.name}
                            </c:if>
                            <c:if test="${not empty mapEntry.thumbnail }">
                                <img src="${mapEntry.thumbnail}" />
                                <button id="close${mapEntry.code}" class="compareButton"
                                    type="submit" data-product-id="${mapEntry.code}"
                                    onclick="closeCompareProductPanel('${mapEntry.code}');">Close
                                    X</button>
                            </c:if>
                        </div>

                    </c:forEach>

                </c:if>

                <div id="bottomInnerComparePanel1">*Compare upto ${maxCount }
                    products</div>
                <button id="comparesubmit" class="compareButton" type="submit"
                    onclick="compareSubmit();">See Comparison ></button>

            </div>
            <c:url value="/search/compare" var="compareUrl" />
            <form id="compareForm" method="get" action="${compareUrl}"
                target="_blank">

                <c:if test="${displaytype == 'FULLVIEW'}">
                </c:if>
            </form>
        </c:when>

    </c:choose>

搜索页面控制器

    @SuppressWarnings("boxing")
        @RequestMapping(value = "/compare", method = RequestMethod.GET)
        public String compareProducts(@RequestParam(value = "prevPage", defaultValue = StringUtils.EMPTY) final String prevPage,
                final Model model, final HttpSession session, final HttpServletRequest request)
                throws CMSItemNotFoundException, UnsupportedEncodingException
        {
        // fetching product list from sesssion and returning Product Data map

    final Map<String, List<ProductClassificationData>> productClassDataMap = new HashMap<String, List<ProductClassificationData>>();
            final Map<String, HashSet<String>> prodClassMap = new TreeMap<String, HashSet<String>>();
            final String lastCode = null;

            final Cookie[] cookies = request.getCookies();
            String productList = null;
            boolean cookieFound = false;

            if (cookies != null)
            {
                logger.info("Cookies not null");
                for (final Cookie cookie : cookies)
                {
                    logger.info("Cookie name" + cookie.getName());
                    if (cookie.getName().equals("productList") && cookie.getValue() != null)
                    {
                        cookieFound = true;
                        productList = cookie.getValue().toString();
                        logger.info("Product List value" + cookie.getValue().toString());

                    }
                }
            }

    if (StringUtils.isNotBlank(productList))
            {
                final String[] values = productList.split("\\|");
                final String PRODUCT_COMPARE_PAGE = "productComparePage";
                storeCmsPageInModel(model, getContentPageForLabelOrId(PRODUCT_COMPARE_PAGE));
                setUpMetaDataForContentPage(model, getContentPageForLabelOrId(PRODUCT_COMPARE_PAGE));
                final List<ProductData> productDatalList = new ArrayList<ProductData>();
                final List<String> productCodesList = new ArrayList<String>();
                for (final String productcode : values)
                {
                    ProductData productData = null;
                    final List<ProductOption> options = new ArrayList<>(
                            Arrays.asList(ProductOption.BASIC, ProductOption.CLASSIFICATION, ProductOption.PRICE, ProductOption.STOCK));
                    if (productcode != null && "".equalsIgnoreCase(productcode))
                    {
                        productData = productFacade.getProductForCodeAndOptions(productcode, options);
                        productDatalList.add(productData);
                        productCodesList.add(productcode);
                    }
                }
    // fetch feature data and add it to model

    }

final int mapSize = finalDataList.size();
            model.addAttribute("finalDataList", finalDataList);
            model.addAttribute("mapSize", mapSize);
            model.addAttribute("compareCodeList", productCodesList);
            model.addAttribute("compareCodeListSize", productCodesList.size());
            model.addAttribute("prodDataList", productDatalList);
        }

        return getViewForPage(model);
   }

当用户单击“查看比较按钮”时,我将重定向到一个新页面 productComparePage.jsp,我想在其中显示产品及其所有属性的完整比较。但是现在我再次从搜索页面控制器重定向到组件控制器。我在这个新页面上再次获得了面板视图。

【问题讨论】:

  • 我确信它可以,但是没有提供足够的详细信息来说明您打算从哪里比较或从哪里比较?请花几分钟阅读How to Askminimal reproducible example来帮助我们
  • 我在我的 jsp 文件中获得了一个 javascript 对象列表 - 'Products'。我必须根据用户的选择来比较它们。这是任何 B2C 网站上的电子商务产品比较功能
  • 这还是太模糊了。我无法想象您在最后 2 分钟内彻底阅读了这 2 个链接
  • 我目前没有代码 sn-p。但我可以给出一个大纲 我的 JSP 文件 - ProductList.jsp 我可以使用 {product},{product.productCode},{product.name} 访问此处的所有产品 现在我必须编写一个 jquery 来传递每个产​​品详细信息以进行产品比较.所以我为 productList Page 上的每个产品定义了一个复选框,它将产品对象传递给我的 jquery 下一步是将此详细信息添加到 session 。假设用户选择 Product 001 。我希望产品代码、名称、价格进入用户会话,以便我可以将其添加到产品比较 div。我希望它现在清楚了吗?
  • edit the question 提供详细信息,不要在 cmets 中进行重大更新。了解如何使用 ajax 向服务器发送数据。

标签: jquery e-commerce javascript-objects hybris


【解决方案1】:

您可以使用 cookie 来存储对象。您可以在 Internet 上找到许多示例。喜欢thisthis。您不应将每个产品数据存储在 cookie 中。

我的建议

  • 创建产品比较面板/组件,应始终显示在屏幕上。
  • 每当用户选择任何产品时,它都应该添加到您的比较面板并将该产品代码 (SKU)、名称、图像 src 存储在 cookie 中。确保产品比较面板始终使用 cookie 数据显示,因此即使页面刷新,它也能正常工作。像这样,你必须处理删除事件。

  • 当用户点击比较按钮时,您可以使用所选产品代码列表(来自 cookie)进行 ajax 调用,并获取产品数据对象以呈现您的比较页面或简单地将数据提交给您的控制器和显示比较页面。

但是,有大量可用的开源插件也可以帮助您完成工作。

【讨论】:

  • 您好,我能够创建一个组件。它有两个属性 1. 没有。要显示的产品 2. 视图类型 - 面板视图/完整视图 单击“比较”按钮时,我将重定向到位于 /search/compare 的另一个页面,该页面应该具有产品的完整比较。这是另一个jsp页面。但是我仍然进入组件控制器并且面板视图本身显示。我的完整比较逻辑在 SearchPageController 内部。这是正确的做法吗?
  • 在您使用代码 sn-p 提供所有详细信息之前,什么都不能说。
  • 您好,我已经用代码 sn-p 更新了问题。
  • 不要将您的组件与两种视图类型混合。让它只是面板。现在,当您单击比较按钮时,应将用户数据提交/获取到您的控制器并将该数据呈现到新页面(cmsPage)。如果您不想重定向到新页面,则可以使用 OOTB colorbox js 将数据呈现为弹出窗口。
  • 您好,我也在做同样的事情。然而,它被重定向到组件控制器并再次呈现面板视图 // 在我的 JSP
    ${displaytype}****************
猜你喜欢
  • 1970-01-01
  • 2013-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-22
  • 1970-01-01
  • 2013-08-01
  • 1970-01-01
相关资源
最近更新 更多