Использование модуля jQuery Datatables для Drupal 7

Я новичок в Drupal и понял, как сделать свои основные блоки и меню более удобными. Также я немного изучил jQuery (и это здорово).

Я пытаюсь интегрировать разбитый на страницы список пользователей, который на данный момент является отдельным PHP-скриптом, в мой новый сайт Drupal 7:

введите здесь описание изображения

Я пытаюсь реализовать его как меню Drupal, чтобы я мог называть его как http://preferans.de/top (чтобы смещение нулевой страницы было равно 0) и http://preferans.de/top/100 (для отображения списка пользователей, начиная со 100-го пользователя):

function pref_menu() {
  $items['top'] = array(
    'title' => 'Weekly player rating',
    'description' => 'Weekly player rating',
    'page callback' => 'pref_top_callback',
    'access callback' => TRUE,
    'file' => 'pref.top.inc',
    'file path' => drupal_get_path('module', 'pref'),
    'type' => MENU_CALLBACK,
  );

  return $items;
}

И мой очень простой файл pref.top.inc:

function pref_top_callback($offset = 0) {
  return array(
    'pref_players_table' => array(
      '#type' => 'markup',
      '#markup' => pref_players_table($offset),
    ),
  );
}

function pref_fetch_players($offset) {
  /* FETCH MAX 20 RECORDS INTO AN ARRAY */
  $players = array();
  $result = db_query("
select u.id,
        u.first_name,
        row_number() OVER (order by m.money desc) as pos,
        u.female,
        u.city,
        u.avatar,
        m.money,
        u.login > u.logout as online
from pref_users u, pref_money m where
        m.yw=to_char(current_timestamp, 'IYYY-IW') and
        u.id=m.id
order by m.money desc
limit 20 offset :offset
", array(':offset' => array($offset)),
  array('fetch' => PDO::FETCH_ASSOC)
  );
  $players = $result->fetchAll();

  /* PRINT THE ARRAY AS AN HMTL-TABLE */
  $table = '<table>';
  foreach ($players as $user) {
    $table .= '<tr>';
    $table .= sprintf('<td>%u</td>
<td><a href="/user.php?id=%s">%s</a></td>
<td>%s</td><td>%d $</td>',
      $user['pos'],
      $user['id'],
      $user['first_name'],
      $user['city'],
      $user['money']);
    $table .= '</tr>';
  }

  $table .= '</table>';
  return $table;
}

Это работает, я получаю страницу Drupal с таблицей HTML, содержащей до 20 строк:

введите здесь описание изображения

Но я понятия не имею, как использовать модуль Datatables Drupal. Я успешно загрузил и установил его и смотрю на его исходный код, но даже не знаю, с чего начать.

Пожалуйста, помогите мне, как я могу вызвать его из моей функции меню?

Спасибо! Алекс


person Alexander Farber    schedule 22.03.2011    source источник


Ответы (1)


Этот модуль представляет собой плагин Views, вам нужно будет открыть свою таблицу для Views, чтобы иметь возможность его использовать.

В зависимости от того, что вы хотите, вы также можете получить сортируемую многостраничную таблицу только с ядром Drupal, см. https://drupal.stackexchange.com/questions/364/how-do-you-make-sortable-таблицы-с-пейджером-с-данными-из-настраиваемой-таблицы/367#367 о том, как вам нужно построить свой запрос для этого.

Некоторые другие советы по вашему коду:

"$players = $result->fetchAll();" не является необходимым. Вы можете напрямую перебирать $result.

Кроме того, вы хотите использовать тему ('таблица'). Затем вам просто нужно это в вашем крючке foreach:

<?php
$rows = array();
$header = array(t('Position'), t('Id'), t('First name'), t('City'), t('Money'));
foreach ($result as $player) {
  $rows[] = array($player['pos'], $player['id'], $player['first_name'], $player['city'], $player['money']);
}
return theme('table', array('rows' => $rows, 'header' => $header));
?>

Кроме того, вам потребуется определить массив $header, описанный в theme_table() (см. поля и ключи сортировки в $header).

person Berdir    schedule 22.03.2011
comment
Извините, но я не понимаю вашего кода: вы заполняете массив $rows, но куда вы его передаете/возвращаете? А что такое $header, можно ли установить $header = array('pos', 'id', 'first_name', 'city', 'money'); ? - person Alexander Farber; 23.03.2011
comment
Я также пробовал: $header = array('pos', 'id', 'first_name', 'city', 'money'); $строки = массив(); foreach ($players as $player) { $rows[] = array($player['pos'], $player['id'], $player['first_name'], $player['city'], $player ['Деньги']); } вернуть тему('таблица', $header, $rows); но получаю белый экран без таблицы - person Alexander Farber; 23.03.2011
comment
Извините, у меня там опечатка. Очевидно, вам нужно передать $rows в «rows». Я исправил это, а также добавил пример для $header. Обратите внимание, что если вы хотите использовать TableSort, вам необходимо расширить $header, см. api.drupal.org/api/drupal/modules--dblog--dblog.admin.inc/ для примера. - person Berdir; 23.03.2011
comment
То, что у вас было во втором комментарии, - это версия D6, в D7 вы передаете массив аргументов как один аргумент теме, а не ряд аргументов. - person Berdir; 23.03.2011