Wie verwende ich hook_views_query_alter ()?

20

Entsprechend den Angaben in der Dokumentation zu hook_views_query_alter () habe ich eine Datei mit dem Namen erstellt alterform.views.incund in ein aktiviertes Modul mit dem Namen eingefügtalterform . Ich habe den folgenden Code alterform.views.inchinzugefügt, aber es funktioniert nicht.

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

Warum wird "test test" nicht ausgegeben? Was ist los mit meinem Code?

Es wird immer noch kein Test und keine Ansicht ausgegeben. Was ist los mit meinem Code? Danke dir

genieße das Leben
quelle
Nie benutzt, aber ist es möglich, dass Sie das alterform.views.incin Ihr Modul einfügen müssen / müssen, und Sie haben es nicht getan?
Keine Anwesenheit
Ich habe alterform.views.inc in meine alterform-Modul-Datei
eingefügt
Wie kann ich die Datei alterform.views.inc in mein Modul einbinden? danke
enjoylife

Antworten:

22

Recht. Um irgendetwas mit Ansichten in einem Modul "zu tun", müssen Sie hook_views_api implementieren. Ohne diese Option wird Ihr Modul niemals von Views (AFAIK) erkannt.

Bitte ergänzen Sie Ihren Modulcode um:

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

Dies sollte das Problem beheben, damit Ihr Modul zumindest erkannt wird. Dann können Sie mit dem Debuggen beginnen :)

Eine gute Möglichkeit zum Debuggen einer Ansicht (z. B. eines kleinen Schritts) besteht darin, dpm($view);die von Ihnen implementierte Ansichtsfunktion direkt am Anfang zu platzieren. In den meisten Fällen werden dadurch Informationen auf dem Bildschirm angezeigt, anhand derer Sie erkennen können, wo Sie sich gerade befinden. Ich würde vorschlagen, dies mit installiertem / eingeschaltetem devel.module zu tun.

Bearbeiten: Dies setzt Views 2 und Drupal 6 voraus. Am besten fragst du herum, ob das nicht deine Waffe ist.

NikLP
quelle
Dies funktioniert gut :)
Validasan
4

Sie können 3 Dinge testen:

  • Leere deinen Cache
  • Devel herunterladen und aktivieren ,
  • Verwenden Sie dpm()anstelle vonecho()
  • testen $view->namemitdpm()
Manu
quelle
Ich habe den Cache geleert und $ view-> name zurückgegeben. Über den Namen der Ansichten im Ansichtsblock wird jedoch immer noch nichts ausgegeben.
enjoylife
seltsam. Normalerweise verlasse ich mich nicht auf Echo ... Übrigens, ich habe einen kleinen Fehler in Ihrem Code bemerkt, es gibt ein "}", das nicht sein sollte ... ein Einfügefehler?
Manu
aber wenn ich print_r ($ views), gibt es immer noch keine Ausgabe über tit im views-Block.
enjoylife
print_r ($ view) sollte nur print_r ($ view) ausgeben yes. Hast du das vor den Schalter gestellt?
Manu
3

Sie müssen die Datei yourmodule.views.inc im Modulverzeichnis ablegen, nicht in einem Unterverzeichnis, oder Views kann sie nicht automatisch abrufen.

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

sollte sein

    $query->orderby[0]['field'] = "field_name ASC";
bräunen
quelle
1

Wenn Sie ein Verzeichnis für yourmodule.views.inc verwenden, müssen Sie dessen Pfad in der Moduldatei mit einem Code wie dem folgenden angeben:

    'path' => drupal_get_path('module', 'mymodule') . '/subdirectory/';
bräunen
quelle