私はむしろsearch_box()hook_form_FORM_ID_alter()
によって返されるフォームを変更するために実装したいと思います。mymodule.moduleがモジュールの名前である場合、関数を追加する必要があります。フォーム送信ハンドラーを独自のものに置き換える必要もあります。mymodule_form_search_box_alter(&$form, &$form_state)
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');
}
追加するラジオとインラインで検索するテキストを含むフォームフィールドを表示することもできます。
私が報告したコードは、フォーム送信ハンドラーをmymodule_search_box_submit()
、独自のモジュールから実装する必要があるハンドラーに置き換えます。これは、search.moduleによって実装された送信ハンドラから実行されるコードです。参考としてご報告いたします。
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]);
}
参考までに、検索ボックスフォームを作成するsearch.module関数のコードを報告します。
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;
}