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

ciesz się życiem
źródło
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ń.

NikLP
źródło
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()
Manu
źródło
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ść.

shaneonabike
źródło
2
    $query->orderby[0] = "FIELD(node.type, 'story', 'page', 'productTypeC', 'productTypeD') ASC";

powinno być

    $query->orderby[0]['field'] = "field_name ASC";
dębnik
źródło
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/';
dębnik
źródło