Jak korzystać z hook_views_query_alter ()?


20

Zgodnie z tym, co zgłoszono w dokumentacji dla hook_views_query_alter () , utworzyłem plik o nazwie alterform.views.inci umieściłem go w włączonym module o nazwie alterform. Dodałem następujący kod w. alterform.views.incAle to nie działa.

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

dlaczego nie wyświetla „testu testowego”? Co jest nie tak z moim kodem?

wciąż nie ma wyników testów i widoków. co jest nie tak z moim kodem? Dziękuję Ci


Nigdy go nie używałem, ale czy jest możliwe, że musisz dołączyć / wymagać alterform.views.incwnętrza modułu, a nie zrobiłeś tego?
nonsenz

umieściłem alterform.views.inc w moim pliku modułu alterform
enjoylife

Jak dołączyć / wymagać pliku alterform.views.inc w module? dziękuję
enjoylife

Odpowiedzi:


22

Dobrze. Aby „zrobić” cokolwiek z widokami w module, musisz zaimplementować hook_views_api. Bez tego twój moduł nie będzie w ogóle rozpoznawany przez Views (AFAIK).

Dodaj następujący kod do kodu modułu:

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

To powinno to naprawić, aby Twój moduł został przynajmniej rozpoznany, a następnie możesz rozpocząć debugowanie :)

Dobrym sposobem na rozpoczęcie debugowania widoku (tj. Kroku niemowlęcego) jest dpm($view);poprawienie funkcji widoku, którą implementujesz. W większości przypadków spowoduje to zrzucenie informacji na ekran, które pomogą Ci zobaczyć, gdzie jesteś. Sugerowałbym zrobienie tego z zainstalowanym / włączonym devel.module.

Edycja: Zakłada się, że widoki 2 i Drupal 6. Najlepiej spytaj, czy to nie jest twoja broń.


Działa to dobrze :)
kalidasan

4

możesz przetestować 3 rzeczy:

  • wyczyść pamięć podręczną
  • pobierz i włącz Devel ,
  • użyj dpm()zamiastecho()
  • test $view->namezdpm()

Wyczyściłem pamięć podręczną i echo $ view-> name. ale nadal nie ma żadnych danych wyjściowych dotyczących nazwy widoków w bloku widoków.
enjoylife

dziwne. Zwykle nie polegam na echu ... Przy okazji zauważyłem mały błąd w twoim kodzie, jest „}”, które nie powinno być… błędem wklejenia?
Manu,

ale kiedy i print_r ($ views) nadal nie ma żadnych danych wyjściowych dotyczących tit w bloku widoków.
enjoylife

print_r ($ views) nie powinien drukować niczego oprócz print_r ($ view) tak. Czy umieściłeś to przed zmianą?
Manu,

3

Musisz umieścić plik yourmodule.views.inc w katalogu modułu, a nie w podkatalogu, w przeciwnym razie widoki nie będą mogły go automatycznie podnieść.


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

powinno być

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

1

jeśli korzystasz z katalogu yourmodule.views.inc, musisz podać jego ścieżkę w pliku modułu, używając kodu podobnego do następującego:

    'path' => drupal_get_path('module', 'mymodule') . '/subdirectory/';
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.