У меня нет полного пошагового ответа, но в версии hybris 6.7 правила источника продвижения показывают два узла, один узел показывает все правила источника продвижения, а другой показывает только правила источника продвижения: опубликованный или неопубликованный (исключая неактивны, заархивированы и т. д.), поэтому между двумя узлами выполняется некоторая фильтрация. (чтобы увидеть в бэк-офисе, перейдите в раздел «Маркетинг -> Правила продвижения», и вы увидите два подузла) Примечание: в более поздних версиях это было снова изменено, и есть только один узел.
Если я правильно понимаю, «фильтрованное представление» работает, добавляя начальную конфигурацию расширенного поиска, которая отфильтровывает правила источника продвижения на основе его статуса. Вероятно, вы могли бы добиться чего-то подобного, скопировав и изменив подход.
Ключевые элементы конфигурации, похоже, находятся в /promotionenginebackoffice/resources/promotionenginebackoffice-backoffice-config.xml (объявляя два узла дерева проводника):
<explorer-tree:explorer-tree xmlns:explorer-tree="http://www.hybris.com/cockpitng/config/explorertree">
<explorer-tree:navigation-node id="hmc_treenode_marketing">
<explorer-tree:navigation-node id="hmc_type_tree_abstractpromotion" merge-mode="remove" />
<explorer-tree:navigation-node id="hmc_typenode_promotion_rules">
<explorer-tree:type-node id="hmc_published_and_unpublished_promotion_rules_only" code="PromotionSourceRule"/>
<explorer-tree:type-node id="hmc_all_promotion_rules_only" code="PromotionSourceRule"/>
</explorer-tree:navigation-node>
<explorer-tree:type-node id="hmc_typenode_promotion_rule_templates" code="PromotionSourceRuleTemplate"/>
<explorer-tree:type-node id="hmc_type_tree_promotiongroup" code="PromotionGroup"/>
<explorer-tree:type-node id="hmc_typenode_promotion_modules" code="DroolsKIEModule"/>
</explorer-tree:navigation-node>
</explorer-tree:explorer-tree>
</context>
и в /promotionenginebackoffice/resources/promotionenginebackoffice-backoffice-widgets.xml (объявление bean-компонента фильтрации):
<widget id="initPromotionSourceRuleAdvancedSearch" widgetDefinitionId="com.hybris.cockpitng.widgets.common.advancedsearchengine.genericinitializer"
slotId="cockpitWidgetChildrenInvisible" template="false">
<setting key="requiredTypeCode" type="String" value="PromotionSourceRule"/>
<setting key="navigationNodeId" type="String" value="hmc_published_and_unpublished_promotion_rules_only"/>
<setting key="handlerBeanId" type="String" value="sourceRuleAdvancedSearchInitHandler"/>
<virtual-sockets/>
</widget>
Бин, выполняющий фильтрацию (упомянутый в предыдущем фрагменте), определяется в:
<alias name="defaultSourceRuleAdvancedSearchInitHandler" alias="sourceRuleAdvancedSearchInitHandler"/>
<bean id="defaultSourceRuleAdvancedSearchInitHandler" class="de.hybris.platform.ruleenginebackoffice.handlers.SourceRuleAdvancedSearchInitializer"/>
Сам код bean-компонента таков:
public class SourceRuleAdvancedSearchInitializer implements AdvancedSearchInitializer
{
private static final String STATUS = "status";
@Override
public void addSearchDataConditions(final AdvancedSearchData searchData, final Optional<NavigationNode> navigationNode)
{
if (nonNull(searchData))
{
removeExistingStatusCondition(searchData);
searchData.addConditionList(ValueComparisonOperator.OR, createStatusSearchConditions());
}
}
protected void removeExistingStatusCondition(final AdvancedSearchData searchData)
{
final List<SearchConditionData> conditions = searchData.getConditions(STATUS);
if (isNotEmpty(conditions))
{
conditions.clear();
}
}
protected List<SearchConditionData> createStatusSearchConditions()
{
return newArrayList(createStatusConditionsList());
}
protected SearchConditionDataList createStatusConditionsList()
{
final FieldType status = createStausField();
final List statusConditionsList = new ArrayList();
statusConditionsList.add(createCondition(status, RuleStatus.UNPUBLISHED));
statusConditionsList.add(createCondition(status, RuleStatus.PUBLISHED));
return SearchConditionDataList.or(statusConditionsList);
}
protected FieldType createStausField()
{
final FieldType status = new FieldType();
status.setDisabled(Boolean.FALSE);
status.setSelected(Boolean.TRUE);
status.setName(STATUS);
return status;
}
protected SearchConditionData createCondition(final FieldType status, final RuleStatus predicate)
{
return new SearchConditionData(status, predicate, ValueComparisonOperator.EQUALS);
}
}
Надеюсь это поможет :)
person
Sebastian
schedule
07.01.2020