2009-11-17 148 views
2

我通過編寫一個模塊檢查RERQUEST_URI以獲取該部分以及用戶角色,從而在drupal站點上創建了一個私有部分。我現在遇到的問題是如何防止這些節點/視圖出現在搜索中。從搜索中隱藏Drupal節點

私人部分中使用的內容類型在網站的其他地方使用。

什麼是讓Druapl搜索忽略內容/不索引/不在搜索結果中顯示的最佳方式?

回答

3

有一篇很好的文章解釋了這個在lullabot網站上。

這篇文章也值得閱讀,因爲那裏的人們建議使用替代方法來做到這一點,也是通過contrib模塊的意思(而不是在你自己的代碼中實現一些鉤子)。代碼D6也在評論中。

HTH!

+0

尼斯 - 我喜愛的一個;-) – DilbertDave 2009-11-17 17:09:46

+0

Lullabot的我指出了正確的方向。謝謝! – easement 2009-11-20 20:07:10

+0

很高興聽到...快樂編碼吧! ;) – mac 2009-11-21 14:31:04

0

如果私人部分中使用的內容類型也在其他地方使用,你希望如何過濾它們的搜索結果(請注意,我還沒有看過Mac的lullabot文章)。

基本上,如果你看看兩個節點的細節,一個是私人的還是一個公共的,它們有什麼區別?

注意:我假設您希望節點出現給有權訪問「私有」區域的用戶,而不是「匿名」用戶。

+0

區別它們的是URL路徑,可能在菜單中的位置。我不反對添加只包含「私人」標籤的分類標準,如果它能讓我到達那裏。 – easement 2009-11-17 17:03:25

+0

我明白了 - 您希望根據用戶在系統中的位置限制結果。如果他們在私人區域,那麼這些節點將被包括在內,但如果他們在外面則不會。如果是這樣的話(乍一看)lullabot文章可能會讓你到那裏。 – DilbertDave 2009-11-17 17:08:05

1

lullabot文章有點過時,包含許多鈍的方法。它還包含評論中的答案 - 搜索限制模塊,適用於DP6並允許進行細粒度和基於角色的控制。其他一切都會阻止內容被索引,如果內容訪問級別不同,或者同樣影響所有搜索查詢,這可能並不合適,如果訪問級別不同,這也不起作用。

0

對於Drupal 7. 您可以使用自定義字段來隱藏搜索結果中的節點。在我的情況下,我創建了一個名爲歸檔的自定義字段以獲得所需的內容類型,並且在該自定義字段的幫助下,您可以編寫my_module_query_alter功能。

代碼

function my_module_query_alter(QueryAlterableInterface $query) { 
$is_search = $is_node_search = FALSE; 
$node_alias = FALSE; 
foreach ($query->getTables() as $table) { 
    if ($table['table'] == 'search_index' || $table['table'] == 'tracker_user') { 
    $is_search = TRUE; 
    } 
    if ($table['table'] == 'node' || $table['table'] == 'tracker_user') { 
    $node_alias = $table['alias']; 
    $is_node_search = TRUE; 
    } 
} 

if ($is_search && $is_node_search) { 
    $nids = []; 
    // Run entity field query to get nodes that are 'suppressed from public'. 
    $efq = new EntityFieldQuery(); 
    $efq->entityCondition('entity_type', 'node') 
    ->fieldCondition('field_archive', 'value', 1, '='); 
    $result = $efq->execute(); 
    if (isset($result['node'])) { 
    $nids = array_keys($result['node']); 
    } 
    if (count($nids) > 0) { 
    $query->condition(sprintf('%s.nid', $node_alias), $nids, 'NOT IN'); 
    } 
} 
}