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


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>

上記のコードは、Drupal Searchモジュールによって生成されます。このコードをフォームに追加します。

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

どうすればよいですか?

回答:


11

私はむしろ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;
}

どのファイル私が(){}関数search_boxを置く必要があります私はあなたのown.wellとsearch.moduleハンドラを交換して下のコードを理解することはできません、あなたは私に、について説明を与えることができるあなたを.thank。
enjoylife

1
search_box()フォームを作成する関数であり、search.moduleで定義されています。交換する必要はありません。フォーム送信ハンドラを置き換えるコードは、まさにそれを実行しています。それは、検索モジュールから定義された送信ハンドラをmymodule_search_box_submit()(関数名をモジュールから定義された関数の名前に変更して)置き換えます。実装する独自のモジュールとhook_form_search_box_alter()送信ハンドラを作成する必要があります。
kiamlaluno

モジュールの名前が、例えばcustom_moduleの場合mymodule_、私が報告したコードで置き換える必要がありますcustom_module_
kiamlaluno


1

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

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


数秒で私をそれに打ち負かす:)
アレックスウェーバー

同意する!!悪い解決策を残さないために私の答えを削除しますが、なぜテーマのオーバーライドが最初に頭に浮かんだのかはわかりません。
Dipen

1

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>

0

これは検索ボックスだけに最適ですが、結果はメインの検索ページに表示されるため、オーバーライドする必要があります。そのため、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'];
}

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.