1

我的仪表板上有一些链接,它们链接到 myCustomers 或 allCostomerThatRegisteredYesterday。我已经使用了应用程序文件夹。对于可用性而言,仪表板带有更好的快速链接。

如何使用过滤器调用 openWindow("screen-id",WindowType,filterMap?)?

4

1 回答 1

4

您在这里有两个选择:

  1. 您可以使用查询过滤器(请参阅https://doc.cuba-platform.com/manual-6.1/manual.html#datasource_query_filter)。因此,您的数据源定义将如下所示:
    <collectionDatasource id="booksDs"
                          class="com.company.opentest.entity.Book"
                          view="_local">
        <query>
            <![CDATA[select e from opentest$Book e]]>
            <filter>
                <and>
                    <c>e.author.id = :param$bookAuthor</c>
                </and>
            </filter>
        </query>
    </collectionDatasource>

在这种情况下,如果您bookAuthor在方法的 params 参数中传递一个参数,openWindow则将应用此查询过滤器。

    Map<String, Object> params = new HashMap<>();
    params.put("bookAuthor", author);
    openWindow("opentest$Book.browse", WindowManager.OpenType.NEW_TAB, params);
  1. 如果您想使用通用过滤器组件并为其设置预定义的过滤器实体,那么它会更复杂一些。您必须分析传递给 screeninit()方法的参数映射,如果那里有特殊参数,您将sec$Filter通过 JPQL 查询找到所需的过滤器实体 ( )。然后将此实体设置为过滤器组件 ( Filter#setFilterEntity(...)),指定过滤器参数 ( Filter#setParamValue(...)) 并应用过滤器 ( Filter#apply())。

setParamValue()方法 javadoc 和过滤器组件文档中描述了获取过滤器参数名称 (author84104) 。

public class BookBrowse extends AbstractLookup {

    @Inject
    private Filter filter;

    @Inject
    private DataManager dataManager;

    private Author bookAuthorParam;

    @Override
    public void init(Map<String, Object> params) {
        super.init(params);
        bookAuthorParam = (Author) params.get("bookAuthor");
    }

    @Override
    public void ready() {
        super.ready();
        if (bookAuthorParam != null) {
            setAuthorFilter(bookAuthorParam);
        }
    }

    private void setAuthorFilter(Author bookAuthor) {
        FilterEntity filterEntity = findFilterEntity();
        if (filterEntity != null) {
            filter.setFilterEntity(filterEntity);
            filter.setParamValue("author84104", bookAuthor);
            filter.apply(false);
        }
    }

    private FilterEntity findFilterEntity() {
        LoadContext<FilterEntity> ctx = new LoadContext<>(FilterEntity.class)
                .setView("app");
        ctx.setQueryString("select f from sec$Filter f where f.componentId = :componentId and f.name = :name")
                .setParameter("componentId", "[opentest$Book.browse].filter")
                .setParameter("name", "By author");
        return dataManager.load(ctx);
    }
}
于 2016-05-04T08:27:11.387 回答