2013-11-01 168 views
3

我在我的網站的某些區域使用搜索portlet,但我想限制結果僅搜索特定內容類型:例如,僅搜索新聞項目,或僅顯示教職員工目錄配置文件。在Plone中爲特定內容類型自定義搜索portlet

我知道你可以在通過該「過濾器」列表獲得@@search表單後做到這一點,但是有沒有一種方法可以啓用過濾器,以便「實時搜索」結果僅顯示相關結果即只有新聞項目或只有配置文件)。

回答

4

我懷疑你已經知道它了,但只是要確定:你可以全局定義哪些類型應該被允許顯示在控制面板的導航設置中的搜索結果中,然後將相關部分導出幷包含到你的產品的GS-簡介 - propertiestool.xml。但是,如果您希望只在某些部分中排除某些類型,則可以自定義已經過濾類型的Products.CMFPlone/skins/plone_scripts/livesearch_reply,以便僅在第38行(版本4.3.1)附近顯示「friendly_types」,並添加條件像這樣:

編輯: 我去溶液來檢查上下文的absolute_url,因爲上下文實際上是在這種情況下livesearch_reply,而不是當前部分定位。現在取而代之的是語句檢查,如果引用者是我們的部分:

REQUEST = context.REQUEST 
current_location = REQUEST['HTTP_REFERER'] 
location_to_filter = '/fullpath/relative/to/siteroot/sectionId' 
url_to_filter = str(portal_url) + location_to_filter 
types_to_filter = ['Event', 'News Item'] 

if current_location.find(url_to_filter) != -1 or current_location.endswith(url_to_filter): 
    friendly_types = types_to_filter 
else: 
    friendly_types = ploneUtils.getUserFriendlyTypes() 

然而,這留下的情況下打開,如果用戶點擊該報稅表或回車鍵或「高級搜索...'-鏈接,登錄在不同的結果頁面上,而不是直播結果。

更新: 到過濾應用到@@搜索模板可以用下面的內容來註冊一個Javascript的機會:

(function($) { 
    $(document).ready(function() { 
     // Let's see, if we are coming from our special section: 
     if (document.referrer.indexOf('/fullpath/relative/to/siteroot/sectionId') != -1) { 
      // Yes, we have the button to toggle portal_type-filter: 
      if ($('#pt_toggle').length>0) { 
       // If it's checked we uncheck it: 
       if ($('#pt_toggle').is(':checked')) { 
        $('#pt_toggle').click(); 
       } 
       // If for any reason it's not checked, we check and uncheck it, 
       // which results in NO types to filter, for now: 
       else { 
        $('#pt_toggle').click(); 
        $('#pt_toggle').click(); 
       } 
       // Then we check types we want to filter: 
       $("input[value='Event']").click(); 
       $("input[value='News Item']").click(); 
      } 
     } 
    }) 
})(jQuery); 

而且,不同的用戶行爲產生不同的,不一致的行爲:

  • 實況搜索接受其不是尖銳的術語,而@@search -view只接受尖銳術語或需要用戶噸o知道,你可以附加一個星號來得到不清晰的結果。

  • 當點擊輸入/返回鍵在livesearch輸入,searchterm將被傳輸到着陸頁的(@@search)輸入元素,而點擊「高級搜索...」時,searchterm獲取丟失。

更新: 爲了克服尖銳的結果,您可以在此if語句之後添加到JS:

// Get search-term and add an asterix for blurry results: 
var searchterm = decodeURI(window.location.search.replace(new RegExp("^(?:.*[&\\?]" + encodeURI('SearchableText').replace(/[\.\+\*]/g, "\\$&") + "(?:\\=([^&]*))?)?.*$", "i"), "$1")) + '*'; 
// Insert new searchterm in input-text-field: 
$('input[name=SearchableText]').val(searchterm); 

UPDATE2: 在該相關任務,埃裏克Brehault提供了一個更好的解決方案,可在提交期間通過星號:Customize Plone search

當然你也可以定製th e目標的高級搜索鏈接livesearch_reply,分別在JS for @@搜索,但這個鏈接是多餘的UI明智,恕我直言。另外,如果您仍然使用原型,並根據上下文有更多的用於預過濾搜索結果的用例,那麼我可以推薦看一下collective.formcriteria,它允許通過UI定義搜索條件。我喜歡它,因爲它是通用和簡單的plone-ish方法:編目indizi和集合。與eea.facetednavigation相反,它不會打破可訪問性,並且可以通過一些live-search-js-magic逐步增強,同時還需要一點點努力。榮譽Ross Patterson在這裏!只需將集合(舊式)轉換爲搜索形式,方法是更改​​其視圖,並將其顯示爲集合Portlet。您可以決定用戶應該能夠更改哪些標準(例如,您可以隱藏類型過濾器並提供文本搜索輸入)。

+0

謝謝艾達! if語句在實時結果下拉菜單中確實解決了問題,但是您是對的,如果用戶點擊「輸入」並進入完整的搜索頁面,則結果不匹配。我希望將您的答案與SteveM的上述內容結合起來,並在發佈後找到我想要的結果! – feesh

+1

您好Trish,我更新了JS的可能性,以便在登陸搜索頁面上應用過濾,因爲您在@@搜索中報告的內容目前無法通過PVC(portal_view_customizations)HTH進行自定義。或者你可以在此期間找到另一種方式? –

+0

太棒了!完全的作品,非常感謝艾達!由於我無法自定義PVC,所以我無法實現SteveM,但我只是測試了你的方法,並且它完美地工作。 :) – feesh

3

觀察在@@搜索頁上使用過濾器機制時查詢字符串的更改方式。您只需添加/減去目錄查詢條件。

您可以在搜索表單的隱藏字段中進行任何查詢。例如:

<form ...> 
    .... 
    <input type="hidden" name="portal_type" value="Document" /> 
</form> 

查詢字符串的形式在使用過濾器是由它的記錄機制,它允許一些最大/最小查詢複雜一點。簡單的過濾器要容易得多。

+0

謝謝SteveM!我認爲這會起作用,除非我需要兩份@@搜索頁面?或者我想知道是否可以以某種方式定位要添加的隱藏輸入行,具體取決於用戶來自哪裏。奇怪的是自定義@@搜索目前導致一個錯誤,我認爲我已經報告爲一個錯誤已經:http://stackoverflow.com/questions/19039544/customizing-search-results-template-in-plone-4-3 – feesh

+0

你絕對可以自定義輸入行,以便在不同的站點區域以不同的方式工作。 – SteveM

+0

只需修改@@搜索頁面?它是否與Ida的答案中的「If context path is ...」語句相似? – feesh

相關問題