Come posso usare hook_views_query_alter ()?


20

Seguendo quanto riportato nella documentazione per hook_views_query_alter () , ho creato un file denominato alterform.views.ince lo ho inserito in un modulo abilitato chiamato alterform. Ho aggiunto il seguente codice in alterform.views.inc.ma non funziona.

function alterform_views_query_alter(&$view, &$query) {
  switch($view->name) {
    case 'myViewName':  
      echo 'test test'; // test       
      $query->orderby[0] = "FIELD(node.type, 'story', 'page', 'productTypeC', 'productTypeD') ASC";
      $query->orderby[1] = "node_title ASC";
      break;
  }
}

perché non genera "test test"? Cosa c'è che non va nel mio codice?

non esiste ancora alcun output di test e viste. cosa c'è che non va nel mio codice? grazie


Non l'hai mai usato, ma è possibile che tu debba includere / richiedere l' alterform.views.incinterno del tuo modulo e non l'hai fatto?
nonsenz

ho inserito alterform.views.inc nel mio file del modulo alterform
enjoylife

come includere / richiedere alterform.views.inc all'interno del modulo? grazie
enjoylife

Risposte:


22

Destra. Per "fare" qualsiasi cosa con le viste in un modulo, devi implementare hook_views_api. Senza questo, il tuo modulo non sarà mai riconosciuto da Views (AFAIK).

Si prega di aggiungere quanto segue al codice del modulo:

/**
 * Implementation of hook_views_api().
 */
function alterform_views_api() { // your module name into hook_views_api
  return array(
    'api' => 2,
    // might not need the line below, but in any case, the last arg is the name of your module
    'path' => drupal_get_path('module', 'alterform'),
  );
}

Questo dovrebbe risolverlo in modo che il tuo modulo sia almeno riconosciuto, quindi puoi iniziare il debug :)

Un buon modo per iniziare a eseguire il debug di una vista (ovvero un piccolo passaggio) è mettere dpm($view);subito all'inizio della funzione viste che stai implementando. Nella maggior parte dei casi, questo scaricherà informazioni sullo schermo che ti aiuteranno a vedere dove ti trovi. Suggerirei di farlo con devel.module installato / acceso.

Modifica: questo presuppone viste 2 e Drupal 6. Faresti meglio a chiedere in giro se quelle non sono le tue armi preferite.


Funziona bene :)
kalidasan

4

puoi testare 3 cose:

  • svuota la cache
  • scaricare e abilitare Develop ,
  • utilizzare dpm()invece diecho()
  • prova $view->namecondpm()

ho cancellato la cache ed echo $ view-> name. ma non c'è ancora alcun output sul nome delle viste nel blocco viste.
enjoylife

strano. Di solito non faccio affidamento sull'eco ... A proposito, ho notato un piccolo errore nel tuo codice, c'è un "}" che non dovrebbe essere ... un errore di incolla?
Manu,

ma quando i print_r ($ views) non c'è ancora alcun output su tit nel blocco delle viste.
enjoylife

print_r ($ views) non dovrebbe stampare altro che print_r ($ view) sì. Hai messo questo prima del passaggio?
Manu,

3

È necessario inserire il file yourmodule.views.inc nella directory del modulo, non all'interno di una sottodirectory, altrimenti Views non può rilevarlo automaticamente.


2
    $query->orderby[0] = "FIELD(node.type, 'story', 'page', 'productTypeC', 'productTypeD') ASC";

dovrebbe essere

    $query->orderby[0]['field'] = "field_name ASC";

1

se stai usando una directory per yourmodule.views.inc, devi menzionarne il percorso nel file del modulo, usando un codice simile al seguente:

    'path' => drupal_get_path('module', 'mymodule') . '/subdirectory/';
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.