Wie überschreibe ich das Suchfeld?

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>

Der obige Code wird vom Drupal-Suchmodul generiert. Ich möchte diesen Code zum Formular hinzufügen.

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

Wie mache ich das?

genieße das Leben
quelle

Antworten:

11

Ich würde lieber implementieren hook_form_FORM_ID_alter(), um das von search_box () zurückgegebene Formular zu ändern . Wenn mymodule.module der Name Ihres Moduls ist, sollten Sie die Funktion hinzufügen mymodule_form_search_box_alter(&$form, &$form_state). Sie müssen auch den Formularübermittlungs-Handler durch Ihren eigenen ersetzen.

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

Sie können auch das Formularfeld mit dem zu suchenden Text inline mit den von Ihnen hinzugefügten Radios anzeigen.
Der von mir gemeldete Code ersetzt den Formularübermittlungs-Handler durch den Code, der mymodule_search_box_submit()von Ihrem eigenen Modul implementiert werden muss. Dies ist der Code, der von dem von search.module implementierten Übermittlungshandler ausgeführt wird. Ich melde es als Referenz.

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

Als Referenz berichte ich hier den Code der Funktion search.module, die das Suchfeldformular erstellt.

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;
}
kiamlaluno
quelle
In welche Datei soll ich die Funktion search_box () {} einfügen? Ich kann den Code unter Ersetzen Sie den search.module-Handler nicht durch Ihren eigenen. Nun, können Sie mir eine Erklärung geben. Danke
Enjoylife
1
search_box()ist die Funktion, die das Formular erstellt und in search.module definiert ist. es muss nicht ersetzt werden. Der Code, der den Formularübermittlungshandler ersetzt, macht genau das: Er ersetzt den vom Suchmodul definierten Übermittlungshandler durch mymodule_search_box_submit()(ändern Sie den Funktionsnamen durch den Namen der in Ihrem Modul definierten Funktion). Sie müssen lediglich ein eigenes Modul erstellen, das implementiert wird, hook_form_search_box_alter()sowie den Übermittlungshandler.
Kiamlaluno
Wenn der Name Ihres Moduls z. B. custom_module lautet, müssen Sie mymodule_den von mir gemeldeten Code ersetzen custom_module_.
Kiamlaluno
1

Ich denke, Sie sind besser dran, hook_form_alter () zu verwenden, als die Vorlage zu bearbeiten (keine Beleidigung, aber das ist wirklich eine schlechte Praxis).

Sie möchten dem Suchformular wahrscheinlich ein neues Formularelement und einen Übermittlungshandler hinzufügen, damit Sie die Übermittlungsaktion ausführen und den Wert des neuen Elements verarbeiten können.

Schnupftabak
quelle
schlagen Sie mich um ein paar Sekunden :)
Alex Weber
Genau!! Ich werde meine Antwort löschen, um keine schlechten Lösungen zu finden. Ich bin mir nicht sicher, warum mir zuerst das Überschreiben von Themen in den Sinn kam.
Dipen
1

Es gibt eine Vorlage für search-block-form.tpl.php:

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

In dieser Vorlage ist es wichtig, versteckte Felder zu haben. Meins sieht derzeit so aus:

<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>
user2870349
quelle
0

Dies ist nur für das Suchfeld geeignet, aber die Ergebnisse werden auf der Hauptsuchseite angezeigt, die ich überschreiben muss. Aus diesem Grund möchte ich in der Lage sein, die Suchergebnisse .tpl.php zu verwenden und Dateien zu blockieren. Aber ich kann nicht scheinen, den Code in meiner Vorlagendatei richtig zu machen. Ich habe versucht, den Code auf dieser Seite zu verwenden, um offensichtlich die Designvorlage zu ändern, aber die Änderungen, die ich an der tpl.php vorgenommen habe, zeigen, dass sie nicht verwendet werden. Was mache ich falsch?

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

Ich dachte nur, ich würde den Grund hinzufügen, warum ich die Dateien bearbeiten muss, weil ich ein benutzerdefiniertes Suchmodul verwende, was großartig ist, aber im Ergebnis gibt es mir den Typ: alle Inhaltstypen im Eingabeformular plus die Suchergebnisse. UGL Y.

Tischtennis
quelle