我正在尝试按照this post中提供的示例,在Alfresco 3.3中创建动态列表约束。
所以,我创建了自己的类ListOfValuesConstraint
:
public class MyConstraint extends ListOfValuesConstraint {
private static ServiceRegistry registry;
@Override
public void initialize() {
loadData();
}
@Override
public List getAllowedValues() {
//loadData();
return super.getAllowedValues();
}
@Override
public void setAllowedValues(List allowedValues) {
}
protected void loadData() {
List<String> values = new LinkedList<String>();
String query = "+TYPE:\"cm:category\" +@cm\\:description:\"" + tipo + "\"";
StoreRef storeRef = new StoreRef("workspace://SpacesStore");
ResultSet resultSet = registry.getSearchService().query(storeRef, SearchService.LANGUAGE_LUCENE, query);
// ... values.add(data obtained using searchService and nodeService) ...
if (values.isEmpty()) {
values.add("-");
}
super.setAllowedValues(values);
}
}
Spring引用了 ServiceRegistry
引用,它工作正常。如果我只从loadData()
调用initialize()
,它会执行Lucene查询,获取数据,下拉列表会正确显示。只是它不是动态的:除非我重新启动Alfresco服务器,否则数据不会刷新。
getAllowedValues()
。推荐帖子的想法是从loadData()
调用getAllowedValues()
,因此值实际上是动态的。但是当我这样做时,我没有得到任何数据。 Lucene查询是相同的,但返回0结果,因此我的下拉列表仅显示-
。
+TYPE:"cm:category" +@cm\:description:"something here"
,每个案例都是一样的。它适用于初始化,但不是来自getAllowedValues。
关于为什么会发生这种情况的任何想法,或者我该如何解决?
由于
编辑:我们昨天升级到Alfresco 3.3.0g社区,但我们仍然遇到同样的问题。
答案 0 :(得分:4)
这种动态值列表约束是一个坏主意,我告诉你原因:
Alfresco存储库应始终处于有效状态。您的(动态)约束列表将发生变化(这就是您希望它变为动态的原因)。添加项目不是问题,但编辑和删除项目是。如果要从选项列表中删除项目,则具有此属性值的存储库中的节点将无效。
您将无法轻松解决此问题。标准UI将在无效状态节点上失败。只需编辑此值并将其设置为有效的值将无效。你被警告了。
因为ListConstraint的默认UI小部件是下拉列表,所以并非每个下拉列表都应该是ListConstraint。 ListConstraints的设计类似于Status属性:{Draft,Waiting Approval,Approved}。不是客户名单。
在过去的几年里,我看到同样的话题一再出现。你真正想要的是让用户从动态的选项列表中选择一个值(组合框)。这是一个UI问题,而不是字典模型问题。您应该使用web-config-context.xml(Alfresco Web UI)或Alfresco Share设置类似的内容。最后一个更灵活,我建议采取这条道路。