it-swarm.it

Come posso usare hook_views_query_alter ()?

Seguendo quanto riportato nella documentazione per hook_views_query_alter () , ho creato un file chiamato alterform.views.inc e inseriscilo 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

20
enjoylife

Giusto. 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 (ad esempio un piccolo passaggio) è mettere dpm($view); proprio all'inizio della funzione di viste che stai implementando. Nella maggior parte dei casi, questo scaricherà le 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. Ti conviene chiedere in giro se quelle non sono le tue armi preferite.

22
NikLP

puoi testare 3 cose:

  • svuota la cache
  • scaricare e abilitare Devel ,
  • usa dpm() invece di echo()
  • test $view->name con dpm()
4
Manu

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

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

dovrebbe essere

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

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/';
1
tan