搜索特定的Liferay私人页面

时间:2014-05-14 05:37:17

标签: liferay

对于搜索,我在停靠栏中使用 liferay-ui:search 。用户应该能够通过从下拉列表中选择搜索范围来定义搜索范围(特定私有页面)。

如何在特定私人网页上实施搜索?

还有一个问题。似乎这是一个错误,但用户只能在 特定私人网页上进行搜索。如果他移动到另一个页面 - 搜索按钮被“禁用” - 当他把它复制时没有任何反应。对于管理员帐户,一切正常 - 我可以搜索任何页面。

谢谢!

1 个答案:

答案 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配对的常量进行比较。

这里有什么建议吗? 谢谢,来自俄罗斯的爱!