Verwenden von hook_form_alter für exponierte Ansichtsfilter in Drupal 7

12

Ich habe Probleme hook_form_alter()mit Views 3 und Drupal 7.

Ich kann keine if-Anweisung hinzufügen, um eine Ansicht eindeutig zu identifizieren. Was auch immer ich einsetze, die if-Aussage wird nie als wahr befunden. Ich kann die form_id jedoch einfach wie folgt verwenden, sodass ich nicht sicher bin, wo ich falsch liege!

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

Wie hook_form_alter()ändere ich eine einzelne meiner Ansichten eindeutig?

SimonK
quelle

Antworten:

25

Sie können auf das Ansichtsobjekt in hook_form_alter zugreifen, indem Sie auf zugreifen $form_state['view']. So können Sie eine bestimmte Ansicht identifizieren:

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
quelle
Dies ist eine bessere Lösung, da $ form_id nicht für offen gelegte Formulare ausreicht (anders als bei anderen Antworten). Leider reicht current_display in einigen Situationen mit komplexen Sichten auf derselben Seite möglicherweise nicht aus
Rotari Radu
Einverstanden - das ist die gezieltere Lösung. Sehr nützlich, wenn Sie mehrere Ansichten verfügbarer Filterformulare verwenden.
Salbei
Verwenden Sie drupal_set_message ($ view-> name); & drupal_set_message ($ view-> current_display); um deine Namen zu bekommen. Ich war leicht verwirrt und dachte, es sei "views_deals", aber in meinem Fall handelte es sich nur um "Deals".
Collins
Wie können wir das gleiche mit Drupal 8 machen?
Sharique
Besser zu verwenden mymodule_form_views_exposed_form_alter() als mymodule_form_alter, können Sie dann den Scheck für überspringen $form_id.
Berend de Boer
18

Was ich tun würde, ist, einen Schritt zurückzutreten und zu sehen, ob Sie diesen Haken überhaupt registrieren. Oft ist $form_iddas Wechselgeld.

Debugging-Prozess:

  • Schalten Sie devel ein
  • Fügen Sie wie bei D6 dsm ($ form_id) in Ihren Hook ein
  • Leere deinen Cache

Beispielcode (innerhalb mymodule.moduleoder template.phpDatei) von 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);
  }
}
?>

Es wird eine Reihe von Formular-IDs ausgedruckt. Wählen Sie dann Ihren sichtbaren Formular-Hook aus und arbeiten Sie von dort aus.

Mit Drupal 7 können Sie bestimmte Formulare auch direkt nach ID ausrichten .

Beispiel:

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

Beachten Sie, dass Sie bei Verwendung mehrerer verfügbarer Formulare nach einer bestimmten Ansicht suchen können, indem Sie $ form ['# id'] in der Formularänderungsfunktion untersuchen.

Wenn dies nicht funktioniert, empfehle ich, die Warteschlange zu überprüfen: So ändern Sie den Filter in exponierten Filtern von über den Hook form_alter

chrisjlee
quelle
2

In letzter Zeit bin ich auch auf dieses Problem gestoßen, aber ich verwende ein Funktionsmodul anstelle eines benutzerdefinierten. Dies hat mir geholfen, das Problem zu lösen.

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

Und dann können Sie Ihre hook_form_views_exposed_form_alter () verwenden:

/**
 * 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
quelle