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


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.


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

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.


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

devrait être

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

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/';
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.