【问题标题】:ISML isDefined() returns false altough object contains value in fieldISML isDefined() 返回 false altough 对象在字段中包含值
【发布时间】:2018-06-15 14:52:09
【问题描述】:

我正在创建一个 ISML 模块,并将 ProductBO 实例传递给该模块。 在提到的模块中,我尝试获取 OutgoingProductLinks 字段,我看到它填充了我在 BackOffice 中定义的正确值,但是当在该字段上调用 ​​isDefined() 时,它返回 false 并且当我尝试在 <isloop> 中使用该字段时标记它记录错误消息:

循环迭代器标识符“#ProductBO:ExtensibleObject:OutgoingProductLinks#”未指定有效的迭代器。

我正在处理的特定项目基于 app_sf_responsive 示例,因此它使用它的 ViewProduct 管道(它不会在其他墨盒中被覆盖)返回 ProductBO 对象,该对象用于其他几个地方和通常使用的字段可用于 ISML。

以下代码sn-p总是返回false:

<isif condition="#isDefined(ProductBO:ExtensibleObject:OutgoingProductLinks)#" >
   <h1>Outgoing product links are defined</h1>
<iselse>
   <h1 style="color: red;">Outgoing product links are NOT defined </h1>
</isif>

这是我尝试实际使用提到的字段的地方:

<isloop iterator="#ProductBO:ExtensibleObject:OutgoingProductLinks#" alias="ProductLink">
//Code that uses linked products
</isloop>

请注意,对 ProductBO 和 ExtensibleObject 的 isDefined() 检查都在工作,问题只出现在 OutgoingProductLinks

编辑:这是调试器显示产品链接的屏幕截图

Debugger showing valid product link values

【问题讨论】:

    标签: intershop


    【解决方案1】:

    添加到约翰内斯的答案。如果您查看演示商店的代码,他们就是这样做的:

    //get the productlink extension from the productBO
    <isset name="ProductBOProductLinksExtension" value="#ProductBO:Extension("ProductLinks")#" scope="request">
    //Link type provider : example cross/up sell, replacement 
    <isset name="LinkTypeProvider" value="#ProductBOProductLinksExtension:LinkTypeProvider#" scope="request">
    //get the link by id from provider See ProductLinkConstants
    <isset name="LinkType" value="#LinkTypeProvider:LinkTypeByID(PageletConfigurationParameters:ProductLinkType:Name)#" scope="request">
    //get a collection of linked productbos
    <isset name="ProductBOs" value="#ProductBOProductLinksExtension:AccessibleOutgoingLinksLinkedObjects(LinkType)#" scope="request">
    

    优点是只获取线上产品。

    【讨论】:

    • 您是否知道如何使用ProductBO:Extension("ProductLinks") 获取所有链接产品,或者在哪里可以找到ProductLinks 的类定义,以便我自己检查所有可用的方法
    • 为此,Javadoc 非常有用。在工作室中转到:Help > Help Content,然后是 Intershop Suite Cartridge API JavaDoc。另一种选择是在 gradle 缓存文件夹中查找 *-javadoc.jar 文件并从中提取 html。该类称为 ProductBOProductLinksExtension。
    【解决方案2】:

    当我查看你的对象路径时

    ProductBO:ExtensibleObject:OutgoingProductLinks
    

    我可以看到您正在尝试访问底层持久对象的 API。这很好,但请确保您为此使用名为 PersistentObjectBOExtension 的 BOExtension。所以代替上面的使用:

    ProductBO:Extension("PersistentObjectBOExtension"):PersistentObject:OutgoingProductLinks
    

    此外,还有一个 ISML 函数可以检查您的对象路径是否表示可迭代对象:使用 hasLoopElements(iterable) 而不是 isDefined(obj)

    鉴于你的例子,整个事情应该这样写:

    <isif condition="#hasLoopElements(ProductBO:Extension("PersistentObjectBOExtension"):PersistentObject:OutgoingProductLinks)#" >
       <h1>Outgoing product links are defined</h1>
    <iselse>
       <h1 style="color: red;">Outgoing product links are NOT defined </h1>
    </isif>
    

    【讨论】:

    • 不幸的是,这个解决方案不起作用,同样的问题,一切都定义到ProductBO:Extension("PersistentObjectBOExtension"):PersistentObject,但是当我尝试访问OutgoingProductLinks时它什么也没返回(尝试使用isDefined()hasLoopElements()和@ 987654332@)
    • 我还用 IntershopStudio 的屏幕截图编辑了原始问题,显示在调试器中查看时存在 ProductLinks link
    【解决方案3】:

    或者,您也可以这样做来检索特定传出链接类型的产品:

    <!--- Retrieve the Cross Sell products --->
    <isset name="LinkedProductBOs" value="#ProductBO:SortedOutgoingProductBOLinks("ES_CrossSelling")#" scope="request"/>
    
    <isif condition="#isDefined(LinkedProductBOs) AND hasElements(LinkedProductBOs)#">
        <isloop iterator="LinkedProductBOs" alias="LinkedProductBO">
            <isprint value="#LinkedProductBO:DisplayName#"/>
        </isloop>
    </isif>
    

    getSortedOutgoingProductBOLinks 方法将链接 ID 作为参数。所有默认产品链接都可以在ProductLinkConstants.java 中找到

    【讨论】:

      猜你喜欢
      • 2017-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-20
      • 2018-12-02
      • 2011-06-09
      • 1970-01-01
      相关资源
      最近更新 更多