2009-09-23 3 views
2

사용자 지정 검색을 만들려고하지만 막히는 중입니다. 내가 원하는 것은 사용자가 검색 할 위치를 선택할 수 있도록 dropdownbox를 갖는 것입니다. 이 옵션은 하나 이상의 콘텐츠 유형을 의미 할 수 있습니다.드루팔 (Drupal : 사용자 지정 검색 만들기

그래서 옵션 A를 선택하면 노드 유형 P, Q, R이 검색됩니다. 하지만 그는 그 결과를 제공하지 않을 수도 있지만 그 사용자에 대한 특정 데이터를 모으기 위해 테마로 사용되는 uid 만 제공 할 수 있습니다.

좀 더 명확하게하기 위해 사람들을 위해 llok을하고 싶다고 가정 해보십시오. 내가 검색하는 내용은 2 개의 콘텐츠 프로필 유형입니다. 그러나 당연히 그 결과로 표시하고 싶지는 않지만 사용자와 일부 데이터에 대한 좋은 그림이 필요합니다.

텍스트 필드와 드롭 다운 상자가있는 양식을 만드는 것으로 시작했습니다. 그런 다음 제출 핸들러에서 키를 생성하고 키와 함께 다른 페이지로 리디렉션했습니다. 이 페이지는 검색 기능과 마찬가지로 메뉴 후크에 정의되어 있습니다.

그 후 hook_view으로 전화하여 node_search을 호출하여 실제 검색을 수행하고 결과를 제공하고 싶습니다.

불행히도, 그것은 잘못되었습니다. 검색 버튼을 클릭하면 404가 표시됩니다.

하지만 올바른 방향으로 가고 있습니까? 이 방법으로 맞춤 검색을 만들 수 있습니까?

당신의 도움을 위해 Thx.

<?php 
// $Id$ 

/* 
* @file 
* Searches on Project, Person, Portfolio or Group. 
*/ 

/** 
* returns an array of menu items 
* @return array of menu items 
*/ 
function vm_search_menu() { 

    $subjects = _vm_search_get_subjects(); 
    foreach ($subjects as $name => $description) { 
    $items['zoek/'. $name .'/%menu_tail'] = array(
     'page callback' => 'vm_search_view', 
     'page arguments' => array($name), 
     'type' => MENU_LOCAL_TASK, 
    ); 
    } 
    return $items; 
} 


/** 
* create a block to put the form into. 
* @param $op 
* @param $delta 
* @param $edit 
* @return mixed 
*/ 
function vm_search_block($op = 'list', $delta = 0, $edit = array()) { 
    switch ($op) { 
    case 'list': 
     $blocks[0]['info'] = t('Algemene zoek'); 
     return $blocks; 
    case 'view': 
     if (0 == $delta) { 
      $block['subject'] = t(''); 
      $block['content'] = drupal_get_form('vm_search_general_form'); 
     } 
     return $block; 
    } 
} 

/** 
    * Define the form. 
    */ 
function vm_search_general_form() { 
    $subjects = _vm_search_get_subjects(); 
    foreach ($subjects as $key => $subject) { 
    $options[$key] = $subject['desc']; 
    } 

    $form['subjects'] = array(
     '#type' => 'select', 
    '#options' => $options, 
    '#required' => TRUE, 
    ); 
    $form['keys'] = array(
    '#type' => 'textfield', 
    '#required' => TRUE, 
); 
    $form['submit'] = array(
     '#type' => 'submit', 
     '#value' => t('Zoek'), 
    ); 
    return $form; 
} 


function vm_search_general_form_submit($form, &$form_state) { 
    $subjects = _vm_search_get_subjects(); 
    $keys = $form_state['values']['keys']; //the search keys 
    //the content types to search in 
    $keys .= ' type:' . implode(',', $subjects[$form_state['values']['subjects']]['types']); 



    //redirect to the page, where vm_search_view will handle the actual search 
    $form_state['redirect'] = 'zoek/'. $form_state['values']['subjects'] .'/'. $keys; 
} 


/** 
* Menu callback; presents the search results. 
*/ 
function vm_search_view($type = 'node') { 
    // Search form submits with POST but redirects to GET. This way we can keep 
    // the search query URL clean as a whistle: 
    // search/type/keyword+keyword 
    if (!isset($_POST['form_id'])) { 
    if ($type == '') { 
     // Note: search/node can not be a default tab because it would take on the 
     // path of its parent (search). It would prevent remembering keywords when 
     // switching tabs. This is why we drupal_goto to it from the parent instead. 
     drupal_goto($front_page); 
    } 

    $keys = search_get_keys(); 
    // Only perform search if there is non-whitespace search term: 
    $results = ''; 
    if (trim($keys)) { 
     // Log the search keys: 
     watchdog('vm_search', '%keys (@type).', array('%keys' => $keys, '@type' => $type)); 

     // Collect the search results: 
     $results = node_search('search', $type); 

     if ($results) { 
     $results = theme('box', t('Zoek resultaten'), $results); 
     } 
     else { 
     $results = theme('box', t('Je zoek heeft geen resultaten opgeleverd.')); 
     } 
    } 
    } 
    return $results; 
} 


/** 
* returns array where to look for 
* @return array 
*/ 
function _vm_search_get_subjects() { 
    $subjects['opdracht'] = 
    array('desc' => t('Opdracht'), 
      'types' => array('project') 
     ); 
    $subjects['persoon'] = 
     array('desc' => t('Persoon'), 
      'types' => array('types_specialisatie', 'smaak_en_interesses') 
     ); 
    $subjects['groep'] = 
    array('desc' => t('Groep'), 
     'types' => array('Villamedia_groep') 
     ); 
    $subjects['portfolio'] = 
    array('desc' => t('Portfolio'), 
      'types' => array('artikel') 
     ); 
    return $subjects; 
} 

답변

0

솔직히 말해서, 나는 보지 못했지만 많은 사람들이 hook_search을 구현 :

는 여기에 몇 가지 명확성을 위해 코드입니다. 대부분 Views을 사용하거나 고급 사항 인 경우 Faceted Search과 같은 것을 사용하십시오.

현재 프로젝트에이 중 하나를 사용해 보셨습니까? 왜 작동하지 않았습니까?

+0

내가 한 것처럼 다른 맞춤 검색에 대한보기를 사용하지만 실적이 좋지 않습니다. 면 맞춤 검색 아직 발견하지 못했습니다. – eddy147

+0

그것은 꽤 멋지다 - 전체 패싯으로 된 검색 개념이 그렇듯이. 실적이 걱정된다면 Search Lucene 또는 Apache Solr를 살펴볼 수도 있습니다. –

+0

Btw, 패싯 검색은 뷰에 연결되기 때문에 뷰를 사용하여 검색 결과를 표시 할 수 있습니다. –

0

또한 결과에 hook_menu와 db_queries를 사용자 정의 (및 최적화 된 매우 빠른) 쿼리의 조합으로 사용할 수도 있습니다.

검색/%/%

인수는 예를 들어, 최소한의 침실을위한 세 번째 최저 가격에 대한 첫 번째, 최대 가격 두 번째 가격, 무엇을해야 할 수 있습니다 : 예를 들어

... 귀하의 URL을 항상 그런 보일 것이다

검색/200/AS/400 널 (null)/3/...

내가 널을 사용했지만, 당신이이 분야를 고려하는 것을 선호 무엇이든 될 수있다 비어 있습니다.

그런 다음 선택 양식에서이 URL의 구조를 따라 리디렉션하고 올바른 위치에 매개 변수를 추가하면됩니다.

URL을 작성하는 가장 아름다운 방법은 아닙니다. 그러나이 기술과 hook_theme을 사용하면 무한한 유연성을 누릴 수 있습니다. 나는이 기술을 사용하는 프로젝트를 보여줄 수 있으며, 꽤 좋아 보인다 :-).

이것에 관한 모든 의견은 많이 감사 할 것입니다 :-).