web-dev-qa-db-fra.com

comment écraser le champ de recherche?

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

Le code ci-dessus est généré par le module de recherche Drupal. Je souhaite ajouter ce code au formulaire.

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

Comment puis-je faire cela?

7
enjoylife

Je préfère implémenter hook_form_FORM_ID_alter() pour modifier le formulaire retourné par search_box () . Si mymodule.module est le nom de votre module, vous devez alors ajouter la fonction mymodule_form_search_box_alter(&$form, &$form_state). Vous devez également remplacer le gestionnaire de soumission de formulaire par le vôtre.

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

Vous pouvez également afficher le champ de formulaire contenant le texte à rechercher en ligne avec les radios que vous ajoutez.
Le code que j'ai signalé remplace le gestionnaire de soumission de formulaire par mymodule_search_box_submit() qui doit être implémenté à partir de votre propre module. Il s'agit du code exécuté à partir du gestionnaire de soumission implémenté par search.module; Je le signale comme référence.

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

Comme référence, je rapporte ici le code de la fonction search.module qui construit le formulaire de zone de recherche.

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

La meilleure façon de le faire, OMI, serait d'utiliser simplement hook_form_alter () .

2
Alex Weber

Je pense que vous feriez mieux d'utiliser hook_form_alter () que d'éditer le modèle (pas d'offense, mais c'est vraiment une mauvaise pratique).

Vous souhaiterez probablement ajouter un nouvel élément de formulaire et un gestionnaire de soumission au formulaire de recherche, afin de pouvoir gérer l'action de soumission et traiter la valeur du nouvel élément.

1
snufkin

Il existe un modèle search-block-form.tpl.php:

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

Dans ce modèle, il est important d'avoir des champs cachés. Le mien ressemble actuellement à:

<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

C'est génial pour la zone de recherche, mais les résultats s'affichent sur la page de recherche principale, que j'ai besoin de remplacer. Pour cette raison, je veux pouvoir utiliser le (s) résultat (s) de recherche .tpl.php et bloquer les fichiers. Mais je n'arrive pas à obtenir le code correct dans mon fichier de modèle. J'ai essayé d'utiliser le code de cette page en changeant évidemment le modèle de thème mais les changements que j'ai apportés au tpl.php montrent qu'ils ne sont pas utilisés. Qu'est-ce que je fais mal?

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

Je pensais simplement ajouter la raison pour laquelle je dois modifier les fichiers parce que j'utilise un module de recherche personnalisé, ce qui est génial, mais dans le résultat, cela me donne le type: tous les types de contenu dans le formulaire de saisie plus les résultats de la recherche. LAID.

0
pingpong