it-swarm-es.com

Visualización de la tabla SQL como una lista paginada

Estoy intentando lo siguiente y funciona:

mi.module:

   function my_menu() {
      $items['page_example'] = array(
        'title' => 'Page Example',
        'description' => 'Page Example',
        'page callback' => 'page_example',
        'access callback' => TRUE,
        'file' => 'my.page.inc',
        'file path' => drupal_get_path('module', 'my'),
        'type' => MENU_CALLBACK,
      );
     return $items;
   }

mi.página.inc:

function page_example() {
  return array(
    'page_example' => array(
      '#type' => 'markup',
      '#markup' => generate_list(),
    ),
  );
}

function generate_list() {
  $query = db_select('users', 'name')
    ->extend('PagerDefault')
    ->fields('name', array('Name'))
    ->orderBy('created', 'DESC')
    ->limit(20);

  $result = $query->execute();
  $output = '';
  foreach ($result as $row) {
    $output .= $row->name.'<br/>';
  }

  $output .= theme('pager');
  return $output;
}

Pero luego intento anteponer un campo id - a cada fila y falla:

  $query = db_select('users', 'name', 'uid')
    ->extend('PagerDefault')
    ->fields('name', array('Name'), 'uid', array('Id'))
    //->addField('uid', 'User Id')
    //->addField('name', 'User Name')
    ->orderBy('created', 'DESC')
    ->limit(20);

  $result = $query->execute();
  $output = '';
  foreach ($result as $row) {
    $output .= $row->uid.': '.$row->name.'<br/>';
  }

Con el error:

Recoverable fatal error: Argument 3 passed to db_select() 
must be an array, string given, called in my.page.inc 
on line 13 and defined in function db_select() 
(line 2387 in includes/database/database.inc).

ACTUALIZAR:

En el comentario de Camsoft (gracias), modifiqué el código para:

  $query = db_select('users')
    ->extend('PagerDefault')
    ->fields('name', array('Name'), 'uid', array('Id'))
    //->addField('uid', 'User Id')
    //->addField('name', 'User Name')
    ->orderBy('created', 'DESC')
    ->limit(20);

Y ahora falla con

DOException: SQLSTATE[42P01]: Undefined table: 7 ERROR: 
missing FROM-clause entry for table "name" at character 8: 
SELECT name.Name AS Name, created AS created FROM {users} 
users ORDER BY created DESC LIMIT 20 OFFSET 0; Array ( ) 
in function PagerDefault->execute() (line 80 includes/pager.inc).

Solo estoy tratando de averiguar cómo agregar un segundo campo de tabla SQL a un db_select paginado ... Por favor, no me sugiera una "Vista", porque estoy tratando de entender DBTNG En el momento.

3
Alexander Farber

La llamada a db_select() y las siguientes llamadas a métodos son incorrectas.

  • El segundo parámetro de db_select() es un alias de tabla, que luego debe usarse cuando se hace referencia a los campos usados ​​por la consulta.
  • los parámetros pasados ​​a la fields() son incorrectos; vea el siguiente fragmento para ver un ejemplo de cómo debería ser la llamada a db_select().
 $ resultado = db_select ('file_usage', 'f') 
 -> fields ('f', array ('module', 'type', 'id', 'count')) 
 -> condición ('fid', $ archivo-> fid) 
 -> condición ('cuenta', 0, '>') 
 -> ejecutar (); 

Su llamada a db_select() debe reescribirse como:

$query = db_select('users', 'u')
  ->fields('u', array('name', 'uid'))
  ->orderBy('created', 'DESC')
  ->limit(20)
  ->extend('PagerDefault');
5
kiamlaluno

¿No podría simplemente usar el módulo Vistas para hacer esto?

Al crear una vista, seleccione User en la lista Tipo de vista. Es mucho más fácil que hacerlo mediante programación.

Actualizar


De acuerdo con la documentación de db_select , se supone que el tercer parámetro es una matriz $ options.

db_select ($ tabla, $ alias = NULL, arreglo $ opciones = arreglo ())

La pista está en el mensaje de error:

Error fatal recuperable: el argumento 3 pasado a db_select () debe ser una matriz, una cadena dada, llamada en my.page.inc

El código pasa la cadena uid como tercer parámetro.

2
Camsoft