it-swarm-vi.com

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

<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>

Mã trên được tạo bởi mô đun Drupal Tìm kiếm. Tôi muốn thêm mã này vào biểu 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?

7
enjoylife

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 hàm 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 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;
}
11
kiamlaluno

Cách tốt nhất để làm điều này, IMO, chỉ đơn giản là sử dụng hook_form_alter () .

2
Alex Weber

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.

1
snufkin

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>
1
user2870349

Đ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Í.

0
pingpong