web-dev-qa-db-fra.com

Utilisation de hook_form_alter sur les filtres de vue exposés sur Drupal 7

J'ai du mal à utiliser hook_form_alter() avec Views 3 et Drupal 7.

Je ne parviens pas à ajouter une instruction if pour identifier de façon unique une vue; quoi que je mette, la déclaration if ne se révèle jamais vraie. Cependant, je peux facilement utiliser le form_id en utilisant ce qui suit, donc je ne sais pas où je me trompe!

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

Comment utiliser hook_form_alter() pour modifier de manière unique une seule vue de la mienne?

12
SimonK

Vous pouvez accéder à l'objet de vue dans hook_form_alter en accédant à $form_state['view']. Cela vous permet d'identifier une vue spécifique:

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
        }
    }
}
25
Mirroar

Ce que je ferais, c'est prendre un peu de recul et voir si vous enregistrez même ce crochet. Souvent $form_id's change.

Processus de débogage:

  • Activer le développement
  • Insérez dsm ($ form_id) dans votre crochet comme vous le faisiez avec D6
  • Videz votre cache

Exemple de code (à l'intérieur mymodule.module ou template.php fichier) 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);
  }
}
?>

Vous verrez un tas d'ID de formulaire imprimé, puis sélectionnez votre point de vue exposé et travaillez à partir de là.

De plus, avec drupal 7 vous pouvez cibler des formulaires par ID directement .

Exemple:

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

Notez que si vous utilisez plusieurs formulaires exposés, vous pouvez vérifier une vue spécifique en examinant $ form ['# id'] dans la fonction alter form.

Enfin, si cela ne fonctionne pas, je recommanderais de revoir cette file d'attente de problèmes: Comment modifier le filtre dans les filtres exposés via le crochet form_alter

18
chrisjlee

récemment, j'ai également rencontré ce problème, mais j'utilise un module de fonctionnalité au lieu d'un module personnalisé. Cela m'a aidé à résoudre le problème.

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

Et puis vous pouvez utiliser votre 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(),
    );
  }
}
2
Vlad Moyseenko