2014-05-14 2 views
0

검색의 경우, Dockbar에서 liferay-ui :을 검색하십시오. 사용자는 드롭 다운 목록에서 선택하여 검색 범위 (특정 개인 페이지)를 정의 할 수 있어야합니다.Liferay의 비공개 페이지에서 검색

특정 비공개 페이지에서 검색을 구현하려면 어떻게해야합니까?

그리고 1 질문. 버그 인 것 같지만 사용자가 인 경우에만의 특정 비공개 페이지에서 검색 할 수 있습니다. 그가 다른 페이지로 이동하면 검색 버튼이 "비활성화"됩니다. 관리자 계정의 경우 모든 항목이 정상적으로 작동합니다. 모든 페이지를 검색 할 수 있습니다.

감사합니다.

+1

Liferay 검색은 일반적으로 애셋이 아닌 페이지 범위로 이동하며 페이지에 표시 될 수 있습니다. 나는 왜 어떤 사람이 "이"페이지를 검색하는지 알지 못한다. Ctrl-F는 내가 현재 페이지에서 검색하고 싶다면 나를 위해 일한다. 서버 쪽 검색 엔진만큼 좋다. –

+0

예를 들어, 뉴스 페이지를 여러 개 만들었습니다 (페이지 당 뉴스 5 개로 제한되며 다음/이전 버튼이 있음). Ctrl + F는이 방법으로 작동하지 않습니다. – localhost

답변

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] ALL [/ b] 검색 결과를 필터링하고 [b] select 필드 [/ b]의 요청에 의해 필요한 검색 결과 만 표시하려고했습니다. 다른 id를 가진 non instanceble 사용자 정의 포틀릿에서는 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 개에는 모두 자산 게시자 포틀릿 (portletId = 15)이 있으므로 포틀릿 ID로 필터링하면 3 페이지 모두에서 결과를 얻을 수 있습니다. 어쩌면 나는 문서가 속한 포틀릿의 인스턴스 ID를 얻을 수 있습니다. 또는 검색을 수행 할 다른 방법이있을 수 있습니다.

Atm 제 CustomJournalArticleIndexer를 구현하려고합니다. 포털의 인스턴스 ID가 포함 된 필드를 Indexer에서 추가합니다. 그래서 나중에 main_search.jsp에서 나는 document.getPortletInstanceId와 같은 것을 할 수 있고 그것을 내 요청의 scopeId와 결합 된 상수와 비교할 수있다.

여기에 어떤 제안이 있습니까? 감사합니다 ... 러시아에서 사랑을!