it-swarm-eu.dev

jak přepsat vyhledávací pole?

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

Výše uvedený kód je generován Drupal. Chci tento kód přidat do formuláře.

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

Jak to mám udělat?

7
enjoylife

Raději implementuji hook_form_FORM_ID_alter() pro změnu tvaru vráceného search_box () . Pokud je mymodule.module název vašeho modulu, měli byste přidat funkci mymodule_form_search_box_alter(&$form, &$form_state). Musíte také nahradit popisovač odeslání formuláře svým vlastním.

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

Mohli byste také zobrazit pole formuláře obsahující text, který bude hledat inline s přidanými rádii.
Kód, který jsem nahlásil, nahrazuje popisovač odeslání formuláře mymodule_search_box_submit(), který musí být implementován z vašeho vlastního modulu. Toto je kód provedený z obsluhy odevzdání implementované pomocí search.module; Oznámím to jako referenci.

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

Jako odkaz zde nahlásím kód funkce search.module, která vytváří formulář pro vyhledávací pole.

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

Nejlepší způsob, jak toho dosáhnout, IMO, by bylo jednoduše použít hook_form_alter () .

2
Alex Weber

Myslím, že je lepší použít hook_form_alter () než upravit šablonu (žádný urážka, ale to je opravdu špatná praxe).

Pravděpodobně budete chtít do vyhledávacího formuláře přidat nový prvek formuláře a popisovač odeslání, abyste mohli zpracovat akci odeslání a zpracovat hodnotu nového prvku.

1
snufkin

K dispozici je šablona search-block-form.tpl.php:

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

V této šabloně je důležité mít skrytá pole. Důl v současné době vypadá takto:

<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

To je skvělé jen pro vyhledávací pole, ale výsledky se zobrazují na hlavní vyhledávací stránce, kterou musím přepsat. Z tohoto důvodu chci být schopen používat výsledky hledání .tpl.php a blokové soubory. Zdá se mi však, že kód v souboru šablony není správný. Snažil jsem se použít kód na této stránce, který zjevně mění tematickou šablonu, ale změny, které jsem provedl v tpl.php, ukazují, že se nepoužívají. Co dělám špatně?

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

Jen jsem si myslel, že bych přidal důvod, proč potřebuji upravovat soubory, protože používám vlastní vyhledávací modul, což je skvělé, ale ve výsledku mi dává typ: allthecontenttypes ve vstupní formě plus výsledky vyhledávání. U G L Y.

0
pingpong