You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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版本完全支持:

  1. 编写自定义过滤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;
    }
}
  1. 注册为Spring Bean,在backoffice-spring.xml中添加:
<bean id="holidayCalendarEntrySearchPredicateProvider" class="com.yourpackage.backoffice.provider.HolidayCalendarEntrySearchPredicateProvider"/>
  1. 配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 03:57:05