Uso de hook_form_alter en filtros de vista expuestos en Drupal 7


12

Tengo problemas para usar hook_form_alter()con Views 3 y Drupal 7.

No puedo agregar una declaración if para identificar de forma exclusiva una vista; Sea lo que sea que ponga, la declaración if nunca se considera verdadera. Sin embargo, puedo usar fácilmente form_id usando lo siguiente, ¡así que no estoy seguro de dónde me estoy equivocando!

if ($form_id == 'views_exposed_form') {
}

¿Cómo uso hook_form_alter()para modificar de forma única una vista mía?

Respuestas:


25

Puede obtener acceso al objeto de vista dentro de hook_form_alter accediendo $form_state['view']. Eso le permite identificar una vista específica:

function mymodule_form_alter(&$form, &$form_state, $form_id) {
    if ($form_id == 'views_exposed_form') {
        $view = $form_state['view'];
        if ($view->name == 'my_view_machine_name' && $view->current_display == 'display_name') {
            // alter your exposed form here
        }
    }
}

esta es una mejor solución, ya que $ form_id no es suficiente para los formularios expuestos (a diferencia de lo que dicen otras respuestas), desafortunadamente current_display puede no ser suficiente en algunas situaciones con conjuntos complejos de vistas en la misma página
Rotari Radu

De acuerdo: esta es la solución más específica. Muy útil si está utilizando múltiples vistas de formularios de filtro expuestos.
Sabio

Use drupal_set_message ($ view-> name); & drupal_set_message ($ view-> current_display); para obtener sus nombres Estaba un poco confundido pensando que era "views_deals", pero en mi caso solo eran "ofertas".
Collins

¿Cómo podemos hacer lo mismo Drupal 8?
Sharique

Es mejor usarlo en mymodule_form_views_exposed_form_alter() lugar de mymodule_form_alter, luego puede omitir el cheque $form_id.
Berend de Boer

18

Lo que haría es dar un paso atrás y ver si incluso estás registrando este gancho. A menudo $form_idel cambio.

Proceso de depuración

  • Activar desarrollo
  • Inserte dsm ($ form_id) dentro de su gancho como solía hacerlo con D6
  • Limpia tu caché

Código de ejemplo (dentro mymodule.moduleo template.phparchivo) de drupal.org :

<?php
/**
 * Implements hook_form_alter().
 */
function mymodule_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'form_views_exposed_form') {
    drupal_set_message("Form ID is : " . $form_id);
  }
}
?>

Verá un montón de identificadores de formularios impresos, luego seleccione sus ganchos de formulario expuestos y trabaje desde allí.

Además, con drupal 7 puede orientar formularios específicos por ID directamente .

Ejemplo:

<?php
/**
 * Implements hook_form_alter().
 */
function mymodule_form_views_exposed_form_alter(&$form, &$form_state, $form_id) {
  drupal_set_message("Form ID is : " . $form_id);
}
?>

Tenga en cuenta que si está utilizando múltiples formularios expuestos, puede verificar una vista específica examinando $ form ['# id'] en la función de modificación de formulario.

Finalmente, si eso no funciona, recomendaría revisar esta lista de problemas: Cómo alterar el filtro en los filtros expuestos de forma a través de un enlace de forma


2

Recientemente me he encontrado con este problema también, pero estoy usando el módulo de características en lugar de uno personalizado. Esto me ayudó a resolver el problema.

/**
 * Implements hook_views_api_alter()
 */
function MY_FEATURE_views_api_alter(&$vars) {
  if (isset($vars['MY_FEATURE'])) {
    $vars['MY_FEATURE']['path'] = drupal_get_path('module', 'MY_FEATURE');
  }
}

Y luego puede usar su hook_form_views_exposed_form_alter ():

/**
 * Implements hook_form_views_exposed_form_alter().
 */
function MY_FEATURE_form_views_exposed_form_alter(&$form, &$form_state) {
  if($form['#id'] == 'views-exposed-form-search-products-page') {
    $form['price'] = array(
      '#type'    => 'select',
      '#size'    => NULL,
      '#options' => _getPriceOptions(),
    );
  }
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.