Skip to content

Instantly share code, notes, and snippets.

@thijsvdanker
Last active December 28, 2015 00:29
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save thijsvdanker/7413387 to your computer and use it in GitHub Desktop.
Save thijsvdanker/7413387 to your computer and use it in GitHub Desktop.
Use month names as calendar pager for Drupal 7.
<?php
/**
* @file
* Template file for the example display.
*
* Variables available:
*
* $plugin: The pager plugin object. This contains the view.
*
* $plugin->view
* The view object for this navigation.
*
* $nav_title
* The formatted title for this view. In the case of block
* views, it will be a link to the full view, otherwise it will
* be the formatted name of the year, month, day, or week.
*
* $prev_url
* $next_url
* Urls for the previous and next calendar pages. The links are
* composed in the template to make it easier to change the text,
* add images, etc.
*
* $prev_options
* $next_options
* Query strings and other options for the links that need to
* be used in the l() function, including rel=nofollow.
*/
?>
<?php if (!empty($cur_month)): ?>
<h1 class="current-month"><?php print ($cur_month); ?></h1>
<?php endif; ?>
<?php if (!empty($pager_prefix)) print $pager_prefix; ?>
<div class="date-nav-wrapper clearfix<?php if (!empty($extra_classes)) print $extra_classes; ?>">
<div class="date-nav item-list">
<ul class="pager">
<?php if (!empty($prev_url)) : ?>
<li class="date-prev">
<?php print l('&laquo;' . ($mini ? '' : ' ' . t($prev_title, array(), array('context' => 'date_nav'))), $prev_url, $prev_options); ?>
&nbsp;</li>
<?php endif; ?>
<?php if (!empty($next_url)) : ?>
<li class="date-next">&nbsp;
<?php print l(($mini ? '' : t($next_title, array(), array('context' => 'date_nav')) . ' ') . '&raquo;', $next_url, $next_options); ?>
</li>
<?php else:?>
<li class="date-pager-spacer">&nbsp;
</li>
<?php endif; ?>
</ul>
</div>
</div>
.view .date-nav-wrapper .date-prev, .view .date-nav-wrapper .date-next {
position:relative;
right:auto;
left:auto;
}
.view .date-nav-wrapper .pager {
float:right;
}
<?php
/**
* Preprocess function for Date pager template.
*/
function MYTHEME_preprocess_date_views_pager(&$vars) {
ctools_add_css('date_views', 'date_views');
$plugin = $vars['plugin'];
$input = $vars['input'];
$view = $plugin->view;
$vars['nav_title'] = '';
$vars['next_url'] = '';
$vars['prev_url'] = '';
if (empty($view->date_info) || empty($view->date_info->min_date)) {
return;
}
$date_info = $view->date_info;
// Make sure we have some sort of granularity.
$granularity = !empty($date_info->granularity) ? $date_info->granularity : 'month';
$pos = $date_info->date_arg_pos;
if (!empty($input)) {
$id = $plugin->options['date_id'];
if (array_key_exists($id, $input) && !empty($input[$id])) {
$view->args[$pos] = $input[$id];
}
}
$next_args = $view->args;
$prev_args = $view->args;
$min_date = $date_info->min_date;
$max_date = $date_info->max_date;
// Set up the pager link format. Setting the block identifier
// will force pager style links.
if ((isset($date_info->date_pager_format) && $date_info->date_pager_format != 'clean') || !empty($date_info->mini)) {
if (empty($date_info->block_identifier)) {
$date_info->block_identifier = $date_info->pager_id;
}
}
if (empty($date_info->hide_nav)) {
$prev_date = clone($min_date);
date_modify($prev_date, '-1 ' . $granularity);
$next_date = clone($min_date);
date_modify($next_date, '+1 ' . $granularity);
$format = array('year' => 'Y', 'month' => 'Y-m', 'day' => 'Y-m-d');
switch ($granularity) {
case 'week':
$next_week = date_week(date_format($next_date, 'Y-m-d'));
$prev_week = date_week(date_format($prev_date, 'Y-m-d'));
$next_arg = date_format($next_date, 'Y-\W') . date_pad($next_week);
$prev_arg = date_format($prev_date, 'Y-\W') . date_pad($prev_week);
break;
default:
$next_arg = date_format($next_date, $format[$granularity]);
$prev_arg = date_format($prev_date, $format[$granularity]);
}
$next_path = str_replace($date_info->date_arg, $next_arg, $date_info->url);
$prev_path = str_replace($date_info->date_arg, $prev_arg, $date_info->url);
$next_args[$pos] = $next_arg;
$prev_args[$pos] = $prev_arg;
$vars['next_url'] = date_pager_url($view, NULL, $next_arg);
$vars['prev_url'] = date_pager_url($view, NULL, $prev_arg);
$vars['next_options'] = $vars['prev_options'] = array();
}
else {
$next_path = '';
$prev_path = '';
$vars['next_url'] = '';
$vars['prev_url'] = '';
$vars['next_options'] = $vars['prev_options'] = array();
}
// Check whether navigation links would point to
// a date outside the allowed range.
if (!empty($next_date) && !empty($vars['next_url']) && date_format($next_date, 'Y') > $date_info->limit[1]) {
$vars['next_url'] = '';
}
if (!empty($prev_date) && !empty($vars['prev_url']) && date_format($prev_date, 'Y') < $date_info->limit[0]) {
$vars['prev_url'] = '';
}
$vars['prev_options'] += array('attributes' => array());
$vars['next_options'] += array('attributes' => array());
$prev_title = '';
$next_title = '';
// Build next/prev link titles.
switch ($granularity) {
case 'year':
$prev_title = t('Navigate to previous year');
$next_title = t('Navigate to next year');
break;
case 'month':
$prev_title = t('Navigate to previous month');
$next_title = t('Navigate to next month');
break;
case 'week':
$prev_title = t('Navigate to previous week');
$next_title = t('Navigate to next week');
break;
case 'day':
$prev_title = t('Navigate to previous day');
$next_title = t('Navigate to next day');
break;
}
$vars['prev_options']['attributes'] += array('title' => $prev_title);
$vars['next_options']['attributes'] += array('title' => $next_title);
// Add nofollow for next/prev links.
$vars['prev_options']['attributes'] += array('rel' => 'nofollow');
$vars['next_options']['attributes'] += array('rel' => 'nofollow');
// Need this so we can use '&laquo;' or images in the links.
$vars['prev_options'] += array('html' => TRUE);
$vars['next_options'] += array('html' => TRUE);
$link = FALSE;
// Month navigation titles are used as links in the block view.
if (!empty($date_info->mini) && $granularity == 'month') {
$link = TRUE;
}
$params = array(
'granularity' => $granularity,
'view' => $view,
'link' => $link,
);
$nav_title = theme('date_nav_title', $params);
$vars['nav_title'] = $nav_title;
$vars['mini'] = !empty($date_info->mini);
// Get the date information from the view.
$date_info = $view->date_info;
// Choose the dislpay format of the month name.
$format = 'F';
// Get the previous month.
$dateString = $date_info->min_date;
$prev_month = new DateTime($dateString);
$prev_month->modify('-1 month');
$prev_pager_title = format_date($prev_month->getTimestamp(), 'custom', $format);
$vars['prev_title'] = $prev_pager_title;
// Get the next month.
$next_month = new DateTime($dateString);
$next_month->modify('+1 month');
$next_pager_title = format_date($next_month->getTimestamp(), 'custom', $format);
$vars['next_title'] = $next_pager_title;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment