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

12

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 puis-je utiliser hook_form_alter()pour modifier de façon unique une seule vue de la mienne?

SimonK
la source

Réponses:

25

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
        }
    }
}
Mirroar
la source
c'est une meilleure solution car $ form_id n'est pas suffisant pour les formulaires exposés (contrairement à ce que disent les autres réponses), malheureusement current_display peut ne pas être suffisant dans certaines situations avec des ensembles de vues complexes sur la même page
Rotari Radu
D'accord - c'est la solution la plus ciblée. Très utile si vous utilisez plusieurs vues de formulaires de filtre exposés.
Sage
Utilisez drupal_set_message ($ view-> name); & drupal_set_message ($ view-> current_display); pour obtenir vos noms. J'étais un peu confus en pensant qu'il s'agissait de "vues_deals", mais c'était juste des "deals" dans mon cas.
Collins
Comment pouvons-nous faire la même chose Drupal 8?
Sharique
Mieux vaut utiliser à la mymodule_form_views_exposed_form_alter() place de mymodule_form_alter, vous pouvez ensuite ignorer la vérification $form_id.
Berend de Boer
18

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

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.moduleou template.phpfichier) 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 directement des formulaires spécifiques par ID .

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

chrisjlee
la source
2

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(),
    );
  }
}
Vlad Moyseenko
la source