0

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: screenshot

0

This sounds like a known bug in core:

Pager, tablesort links in a form point to system/ajax when reloaded via AJAX

https://www.drupal.org/node/1181370

Someone has offered up a "quick fix" in comment #22:

As a quick fix I overrode theme_pager_link() to set the url of my AJAX-loaded pager to the page url instead of $_GET['q'] (which was system/ajax).

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.