¿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


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.


Esto funciona bien :)
— kalidasan

4

puedes probar 3 cosas:

  • limpia tu caché
  • descargar y habilitar Devel ,
  • usar en dpm()lugar deecho()
  • prueba $view->namecondpm()

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.


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

debiera ser

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

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/';
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.