ISML isDefined() returns false 尽管对象在字段中包含值
ISML isDefined() returns false altough object contains value in field
我正在创建一个 ISML 模块,并向其传递一个 ProductBO 实例。
在提到的模块中,我尝试获取 OutgoingProductLinks 字段,我看到它填充了我在 BackOffice 中定义的正确值,但是当在该字段上调用 isDefined() 时,它 returns false 并且当我尝试使用该字段时在 <isloop>
标记中,它会记录错误消息:
Loop iterator identifier '#ProductBO:ExtensibleObject:OutgoingProductLinks#' does not specify a valid Iterator.
我正在处理的特定项目基于 app_sf_responsive 示例,因此它使用它的 ViewProduct 管道(它在其他墨盒中未被覆盖),其中 returns ProductBO 对象用于几个那里使用的其他地方和字段通常可用于 ISML。
下面的代码片段总是returns 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
当我查看你的对象路径时
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>
添加到 Johannes 的回答中。如果你看看这里的演示商店代码,他们是如何做到的:
//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">
优点是只获取线上商品
或者,您也可以执行此操作以检索特定传出 link 类型的产品:
<!--- 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
方法采用 link id 作为参数。所有默认产品 link 都可以在 ProductLinkConstants.java
中找到
我正在创建一个 ISML 模块,并向其传递一个 ProductBO 实例。
在提到的模块中,我尝试获取 OutgoingProductLinks 字段,我看到它填充了我在 BackOffice 中定义的正确值,但是当在该字段上调用 isDefined() 时,它 returns false 并且当我尝试使用该字段时在 <isloop>
标记中,它会记录错误消息:
Loop iterator identifier '#ProductBO:ExtensibleObject:OutgoingProductLinks#' does not specify a valid Iterator.
我正在处理的特定项目基于 app_sf_responsive 示例,因此它使用它的 ViewProduct 管道(它在其他墨盒中未被覆盖),其中 returns ProductBO 对象用于几个那里使用的其他地方和字段通常可用于 ISML。
下面的代码片段总是returns 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
当我查看你的对象路径时
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>
添加到 Johannes 的回答中。如果你看看这里的演示商店代码,他们是如何做到的:
//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">
优点是只获取线上商品
或者,您也可以执行此操作以检索特定传出 link 类型的产品:
<!--- 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
方法采用 link id 作为参数。所有默认产品 link 都可以在 ProductLinkConstants.java