'Periodical issue information', 'page callback' => 'ding_periodical_issues_ajax', 'page arguments' => array(2), 'access arguments' => array('access content'), 'type' => MENU_CALLBACK, ); return $items; } /** * Callback function that load holdings information for a periodical. * * The information returned is a HTML table JSON encoded. * * @param string $ding_entity_id * Ding entity id for the periodical. */ function ding_periodical_issues_ajax($ding_entity_id) { $output = array(); // Load the entity for the periodical. $entity = ding_entity_load($ding_entity_id); // Get availability. $availability = ding_provider_invoke('availability', 'holdings', array($entity->provider_id)); if (!empty($availability[$entity->provider_id]['issues'])) { $issues = $availability[$entity->provider_id]['issues']; krsort($issues); if ($issues) { $output = array( '#theme' => 'ding_periodical_issues', '#entity' => $entity, '#issues' => $issues, '#availability' => $availability, ); } } // Render the output to HTML an return it. drupal_json_output(array( 'html' => empty($output) ? '' : render($output), )); } /** * Implements hook_theme(). */ function ding_periodical_theme() { return array( 'ding_periodical_issues' => array( 'variables' => array( 'entity' => NULL, 'issues' => array(), 'availability' => array(), ), ), 'ding_periodical_issues_ajax' => array( 'variables' => array( 'ding_entity_id' => NULL, ), 'template' => 'ding-periodical-issues', ), ); } /** * Implements theme_ding_periodical_issues(). * * Create list of periodical issues order by year. */ function theme_ding_periodical_issues($variables) { $items = array(); foreach ($variables['issues'] as $volume => $issues) { $iss = array(); $i = 0; foreach ($issues as $key => $availability) { $issue = $key; $issue_id = $availability['local_id']; $normalized_id = md5($issue_id); // Build table with holding information for the current volume. $holding_data = ding_periodical_build_table($availability); // Check if the volume is reservable and add reservation button. if (!empty($issue_id) && ding_periodical_is_reservable($issues[$key])) { $item_id = array($issue_id, $volume, $key); $item_id = array_map('base64_encode', $item_id); $button = array( array( '#theme' => 'link', '#text' => t('Reserve'), '#path' => 'ting/object/' . $variables['entity']->id . '/reserve/' . implode('/', $item_id), '#options' => array( 'attributes' => array( 'class' => array( 'action-button', 'reserve-button', 'reservable', 'available', 'use-ajax', ), 'id' => 'reservation-' . $issue_id, ), 'html' => FALSE, ), ), ); // @todo This should first be render in the template layer. $holding_data .= drupal_render($button); } $holdings = array( array( 'data' => '