Utilizzo di hook_form_alter su filtri di vista esposti su Drupal 7


12

Sto riscontrando problemi hook_form_alter()con l' utilizzo di Views 3 e Drupal 7.

Non riesco ad aggiungere un'istruzione if per identificare in modo univoco una vista; qualunque cosa io inserisca, l'affermazione if non viene mai trovata vera. Tuttavia, posso facilmente usare form_id usando quanto segue, quindi non sono sicuro di dove sbaglio!

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

Come posso utilizzare hook_form_alter()per modificare in modo univoco una mia vista?

Risposte:


25

È possibile ottenere l'accesso all'oggetto vista in hook_form_alter accedendo $form_state['view']. Ciò ti consente di identificare una vista specifica:

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

questa è una soluzione migliore poiché $ form_id non è sufficiente per i moduli esposti (a differenza di come affermano le altre risposte), sfortunatamente current_display potrebbe non essere sufficiente in alcune situazioni con serie complesse di visualizzazioni sulla stessa pagina
Rotari Radu

D'accordo: questa è la soluzione più mirata. Molto utile se si utilizzano moduli filtro esposti a più viste.
Salvia,

Usa drupal_set_message ($ view-> name); & drupal_set_message ($ view-> current_display); per ottenere i tuoi nomi. Ero un po 'confuso pensando che fosse "views_deals", ma nel mio caso erano solo "offerte".
Collins,

Come possiamo fare la stessa cosa Drupal 8?
Sharique,

Meglio usare mymodule_form_views_exposed_form_alter() invece di mymodule_form_alter, è quindi possibile saltare il controllo per $form_id.
Berend de Boer,

18

Quello che vorrei fare è fare un passo indietro e vedere se stai registrando questo hook. Spesso $form_idcambia.

Processo di debug:

  • Attiva lo sviluppo
  • Inserisci dsm ($ form_id) nel tuo hook come una volta con D6
  • Cancella la cache

Codice di esempio (interno mymodule.moduleo template.phpfile) da 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);
  }
}
?>

Vedrai un gruppo di ID modulo stampati, quindi seleziona le viste esposte gancio modulo e lavora da lì.

Inoltre, con drupal 7 sei in grado di indirizzare direttamente moduli specifici tramite ID .

Esempio:

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

Si noti che se si utilizzano più moduli esposti è possibile verificare una vista specifica esaminando $ form ['# id'] nella funzione di modifica del modulo.

Infine, se il problema persiste, consiglierei di esaminare questo problema in coda: Come modificare il filtro nei filtri esposti dal form_alter hook


2

recentemente ho riscontrato anche questo problema, ma sto usando il modulo funzione invece di quello personalizzato. Questo mi ha aiutato a risolvere il 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');
  }
}

E poi puoi usare 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(),
    );
  }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.