web-dev-qa-db-fra.com

Comment utiliser hook_views_query_alter ()?

Suite à ce qui est rapporté dans la documentation pour hook_views_query_alter () , j'ai créé un fichier nommé alterform.views.inc et le placer dans un module activé appelé alterform. J'ai ajouté le code suivant dans alterform.views.inc. mais ça ne marche pas.

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

pourquoi ne produit-il pas "test test"? Qu'est ce qui ne va pas avec mon code?

il n'y a toujours pas de sortie de test et de vues. Qu'est ce qui ne va pas avec mon code? Merci

20
enjoylife

Droite. Pour "faire" quoi que ce soit avec des vues dans un module, vous devez implémenter hook_views_api. Sans cela, votre module ne sera jamais reconnu par Views (AFAIK).

Veuillez ajouter ce qui suit à votre code de module:

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

Cela devrait le corriger pour que votre module soit au moins reconnu, alors vous pouvez commencer à le déboguer :)

Une bonne façon de déboguer une vue (c'est-à-dire une étape bébé) est de mettre dpm($view); au début de la fonction de vues que vous implémentez. Dans la plupart des cas, cela affichera des informations sur l'écran qui vous aideront à voir où vous en êtes. Je suggérerais de le faire avec devel.module installé/activé.

Edit: Cela suppose que les vues 2 et Drupal 6. Vous feriez mieux de demander si ce ne sont pas vos armes de choix.

22
NikLP

vous pouvez tester 3 choses:

  • vider votre cache
  • télécharger et activer Devel ,
  • utilisez dpm() au lieu de echo()
  • tester $view->name avec dpm()
4
Manu

Vous devez placer le fichier yourmodule.views.inc dans le répertoire du module, pas dans un sous-répertoire, sinon Views ne peut pas le récupérer automatiquement.

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

devrait être

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

si vous utilisez un répertoire pour yourmodule.views.inc, vous devez mentionner son chemin dans le fichier de module, en utilisant un code similaire au suivant:

    'path' => drupal_get_path('module', 'mymodule') . '/subdirectory/';
1
tan