Comment utiliser hook_views_query_alter ()?

20

Suite à ce qui a été rapporté dans la documentation de hook_views_query_alter () , j'ai créé un fichier nommé alterform.views.incet l' ai placé dans un module activé appelé alterform. J'ai ajouté le code suivant dans alterform.views.inc.mais cela ne fonctionne 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

profite de la vie
la source
Je alterform.views.incne l'ai jamais utilisé, mais est-il possible que vous deviez inclure / exiger l' intérieur de votre module et vous ne l'avez pas fait?
nonsenz
j'ai mis alterform.views.inc dans mon fichier de module
alterform
comment inclure / exiger le alterform.views.inc dans votre module? merci
enjoylife

Réponses:

22

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 :)

Un bon moyen de déboguer une vue (c'est-à-dire un petit pas) est de placer 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.

NikLP
la source
Cela fonctionne bien :)
kalidasan
4

vous pouvez tester 3 choses:

  • vider votre cache
  • téléchargez et activez Devel ,
  • utiliser dpm()au lieu deecho()
  • tester $view->nameavecdpm()
Manu
la source
j'ai effacé le cache et echo $ view-> nom. mais il n'y a toujours aucune sortie sur le nom des vues dans le bloc de vues.
enjoylife
bizarre. Je ne me fie pas habituellement à l'écho ... Au fait, j'ai remarqué une petite erreur dans votre code, il y a un "}" qui ne devrait pas être ... une erreur de collage?
Manu
mais quand je print_r ($ vues) il n'y a toujours aucune sortie sur tit dans le bloc de vues.
profitez de la vie
print_r ($ vues) ne devrait rien imprimer mais print_r ($ vues) oui. L'avez-vous mis avant le changement?
Manu
3

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.

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

devrait être

    $query->orderby[0]['field'] = "field_name ASC";
bronzer
la source
1

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/';
bronzer
la source