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;
}
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 durchmymodule_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.mymodule_
den von mir gemeldeten Code ersetzencustom_module_
.Der beste Weg, dies zu tun, IMO, wäre einfach hook_form_alter () zu verwenden .
quelle
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.
quelle
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:
quelle
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?
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.
quelle