对于搜索,我在停靠栏中使用 liferay-ui:search 。用户应该能够通过从下拉列表中选择搜索范围来定义搜索范围(特定私有页面)。
如何在特定私人网页上实施搜索?
还有一个问题。似乎这是一个错误,但用户只能在 特定私人网页上进行搜索。如果他移动到另一个页面 - 搜索按钮被“禁用” - 当他把它复制时没有任何反应。对于管理员帐户,一切正常 - 我可以搜索任何页面。
谢谢!
答案 0 :(得分:1)
行。第一步是挂钩[b] html / taglib / search / start.jsp [/ b]。我传递了一个额外的id参数来定义我要搜索的私人页面。
<input name="<%= namespace %>keywords" size="30" title="<liferay-ui:message key="search" />" type="text" value="<%= HtmlUtil.escapeAttribute(keywords) %>" />
<input name="<%= namespace %>groupid" value="0" type="hidden" />
<select name="<%= namespace %>scopeId" title="<liferay-ui:message key="scope" /> ">
<option value="0" <%= selected == 0 ? "selected" : ""%>><liferay-ui:message key="everything" /></option>
<option value="1" <%= selected == 1 ? "selected" : ""%>>Новости</option>
<option value="2" <%= selected == 2 ? "selected" : ""%>>Сотрудники</option>
<option value="3" <%= selected == 3 ? "selected" : ""%>>Новому сотруднику</option>
<option value="4" <%= selected == 4 ? "selected" : ""%>>Корпоративные правила</option>
<option value="5" <%= selected == 5 ? "selected" : ""%>>Продукты</option>
<option value="6" <%= selected == 6 ? "selected" : ""%>>Wiki</option>
<option value="7" <%= selected == 7 ? "selected" : ""%>>События</option>
<option value="8" <%= selected == 8 ? "selected" : ""%>>Форум</option>
</select>
第二步是挂钩[b] html / portlet / search / main_search.jsp [/ b]。在那里我将过滤[b]所有[/ b]搜索结果,并仅显示[b]选择字段[/ b]请求的那些搜索结果。对于具有不同id的非实例自定义portlet,我只需按portletId过滤并显示结果即可。
Hits hits = indexer.search(searchContext);
List<Document> documents = new ArrayList<Document>();
documents = hits.toList();
...
if (documents.size() != 0) {
List<Document> toDelete = new ArrayList<Document>();
for (Document document : documents) {
String id = document.getPortletId();
id = document.get(Field.PORTLET_ID);
switch (scopeId) {
case 0:
break;
case 1:
if (!id.equals(NEWS_PORTLET_ID)) {
toDelete.add(document);
}
break;
....
if (toDelete.size() != 0) {
documents.removeAll(toDelete);
hits.setDocs(documents.toArray(new Document[documents.size()]));
if (documents.size() == 0) {
hits.setLength(0);
}
}
一切都很好。但我的3个页面都有资产发布者portlet(portletId = 15),所以如果我按照portlet id过滤 - 我将从所有3个页面获得结果。也许我可以获取文件所属的portlet的实例ID。或者也许还有其他方法可以进行搜索。
Atm我尝试实现我的CustomJournalArticleIndexer。想法是Indexer添加包含portlet的实例id的字段。所以稍后在main_search.jsp中,我可以执行类似document.getPortletInstanceId的操作,并将其与我的请求的scopeId配对的常量进行比较。
这里有什么建议吗? 谢谢,来自俄罗斯的爱!