For a statistics page I let users select the right file in a select list. After that I generate a table with stats. This table also has a pager (that worked without the ajax part).
Now I did everything in an ajax callback, when I now want to click on next page the URL is: http://localhost/drupal2/system/ajax?page=1 and that doesn’t work ofcourse.
My code:
function push_notifications_theme() { return array( 'push_notifications_form_table' => array( 'render element' => 'form', ), ); } function push_notifications_form_table_form($form = array(), &$form_state) { $form = array(); // $id = $_GET['id']; $qry = db_select('push_notifications_api', 'pt'); $qry->distinct(); $qry->fields('pt', array('app_name')); $qry->orderBy('app_name', 'ASC'); $names = $qry->execute(); foreach($names as $record) { $options[$record->app_name] = $record->app_name; } $form['title'] = array( '#type' => 'fieldset', '#title' => t('Application statistics'), '#description' => t('Select an application below to see the statistics.'), '#tree' => TRUE, ); $form['title']['changethis'] = array( '#title' => t('Application Name'), '#type' => 'select', '#options' => $options, '#required' => TRUE, '#ajax' => array( 'callback' => 'push_notifications_form_table_form_callback', 'wrapper' => 'replace_textfield_div', ), ); $form['replace_textfield'] = array( '#prefix' => '<div id="replace_textfield_div">', '#suffix' => '</div>', ); if(!empty($form_state['values']['title']['changethis'])) { $appname = $form_state['values']['title']['changethis']; $id = db_query('SELECT app_id FROM push_notifications_api WHERE app_name = :app_name', array(':app_name' => $appname))->fetchField(); $form['replace_textfield']['id'] = array( '#type' => 'fieldset', '#title' => t('@appname: Push notifications', array('@appname' => $appname)), '#description' => t('Newest push notifications are on top.'), '#weight' => 10, ); $go_back_link = array( '!link' => l(t('go back to the overview'), 'http://localhost/drupal2/admin/config/services/push_notifications'), ); $form['replace_textfield']['goback'] = array( '#type' => 'fieldset', '#title' => t('Go back'), '#description' => t('If you want to view stats from other application you can !link', $go_back_link), '#weight' => 25, ); // $query = db_query('SELECT * FROM push_notifications_messages WHERE msg_appID = :app_id ORDER BY msg_timestamp DESC', array(':app_id' => $id)); // $qCount = db_query('SELECT * FROM push_notifications_messages WHERE msg_appID = :app_id', array(':app_id' => $id))->rowCount(); $query = db_select("push_notifications_messages", "n"); $query->fields("n", array('msg_id', 'msg_message', 'msg_receiver', 'msg_device', 'msg_appID', 'msg_timestamp')); $query->orderBy('msg_timestamp', 'DESC'); $query->condition('msg_appID', $id); $query = $query->extend('TableSort')->extend('PagerDefault')->limit(15); $result1 = $query->execute(); $form['replace_textfield']['table'] = array( '#theme' => 'table', '#header' => array(t('Message'), t('Device'), t('Token'), t('Date')), 'rows' => array(), '#weight' => 15, ); foreach($result1 as $key => $result) { $form['replace_textfield']['table']["#rows"]["'r$key'"] = array( 'c1' => array( 'data' => array('#type' => 'item', '#markup' => t('@message', array('@message' => $result->msg_message))), ), 'c2' => array( 'data' => array('#type' => 'item', '#markup' => t('@device', array('@device' => $result->msg_device))), ), 'c3' => array( 'data' => array('#type' => 'item', '#markup' => t('@token', array('@token' => substr($result->msg_receiver, -50)))), ), 'c4' => array( 'data' => array('#type' => 'item', '#markup' => t('@timestamp', array('@timestamp' => date("d F Y H:i:s", $result->msg_timestamp)))), ), ); } $form['replace_textfield']['pager'] = array('#markup' => theme('pager'), '#weight' => 20); } return $form; } function push_notifications_form_table_form_callback($form, $form_state) { // The form has already been submitted and updated. We can return the replaced // item as it is. return $form['replace_textfield']; } function theme_push_notifications_form_table(&$variables) { // Get the userful values. $form = $variables['form']; $rows = $form['rows']; $header = $form['#header']; // Setup the structure to be rendered and returned. $content = array( '#theme' => 'table', '#header' => $header, '#rows' => array(), ); // Traverse each row. @see element_chidren(). foreach (element_children($rows) as $row_index) { $row = array(); // Traverse each column in the row. @see element_children(). foreach (element_children($rows[$row_index]) as $col_index) { // Render the column form element. $row[] = drupal_render($rows[$row_index][$col_index]); } // Add the row to the table. $content['#rows'][] = $row; } // Redner the table and return. return drupal_render($content); }
Screenshot of result: