2

我正在创建一个向其传递 ProductBO 实例的 ISML 模块。在提到的模块中,我尝试获取 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>

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

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

显示有效产品链接值的调试器

4

3 回答 3

3

当我查看您的对象路径时

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-16T11:54:17.507 回答
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">

优点是它只获取在线产品。

于 2018-06-17T07:45:54.647 回答
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

于 2018-06-20T08:41:06.060 回答