Làm thế nào để ghi đè lên hộp tìm kiếm?


7
<div class="fr_search">        
  <form action="/"  accept-charset="UTF-8" method="post" id="search-theme-form">
    <input  name="search_theme_form" id="edit-search-theme-form-1" size="15" value="" class="form-text" />
    <!-- … -->
  </form>
 </div>

Đoạn mã trên được tạo bởi mô-đun Tìm kiếm Drupal. Tôi muốn thêm mã này vào mẫu.

<select class="search_l" onchange="selectSearch(select)">
  <option value="0">whole site search</option>
  <option value="1">google search</option>
</select>

Làm thế nào để tôi làm điều này?

Câu trả lời:


11

Tôi thà thực hiện hook_form_FORM_ID_alter()để thay đổi biểu mẫu được trả về bởi search_box () . Nếu mymodule.module là tên của mô-đun của bạn, thì bạn nên thêm chức năng mymodule_form_search_box_alter(&$form, &$form_state). Bạn cũng cần phải thay thế trình xử lý biểu mẫu bằng của riêng bạn.

function mymodule_form_search_box_alter(&$form, &$form_state) {
  $form['submit']['#weight'] = 10;

  $form['search_type'] = array(
    '#type' => 'radios', 
    '#options' => array(t('Whole site search'), t('Google search')),
    '#default_value' => 1,
    '#weight' => 5,
  );

  // Replace the search.module handler with your own.
  if (in_array('search_box_form_submit', $form['#submit'])) {
    $key = array_search('search_box_form_submit', $form['#submit']);
    unset($form['#submit'][$key]);
  }
  array_unshift($form['#submit'], 'mymodule_search_box_submit');
}

Bạn cũng có thể hiển thị trường biểu mẫu có chứa văn bản để tìm kiếm nội tuyến với radio bạn thêm.
Mã tôi đã báo cáo thay thế trình xử lý gửi biểu mẫu bằng mã mymodule_search_box_submit()đó phải được triển khai từ mô-đun của riêng bạn. Đây là mã được thực thi từ trình xử lý đệ trình được thực hiện bởi search.module; Tôi báo cáo nó như là tài liệu tham khảo.

function search_box_form_submit($form, &$form_state) {
  // The search form relies on control of the redirect destination for its
  // functionality, so we override any static destination set in the request,
  // for example by drupal_access_denied() or drupal_not_found()
  // (see http://drupal.org/node/292565).
  if (isset($_REQUEST['destination'])) {
    unset($_REQUEST['destination']);
  }
  if (isset($_REQUEST['edit']['destination'])) {
    unset($_REQUEST['edit']['destination']);
  }

  $form_id = $form['form_id']['#value'];
  $form_state['redirect'] = 'search/node/' . trim($form_state['values'][$form_id]);
}

Để tham khảo, tôi báo cáo ở đây mã của hàm search.module xây dựng biểu mẫu hộp tìm kiếm.

function search_box(&$form_state, $form_id) {
  $form[$form_id] = array(
    '#title' => t('Search this site'), 
    '#type' => 'textfield', 
    '#size' => 15, 
    '#default_value' => '', 
    '#attributes' => array('title' => t('Enter the terms you wish to search for.')),
  );
  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Search'),
  );
  $form['#submit'][] = 'search_box_form_submit';

  return $form;
}

Tôi nên đặt tệp nào vào hàm search_box () {}. Tôi không thể hiểu mã trong Thay thế trình xử lý search.module bằng own.well, bạn có thể cho tôi một lời giải thích. Cảm ơn bạn
enjoylife

1
search_box()là hàm xây dựng biểu mẫu và được định nghĩa trong search.module; nó không cần phải được thay thế. Mã thay thế trình xử lý đệ trình biểu mẫu đang thực hiện chính xác điều đó: nó thay thế trình xử lý đệ trình được xác định từ mô-đun Tìm kiếm bằng mymodule_search_box_submit()(thay đổi tên hàm bằng tên của hàm được xác định từ mô-đun của bạn). Những gì bạn cần làm là tạo mô-đun của riêng bạn thực hiện hook_form_search_box_alter()và trình xử lý trình.
kiamlaluno

Nếu tên mô-đun của bạn là, ví dụ: custom_module thì bạn cần thay thế mymodule_trong mã tôi đã báo cáo custom_module_.
kiamlaluno


1

Tôi nghĩ rằng bạn nên sử dụng hook_form_alter () hơn là chỉnh sửa mẫu (không vi phạm, nhưng đó thực sự là một thực tế tồi).

Bạn có thể muốn thêm một phần tử biểu mẫu mới và trình xử lý trình vào biểu mẫu tìm kiếm, để bạn có thể xử lý hành động gửi và xử lý giá trị của phần tử mới.


đánh bại tôi trong vài giây :)
Alex Weber

Tôi đồng ý!! Sẽ xóa câu trả lời của tôi để không giữ các giải pháp xấu xung quanh, không biết tại sao ghi đè chủ đề lại xuất hiện trong đầu tôi.
Dipen

1

Có một mẫu tìm kiếm-block-form.tpl.php:

https://api.drupal.org/api/drupal/modules!search!search-block-form.tpl.php/7

Trong mẫu đó, điều quan trọng là phải có các trường ẩn. Của tôi hiện tại trông như:

<form action="" method="post" class="search_form">
      <?php print $search['hidden']; ?>
        <input type="text" name="search_block_form" class="input" />
        <input type="submit"  id="edit-submit--3" name="op" value="" class="submit" />
</form>

0

Điều này rất tốt cho chỉ hộp tìm kiếm nhưng kết quả hiển thị trên trang tìm kiếm chính mà tôi cần ghi đè. Vì lý do đó, tôi muốn có thể sử dụng (các) kết quả tìm kiếm .tpl.php và chặn các tệp. Nhưng tôi dường như không thể lấy mã chính xác trong tệp mẫu của mình. Tôi đã thử sử dụng mã trên trang này để thay đổi rõ ràng mẫu chủ đề nhưng những thay đổi tôi đã thực hiện cho tpl.php cho thấy chúng không được sử dụng. Tôi đang làm gì sai?

function dove_preprocess_search_results(&$variables) {
  $variables['search_results'] = '';
  if (!empty($variables['module'])) {
    $variables['module'] = check_plain($variables['module']);
  }
  $index = 0;
  foreach ($variables['results'] as $result) {
    $variables['search_results'] .= theme('search_result',
      array(
        'result' => $result,
        'module' => $variables['module'],
        'extra_classes' => $index % 2 === 0 ? ' even' : ' odd',
      )
    );
    ++$index;
  }
  $variables['pager'] = theme('pager', array('tags' => NULL));
  $variables['theme_hook_suggestions'][] = 'search_results__' . $variables['module'];
}

Tôi chỉ nghĩ rằng tôi thêm lý do tôi cần chỉnh sửa các tệp là tôi đang sử dụng mô-đun tìm kiếm tùy chỉnh rất tuyệt nhưng kết quả là nó mang lại cho tôi loại: allthecontenttypes trong mẫu đầu vào cộng với kết quả tìm kiếm. XẤU XÍ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.