我正在创建一个ISML模块,我将向其传递一个ProductBO实例。在前面提到的模块中,我尝试获取OutgoingProductLinks字段,我看到它被BackOffice中定义的正确值填充,但是当在该字段上调用isDefined()时,它返回false,当我试图在<isloop>标记中使用该字段时,它记录的错误消息如下:
循环迭代器标识符'#ProductBO:ExtensibleObject:OutgoingProductLinks#‘没有指定有效的迭代器。
我正在处理的具体项目是基于app_sf_responsive示例的,因此它使用了它的ViewProduct管道(在其他墨盒中不是过激的),它返回在其他几个地方使用的ProductBO对象,在那里使用的字段通常可以在ISML中使用。
以下代码段总是返回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>请注意,isDefined()检查ProductBO和ExtensibleObject都有效,问题只在OutgoingProductLinks中出现
编辑:这是调试器显示产品链接的屏幕截图
发布于 2018-06-16 11:54:17
当我看到你的对象路径
ProductBO:ExtensibleObject:OutgoingProductLinks我可以看到,您正在尝试访问底层持久对象的API。这很好,但是要确保您使用的是名为BOExtension的PersistentObjectBOExtension。因此,代替上面的用法:
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>发布于 2018-06-20 08:41:06
或者,您也可以这样做以检索特定传出链接类型的产品:
<!--- 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中找到
https://stackoverflow.com/questions/50877992
复制相似问题