HYBRIS - 组件和插槽如何在 JSP 文件中工作?

HYBRIS - How components and slots work in JSP file?

最近在用Hybris,不太明白组件是怎么工作的。

我知道如何创建和定义一个,如何将它们添加到我想要的页面等。但是我不明白如何使用 jsp 文件中的标签 <cms: component>

在产品详细信息页面的插槽 AddToCartSlot 中,我添加了更多组件。我试着像标准一样调用我的组件并评论他的行。

默认调用组件如下:

<cms:pageSlot position="AddToCart" var="component">
   <cms:component component="${component}" />
</cms:pageSlot>

所以我也尝试调用我的组件,但不起作用:

<cms:pageSlot position="MyComponent" var="component">
   <cms:component component="${component}" />
</cms:pageSlot>

所以我的行注释了他的行,取消了注释,页面上显示了所有组件。 但对我来说这没有任何意义,因为在标签的位置属性中 cms:pageSlot 应该接收一个插槽的 id 而不是一个组件的 id 来显示所有组件插槽。但是,将 id AddToCart 而不是 AddToCartSlot 是所有组件都显示在页面上的唯一方法。

现在你会想'what the problem if the components are being displayed on the web?',嗯,问题是这些组件并没有通过对应的java控制器(尽管在com.myStore.storefront.controllers.ControllerConstants.java 文件)。另外想了解下为什么不能正常使用

我按照 Wki Hybris 的步骤进行操作,发现所有内容都按原样声明到另一个正常工作的自定义组件。我找不到差异,我不明白为什么不通过我的控制器,或者为什么标签不能像槽的 id 那样工作,但是当我使用组件的标识符时它 "works"。

真的,任何想法都会有所帮助。

非常感谢。

尝试以下操作:

  1. 同步目录。您可能一切都正确,但可能忘记在添加组件后同步目录。这可能是微不足道的,但值得一试。
  2. 既然您创建了自己的组件,我假设您也为您的组件创建了一个 JSP(如果它扩展了 SimpleCMSComponent)

    使用组件 jsp 文件的名称,不包括 CMS Page Slot 标记的 var 属性中的单词 component

    如果我的 jsp 组件内容在一个名为 mycartcomponent.jsp 的文件中,那么我会将其用作

    例如,

    <cms:pageSlot position="MyComponent" var="mycart">
       <cms:component component="${mycart}" />
    </cms:pageSlot>
    

我还没有创建模板、页面或广告位。我已经使用了 Hybris 在他的示例商店中带来的那个。我只创建了一个新组件 CustomCMSImageComponent 就像 CMSImageComponent.

的副本
  1. 在文件中定义新组件:mystorecore-items.xml

       <deployment table="CustomCMSImageComponent" typecode="20003"/>
    </itemtype>
    

  2. 为此组件创建一个新控制器 CustomCMSImageComponentController.java 和一个视图 customcmsimagecomponent.jsp

  3. 表示 CustomCMSImageComponentController.java 应该是 ControllerConstants.java

    中该组件的控制器

    String CustomCMSImageComponent = _Prefix + CustomCMSImageComponentModel._TYPECODE + _Suffix; // 诺声纳

  4. AddToCartSlot中创建该组件的实例(在相应的impex中)

  5. 构建项目、启动服务器、初始化 (HAC) 和同步 (HMC)

昨天我发现为什么我使用这个标签时显示所有组件:实际上是插槽中的组件名称和页面中的插槽名称。那么这个问题就解决了。

为了让 Hybris 使用它,控制器应该是这样的:

@Controller("CustomCMSImageComponentController")
@RequestMapping(value = ControllerConstants.CustomCMSImageComponent )// now the controller is mapped to "/view/CustomCMSImageComponentController"
public class CustomCMSImageComponentController extends AbstractCMSComponentController<CustomCMSImageComponentModel> {
    @Override
    protected void fillModel(final HttpServletRequest request, final Model model,
                       final CustomCMSImageComponentModelcomponent) {
    //here the spring Model(model method parameter) should be filled with what is needed to dynamically render in JSP
    }
}

@Controller 注释被 Spring 用于实例化 CustomCMSImageComponentController 并将该实例 (bean) 保存在 spring 应用上下文。

渲染 CustomCMSImageComponent 时,Hybris 在 spring 应用程序上下文中搜索名称为 "CustomCMSImageComponentController" 的 bean,以便 找到与组件关联的控制器,如果没有找到任何内容,将使用 DefaultCMSComponentController。

You should always use content slot name in jsp page to render components(content slot name which is inserted in impex via insert_update ContentSlotName;)