SAP Commerce 1811 Backoffice如何用referenceSearchCondition按年份过滤日期条目
问题根因分析
你的原始配置存在三个核心问题导致过滤不生效:
- 触发字段不匹配:HolidayCalendar仅存在
year属性,不存在date属性,triggeredOn="date"无法触发规则执行,disabledIf="date==null"也会永久为真,规则全程被禁用 - 重复声明同一上下文:两个相同
component="editorAreaDynamicForms"的上下文会被后者覆盖,无法同时生效两个过滤规则 - 作用范围不匹配:你需要在Create/Editor Wizard中使用,仅配置editorArea的动态表单不会对向导生效,需要额外配置向导的动态表单上下文
方案1:修复动态表单配置(无需编码)
以下是合并后的正确配置,同时覆盖编辑器和向导场景:
<!-- 编辑器页面动态表单配置 --> <context type="HolidayCalendar" component="editorAreaDynamicForms" merge-by="module"> <df:dynamicForms xmlns:df="http://www.hybris.com/cockpitng/component/dynamicForms"> <df:attribute id="dynamicFormsEntryFiltering1" paramName="referenceSearchCondition_date_greaterOrEquals" disabledIf="parentObject.year == null" computedValue="T(com.hybris.util.DateUtils).getFirstDay(parentObject.year)" qualifier="entries" triggeredOn="year"/> <df:attribute id="dynamicFormsEntryFiltering2" paramName="referenceSearchCondition_date_lessOrEquals" disabledIf="parentObject.year == null" computedValue="T(com.hybris.util.DateUtils).getLastDay(parentObject.year)" qualifier="entries" triggeredOn="year"/> </df:dynamicForms> </context> <!-- 向导页面动态表单配置 --> <context type="HolidayCalendar" component="wizardConfig" merge-by="module"> <wizard:create-wizard xmlns:wizard="http://www.hybris.com/cockpitng/config/wizard-config"> <!-- 替换为你实际的向导步骤配置,仅需要在entries属性所在的步骤开启动态表单即可 --> <wizard:property qualifier="year" /> <wizard:property qualifier="entries"> <wizard:editor-parameter name="dynamicFormsEnabled" value="true"/> </wizard:property> </wizard:create-wizard> </context>
配置后按Ctrl+Shift+F4重置Backoffice配置缓存即可生效,无需重启服务。
方案2:自定义搜索过滤Provider(兼容性更强,适合复杂场景)
如果修复动态表单后仍不生效,可以使用自定义过滤逻辑的方案,1811版本完全支持:
- 编写自定义过滤Provider类
package com.yourpackage.backoffice.provider; import com.hybris.cockpitng.services.search.ReferenceSearchConditionPredicateProvider; import com.hybris.cockpitng.services.search.SearchCondition; import de.hybris.platform.core.model.ItemModel; import org.joda.time.LocalDate; import java.util.Date; import java.util.function.Predicate; public class HolidayCalendarEntrySearchPredicateProvider implements ReferenceSearchConditionPredicateProvider { @Override public Predicate<ItemModel> getPredicate(SearchCondition searchCondition) { // 拿到当前父对象HolidayCalendar的year属性 Object parentObj = searchCondition.getParameters().get("parentHolidayCalendar"); if (parentObj instanceof HolidayCalendarModel) { Integer year = ((HolidayCalendarModel) parentObj).getYear(); if (year == null) { return item -> true; } Date firstDay = LocalDate.of(year, 1, 1).toDate(); Date lastDay = LocalDate.of(year, 12, 31).toDate(); return item -> { if (item instanceof HolidayCalendarEntryModel) { Date entryDate = ((HolidayCalendarEntryModel) item).getDate(); return entryDate != null && !entryDate.before(firstDay) && !entryDate.after(lastDay); } return false; }; } return item -> true; } }
- 注册为Spring Bean,在
backoffice-spring.xml中添加:
<bean id="holidayCalendarEntrySearchPredicateProvider" class="com.yourpackage.backoffice.provider.HolidayCalendarEntrySearchPredicateProvider"/>
- 配置entries属性的编辑器参数,在editorArea或者wizard配置中添加:
<context type="HolidayCalendar" component="editorArea" merge-by="module"> <ea:editor-area xmlns:ea="http://www.hybris.com/cockpitng/component/editorArea"> <ea:tab name="hmc.tab.common" position="0"> <ea:section name="hmc.section.general" merged="true"> <ea:attribute qualifier="year"/> <ea:attribute qualifier="entries"> <ea:editor-parameter name="referenceSearchConditionPredicateProvider" value="holidayCalendarEntrySearchPredicateProvider"/> <ea:editor-parameter name="referenceSearchCondition_parentHolidayCalendar" value="parentObject"/> </ea:attribute> </ea:section> </ea:tab> </ea:editor-area> </context>
向导的配置同理,在entries属性下添加相同的editor-parameter即可生效。
内容的提问来源于stack exchange,提问作者Free-Minded
相关产品推荐
相关产品推荐

