在 Cuba 平台控制器中使用过滤器打开 window
Open window with filter in Cuba Platform controller
我的仪表板上有一些 link,link 到 myCustomers 或 allCostomerThatRegisteredYesterday。我已经使用了应用程序文件夹。对于可用性来说,仪表板的速度更快 links 甚至更好。
如何使用过滤器调用 openWindow("screen-id",WindowType,filterMap?)?
这里有两个选择:
- 您可以使用查询过滤器(参见 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>
在这种情况下,如果您在 openWindow
方法的参数参数中传递一个 bookAuthor
参数,将应用此查询过滤器。
Map<String, Object> params = new HashMap<>();
params.put("bookAuthor", author);
openWindow("opentest$Book.browse", WindowManager.OpenType.NEW_TAB, params);
- 如果要使用Generic filter组件并为其设置预定义的过滤器实体,则稍微复杂一些。您必须分析传递给屏幕
init()
方法的参数映射,如果那里有特殊参数,您将通过 JPQL 找到所需的过滤器实体 (sec$Filter
)询问。然后将此实体设置为过滤器组件(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);
}
}
我的仪表板上有一些 link,link 到 myCustomers 或 allCostomerThatRegisteredYesterday。我已经使用了应用程序文件夹。对于可用性来说,仪表板的速度更快 links 甚至更好。
如何使用过滤器调用 openWindow("screen-id",WindowType,filterMap?)?
这里有两个选择:
- 您可以使用查询过滤器(参见 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>
在这种情况下,如果您在 openWindow
方法的参数参数中传递一个 bookAuthor
参数,将应用此查询过滤器。
Map<String, Object> params = new HashMap<>();
params.put("bookAuthor", author);
openWindow("opentest$Book.browse", WindowManager.OpenType.NEW_TAB, params);
- 如果要使用Generic filter组件并为其设置预定义的过滤器实体,则稍微复杂一些。您必须分析传递给屏幕
init()
方法的参数映射,如果那里有特殊参数,您将通过 JPQL 找到所需的过滤器实体 (sec$Filter
)询问。然后将此实体设置为过滤器组件(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);
}
}