it-swarm-es.com

¿Cómo sobrescribir el cuadro de búsqueda?

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

El código anterior es generado por el Drupal Módulo de búsqueda. Quiero agregar este código al formulario.

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

¿Cómo hago esto?

7
enjoylife

Prefiero implementar hook_form_FORM_ID_alter() para alterar el formulario devuelto por search_box () . Si mymodule.module es el nombre de su módulo, entonces debe agregar la función mymodule_form_search_box_alter(&$form, &$form_state). También debe reemplazar el controlador de envío de formularios por el suyo.

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

También puede mostrar el campo de formulario que contiene el texto para buscar en línea con las radios que agregue.
El código que informé reemplaza el controlador de envío de formularios con mymodule_search_box_submit() que debe implementarse desde su propio módulo. Este es el código ejecutado desde el controlador de envío implementado por search.module; Lo informo como referencia.

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

Como referencia, informo aquí el código de la función search.module que construye el formulario del cuadro de búsqueda.

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 mejor manera de hacer esto, IMO, sería simplemente usar hook_form_alter () .

2
Alex Weber

Creo que es mejor usar hook_form_alter () que editar la plantilla (sin ofender, pero eso es realmente una mala práctica).

Probablemente desee agregar un nuevo elemento de formulario y un controlador de envío al formulario de búsqueda, para que pueda manejar la acción de envío y procesar el valor del nuevo elemento.

1
snufkin

Hay una plantilla search-block-form.tpl.php:

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

En esa plantilla es importante tener campos ocultos. El mío actualmente se ve así:

<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

Esto es excelente solo para el cuadro de búsqueda, pero los resultados se muestran en la página de búsqueda principal, que necesito anular. Por esa razón, quiero poder usar los resultados de búsqueda .tpl.php y bloquear archivos. Pero parece que no puedo obtener el código correcto en mi archivo de plantilla. Intenté usar el código en esta página cambiando obviamente la plantilla del tema, pero los cambios que hice en tpl.php muestran que no se están utilizando. ¿Qué estoy haciendo 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'];
}

Solo pensé que agregaría la razón por la que necesito editar los archivos es que estoy usando un módulo de búsqueda personalizado, lo cual es genial, pero en consecuencia me da el tipo: todos los tipos de contenido en el formulario de entrada más los resultados de búsqueda. FEO.

0
pingpong