我正在创建一个我传递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
编辑:以下是调试器显示产品链接的屏幕截图
答案 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