it-swarm.com.de

Wie überschreibe ich das Suchfeld?

<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 Suchmodul Drupal Search) 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?

7
enjoylife

Ich würde lieber hook_form_FORM_ID_alter() implementieren, um das von search_box () zurückgegebene Formular zu ändern. Wenn mymodule.module der Name Ihres Moduls ist, sollten Sie die Funktion mymodule_form_search_box_alter(&$form, &$form_state) hinzufügen. 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 Handler für die Formularübermittlung durch mymodule_search_box_submit(), der von Ihrem eigenen Modul implementiert werden muss. Dies ist der Code, der von dem von search.module implementierten Submission Handler 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;
}
11
kiamlaluno

Der beste Weg, dies zu tun, IMO, wäre einfach hook_form_alter () zu verwenden.

2
Alex Weber

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.

1
snufkin

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

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. U G L Y.

0
pingpong