Como uso hook_views_query_alter ()?

20

Seguindo o que foi relatado na documentação de hook_views_query_alter () , criei um arquivo chamado alterform.views.ince o coloquei em um módulo ativado chamado alterform. Adicionei o seguinte código em alterform.views.inc.mas não funciona.

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

por que não gera "teste de teste"? O que há de errado com o meu código?

ainda não há saída de teste e visualizações. o que há de errado com o meu código? obrigado

Aproveite a vida
fonte
Nunca o usou, mas é possível que você precise / exija o alterform.views.incinterior do seu módulo e não o fez?
Nonsenz
i ter colocado alterform.views.inc no meu arquivo módulo alterform
enjoylife
como incluir / exigir o alterform.views.inc dentro do seu módulo? obrigado
enjoylife

Respostas:

22

Direita. Para "fazer" qualquer coisa com visualizações em um módulo, você precisa implementar hook_views_api. Sem isso, seu módulo não será reconhecido pelo Views, de forma alguma (AFAIK).

Adicione o seguinte ao código do seu módulo:

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

Isso deve corrigi-lo para que seu módulo seja pelo menos reconhecido, e você poderá começar a depurá-lo :)

Uma boa maneira de começar a depurar uma visualização (ou seja, um pequeno passo) é colocar dpm($view);logo no início da função de visualizações que você está implementando. Na maioria dos casos, isso despejará informações na tela que o ajudarão a ver onde você está. Sugiro fazer isso com o devel.module instalado / ativado.

Edit: Isso assume as Views 2 e Drupal 6. É melhor você perguntar se essas não são suas armas de escolha.

NikLP
fonte
Isso funciona bem :)
kalidasan
4

você pode testar 3 coisas:

  • limpe seu cache
  • faça o download e ative o Devel ,
  • use em dpm()vez deecho()
  • teste $view->namecomdpm()
Manu
fonte
Limpei o cache e ecoei $ view-> name. mas ainda não há saída sobre o nome das visualizações no bloco de visualizações.
Enjoylife
esquisito. Normalmente não confio no eco ... A propósito, notei um pequeno erro no seu código, existe um "}" que não deveria ser ... um erro de colagem?
Manu
mas quando imprimo ($ views) ainda não há saída sobre tit no bloco de views.
Enjoylife
print_r ($ views) não deve imprimir nada além de print_r ($ view) sim. Você colocou isso antes da troca?
Manu
3

Você precisa colocar o arquivo yourmodule.views.inc no diretório do módulo, não dentro de um subdiretório, ou o Views não pode buscá-lo automaticamente.

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

deveria estar

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

se você estiver usando um diretório para yourmodule.views.inc, precisará mencionar o caminho no arquivo do módulo, usando um código semelhante ao seguinte:

    'path' => drupal_get_path('module', 'mymodule') . '/subdirectory/';
bronzeado
fonte