ISML isDefined()返回false altough对象包含字段中的值

时间:2018-06-15 14:52:10

标签: intershop

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

  

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

我正在处理的具体项目是基于app_sf_responsive样本,因此它使用它的ViewProduct管道(在其他盒式磁带中不被覆盖)返回ProductBO对象,该对象在其他几个地方使用,并且通常在那里使用的字段可以在ISML中使用。

以下代码段始终返回false:

<isloop>

这是我尝试实际使用上述字段的地方:

<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>

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

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

Debugger showing valid product link values

3 个答案:

答案 0 :(得分:3)

当我查看你的对象路径时

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>

答案 1 :(得分:3)

添加约翰内斯答案。如果你看看演示商店代码,他们是如何做到的:

//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">

优势在于它只能获得在线产品。

答案 2 :(得分:1)

或者,您也可以执行以下操作来检索特定传出链接类型的产品:

<!--- 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

中找到