¿Cómo uso hook_views_query_alter ()?

20

Siguiendo lo informado en la documentación de hook_views_query_alter () , creé un archivo llamado alterform.views.incy lo puse en un módulo habilitado llamado alterform. Agregué el siguiente código en alterform.views.inc.but no 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 qué no muestra "prueba de prueba"? ¿Qué tiene de malo mi código?

todavía no hay salida de prueba y vistas. ¿Qué tiene de malo mi código? gracias

disfruta la vida
fuente
Nunca lo usó, pero ¿es posible que deba incluir / requerir el alterform.views.incinterior de su módulo y no lo hizo?
nonsenz
he puesto alterform.views.inc en mi archivo de módulo alterform
enjoylife
¿Cómo incluir / requerir alterform.views.inc dentro de su módulo? gracias
enjoylife

Respuestas:

22

Correcto. Para "hacer" cualquier cosa con vistas en un módulo, debe implementar hook_views_api. Sin esto, su módulo no será reconocido por Views, en absoluto, nunca (AFAIK).

Agregue lo siguiente a su código de 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'),
  );
}

Esto debería solucionarlo para que su módulo sea al menos reconocido, entonces puede comenzar a depurarlo :)

Una buena forma de comenzar a depurar una vista (es decir, un pequeño paso) es colocarlo dpm($view);justo al comienzo de la función de vistas que está implementando. En la mayoría de los casos, eso descargará información en la pantalla que lo ayudará a ver dónde se encuentra. Sugeriría hacer esto con devel.module instalado / encendido.

Editar: Esto supone Vistas 2 y Drupal 6. Será mejor que preguntes si esas no son tus armas preferidas.

NikLP
fuente
Esto funciona bien :)
kalidasan
4

puedes probar 3 cosas:

  • limpia tu caché
  • descargar y habilitar Devel ,
  • usar en dpm()lugar deecho()
  • prueba $view->namecondpm()
Manu
fuente
He borrado el caché y echo $ view-> name. pero todavía no hay ninguna salida sobre el nombre de las vistas en el bloque de vistas.
enjoylife
extraño. Por lo general, no confío en echo ... Por cierto, noté un pequeño error en su código, hay un "}" que no debería ser ... ¿un error de pegado?
Manu
pero cuando imprimo_r ($ vistas) todavía no hay ninguna salida sobre tit en el bloque de vistas.
enjoylife
print_r ($ views) no debería imprimir nada más que print_r ($ view) sí. ¿Pusiste esto antes del cambio?
Manu
3

Debe colocar el archivo yourmodule.views.inc en el directorio del módulo, no dentro de un subdirectorio, o las Vistas no pueden recogerlo automáticamente.

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

debiera ser

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

Si está utilizando un directorio para yourmodule.views.inc, debe mencionar su ruta en el archivo del módulo, utilizando un código similar al siguiente:

    'path' => drupal_get_path('module', 'mymodule') . '/subdirectory/';
bronceado
fuente