Użycie hook_form_alter na filtrach widoku narażonego na Drupal 7

12

Mam problem hook_form_alter()z używaniem aplikacji Views 3 i Drupal 7.

Nie jestem w stanie dodać instrukcji if, aby jednoznacznie zidentyfikować widok; cokolwiek wprowadzę, stwierdzenie if nigdy nie zostanie uznane za prawdziwe. Jednak mogę łatwo użyć form_id, używając następującego, więc nie jestem pewien, gdzie popełniam błąd!

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

Jak użyć, hook_form_alter()aby jednoznacznie zmienić mój widok?

SimonK
źródło

Odpowiedzi:

25

Dostęp do obiektu widoku można uzyskać w hook_form_alter, uzyskując dostęp $form_state['view']. To pozwala zidentyfikować konkretny widok:

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
źródło
jest to lepsze rozwiązanie, ponieważ $ form_id nie wystarcza dla odsłoniętych formularzy (w przeciwieństwie do innych odpowiedzi), niefortunnie aktualny ekran może nie wystarczyć, są sytuacje ze złożonymi zestawami widoków na tej samej stronie
Rotari Radu
Uzgodnione - jest to bardziej ukierunkowane rozwiązanie. Bardzo przydatne, jeśli używasz wielu widoków odsłoniętych formularzy filtrów.
Sage,
Użyj komendy drupal_set_message ($ view-> name); & drupal_set_message ($ view-> current_display); dostać swoje imiona. Byłem nieco zdezorientowany myśląc, że to „views_deals”, ale w moim przypadku były to po prostu „okazje”.
Collins,
Jak możemy zrobić to samo Drupal 8?
Sharique
Lepiej użyć mymodule_form_views_exposed_form_alter() zamiast mymodule_form_alter, możesz następnie pominąć zaznaczenie $form_id.
Berend de Boer,
18

Chciałbym cofnąć się o krok i sprawdzić, czy rejestrujesz ten hak. Często się $form_idzmienia.

Proces debugowania:

  • Włącz programowanie
  • Wstaw dsm ($ form_id) do haka, tak jak w przypadku D6
  • Wyczyść pamięć podręczną

Przykładowy kod (wewnątrz mymodule.modulelub template.phpplik) z 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);
  }
}
?>

Zobaczysz wydrukowane kilka identyfikatorów formularzy, a następnie wybierz odsłonięte odsłonięcie formularza i rozpocznij pracę.

Ponadto dzięki drupal 7 możesz bezpośrednio kierować określone formularze według ID .

Przykład:

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

Zauważ, że jeśli używasz wielu odsłoniętych formularzy, możesz sprawdzić konkretny widok, sprawdzając $ form ['# id'] w funkcji zmiany formularza.

Na koniec, jeśli to nie zadziała, polecam przejrzenie tej kolejki problemów: Jak zmienić filtr w odsłoniętych filtrach przez hak form_alter

chrisjlee
źródło
2

ostatnio natknąłem się na ten problem, ale używam modułu funkcji zamiast niestandardowego. Pomogło mi to rozwiązać problem.

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

A potem możesz użyć swojego 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
źródło