web-dev-qa-db-ja.com

検索ボックスを上書きするには?

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

上記のコードはDrupal検索モジュールによって生成されています。このコードをフォームに追加したいと思います。

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

どうすればよいですか?

7
enjoylife

私はむしろhook_form_FORM_ID_alter()を実装して search_box() によって返されるフォームを変更します。 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;
}
_
11
kiamlaluno

これを行う最良の方法であるIMOは、単純に hook_form_alter() を使用することです。

2
Alex Weber

テンプレートを編集するよりも hook_form_alter() を使用した方がよいと思います(問題はありませんが、これは実際に悪い習慣です)。

新しいフォーム要素と送信ハンドラを検索フォームに追加すると、送信アクションを処理して新しい要素の値を処理できるようになります。

1
snufkin

Search-block-form.tpl.phpテンプレートがあります:

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

そのテンプレートでは、非表示フィールドがあることが重要です。鉱山は現在次のように見えます:

<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

これは検索ボックスだけに最適ですが、結果はメインの検索ページに表示されるため、オーバーライドする必要があります。そのため、search-result(s).tpl.phpとブロックファイルを使用できるようにしたいと考えています。しかし、テンプレートファイルでコードを正しく取得できないようです。このページのコードを使用してテーマテンプレートを明らかに変更しようとしましたが、tpl.phpに加えた変更により、それらが使用されていないことが示されています。何が悪いのですか?

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'];
}

ファイルを編集する必要がある理由を追加したいと思いましたが、カスタム検索モジュールを使用しているのは素晴らしいですが、結果として、入力フォームのtype:allthecontenttypesと検索結果が表示されます。醜い。

0
pingpong