datereminder_form.inc in Date Reminder 6
Same filename and directory in other branches
Support for forms displaying or entering reminders.
File
includes/datereminder_form.incView source
<?php
/**
* @file
* Support for forms displaying or entering reminders.
*/
/**
* Build the user reminder form.
*
* @param node $node
* The fully loaded node object.
* @param array $fieldset
* Boolean that indicates if the reminder form should be in a fieldset.
*/
function datereminder_form(&$form_state, $node, $fieldset = 'f') {
module_load_include('inc', 'datereminder', 'includes/defines');
global $user;
$form = array();
if (!_datereminder_has_future_dates($node)) {
// Already past last repeat. Don't present option.
$form[] = array(
'#type' => 'item',
'#value' => t("Sorry, can't set reminders for an event in the past."),
);
return $form;
}
$form['nid'] = array(
'#type' => 'value',
'#value' => $node->nid,
);
$form['uid'] = array(
'#type' => 'value',
'#value' => $user->uid,
);
if ($fieldset == 'f') {
$form['collapse'] = array(
'#type' => 'fieldset',
'#collapsible' => TRUE,
'#collapsed' => variable_get('datereminder_fieldset_collapsed', 1),
);
$form['collapse']['#title'] = t("Get reminder for '@title'", array(
'@title' => $node->title,
));
}
else {
$form['collapse'] = array();
}
$tbl = array();
$tbl['#table_name'] = 'datereminder';
$tbl['#table_cols'] = array(
array(
'lead',
t('Lead time'),
),
);
$doemail = FALSE;
if (user_access(DATEREMINDER_OTHER_EMAIL)) {
$tbl['#table_cols'][] = array(
'email',
t('Email Addresses (leave empty to use your default)'),
);
$doemail = TRUE;
}
$reminders = _datereminder_get_node_user_reminders($node);
$rows = array();
foreach ($reminders as $r) {
$rid = $r->rid;
$rows[] = $rid;
$tbl["datereminder_lead_{$rid}"] = _datereminder_leadtime_form($r->leadtime);
if ($doemail) {
$tbl["datereminder_email_{$rid}"] = array(
'#type' => 'textfield',
'#size' => 72,
'#maxlength' => 512,
'#default_value' => $r->email,
);
}
}
// How many should we allow user to add at a time?
$maxrem = variable_get('datereminder_max_reminders', DATEREMINDER_MAX_REMINDERS);
$minadd = variable_get('datereminder_min_add', 1);
$toadd = $maxrem - count($reminders);
if ($toadd > $minadd) {
$toadd = $minadd;
}
while ($toadd > 0) {
$rows[] = "n{$toadd}";
$tbl["datereminder_lead_n{$toadd}"] = _datereminder_leadtime_form(0);
if ($doemail) {
$tbl["datereminder_email_n{$toadd}"] = array(
'#type' => 'textfield',
'#size' => 72,
'#maxlength' => 512,
);
}
$toadd -= 1;
}
$tbl['#table_rows'] = $rows;
$tbl['rids'] = array(
'#type' => 'value',
'#value' => implode(',', $rows),
);
$tbl['#theme'] = 'datereminder_table';
$form['collapse']['datereminder'] = $tbl;
$form['collapse']['send-now'] = array(
'#type' => 'checkbox',
'#title' => t('Send test email'),
'#description' => t('Check to send example email now'),
'#default_value' => FALSE,
);
$form['collapse']['submit'] = array(
'#type' => 'submit',
'#value' => t('Set reminder'),
'#submit' => array(
'_datereminder_form_submit_user',
),
);
$form['#validate'][] = '_datereminder_form_validate_user';
return $form;
}
/**
* Generates a form element to select a valid leadtime.
*/
function _datereminder_leadtime_form($default) {
if ($default == 0) {
$menu_values[0] = t('Add reminder');
}
else {
$menu_values[0] = t('Delete reminder');
}
$menu_values += _datereminder_leadtime_list();
return array(
'#type' => 'select',
'#default_value' => $default,
'#options' => $menu_values,
);
}
/**
* Generates list of leadtime options.
*/
function _datereminder_leadtime_list() {
$leads = variable_get('datereminder_leadtime_list', '');
// Need to make default?
if ($leads == '') {
return _datereminder_default_leadtime_list();
}
$intervals = explode(',', $leads);
$opts = drupal_map_assoc($intervals, 'format_interval');
return $opts;
}
/**
* Get default leadtime list.
*/
function _datereminder_default_leadtime_list() {
$hour = 60 * 60;
$day = $hour * 24;
$week = $hour * 7;
$intervals = array(
$hour,
$hour * 2,
$hour * 3,
$hour * 4,
$hour * 5,
$hour * 6,
$hour * 7,
$hour * 8,
$hour * 9,
$hour * 10,
$hour * 11,
$hour * 12,
$hour * 10,
$hour * 12,
$hour * 14,
$hour * 16,
$hour * 18,
$day * 1,
$day * 2,
$day * 3,
$day * 4,
$day * 5,
$day * 6,
);
return drupal_map_assoc($intervals, 'format_interval');
}
/**
* Build a form with a list of reminders.
*
* @param array $form_state
* Current state of the form
* @param object $arg
* Can be node or user object, depending on $content
* @param string $content
* Determines content of the list. Allowed values:
* 'all_node' -- Show all reminders for this node
* 'all_user' -- Show all reminders for a given user
* 'all' -- Show all reminders
* @param string $fieldset
* String that indicates if the reminder form should be in a fieldset.
*
* @todo This really ought to be combined with datereminder_form().
*/
function datereminder_form_summary(&$form_state, $arg, $content = 'all_node', $fieldset = 'f') {
global $user;
$form = array();
$douser = FALSE;
$donode = FALSE;
$allow_del = user_access(DATEREMINDER_ADMINISTER_REMINDERS);
$sel = array();
switch ($content) {
case 'all_node':
$douser = TRUE;
$ttl = t("All reminders for '@title'", array(
'@title' => check_plain($arg->title),
));
$sel['nid'] = $arg->nid;
break;
case 'all':
$douser = $donode = TRUE;
$ttl = t('All reminders');
break;
case 'all_user':
$donode = TRUE;
$ttl = t('All of your reminders');
$sel['uid'] = $arg->uid;
if ($user->uid == $arg->uid) {
$allow_del = TRUE;
}
break;
default:
return $form;
}
$all = _datereminder_load_reminders($sel, NULL, 'next');
$reminders = array();
foreach ($all as $rid => $rem) {
$reminders[$rem->rid] = '';
if ($douser) {
$u = $rem->name;
if (user_access('access user profiles')) {
$u = l($u, 'user/' . $rem->uid . '/datereminder');
}
$form['user'][$rem->rid] = array(
'#value' => $u,
);
}
if ($rem->email != '' && ($allow_del || $rem->uid == $user->uid)) {
$emails[$rem->rid] = array(
'#value' => str_replace(',', '</br>', check_plain($rem->email)),
);
}
if ($donode) {
$form['title'][$rem->rid] = array(
'#value' => l($rem->title, 'node/' . $rem->nid),
);
}
// Get reminder leadtimes
// Note: Can simplify this now that there's one reminder
// per entry, not multiple.
$times = $menu_values = drupal_map_assoc(array(
$rem->leadtime,
), 'format_interval');
$stimes = implode('</br>', array_values($times));
$form['leads'][$rem->rid] = array(
'#value' => $stimes,
);
// Get time of next reminder in local tz.
$dobj = date_create($rem->next, timezone_open('UTC'));
date_timezone_set($dobj, timezone_open(date_default_timezone_name(FALSE)));
if ($rem->expired) {
$n = array(
'#value' => t('Expired'),
);
}
else {
$n = array(
'#value' => date_format_date($dobj, 'short'),
);
}
$form['next'][$rem->rid] = $n;
}
if (isset($emails)) {
$form['email'] = $emails;
}
if ($allow_del) {
$form['reminders'] = array(
'#type' => 'checkboxes',
'#options' => $reminders,
);
if (!empty($reminders)) {
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Delete selected reminders'),
'#submit' => array(
'_datereminder_admin_delete_set',
),
);
}
}
$form['#theme'] = 'datereminder_manage_reminders';
return $form;
}
/**
* Theme a table of reminders.
*
* @param array $form
* Form to be themed
*
* @return string
* The rendered table
*/
function theme_datereminder_manage_reminders($form) {
$has_reminders = isset($form['next']) && is_array($form['next']);
if ($has_reminders) {
$select_header = theme('table_select_header_cell');
$douser = $doemail = $dotitle = FALSE;
$header = array(
$select_header,
);
$cols = 2;
if (!empty($form['user'])) {
$header[] = t('User');
++$cols;
$douser = TRUE;
}
if (!empty($form['email'])) {
$header[] = t('Email');
++$cols;
$doemail = TRUE;
}
if (!empty($form['title'])) {
$header[] = t('Event');
++$cols;
$dotitle = TRUE;
}
$header[] = t('Lead time');
$header[] = t('Next Remind At');
$output = '';
foreach (element_children($form['next']) as $rid) {
$row = array();
$f = $form['reminders'][$rid];
$row[] = drupal_render($form['reminders'][$rid]);
if ($douser) {
$f = $form['user'][$rid];
$row[] = drupal_render($form['user'][$rid]);
}
if ($doemail) {
$f = $form['email'][$rid];
$row[] = drupal_render($form['email'][$rid]);
}
if ($dotitle) {
$f = $form['title'][$rid];
$row[] = drupal_render($form['title'][$rid]);
}
$f = $form['leads'][$rid];
$row[] = drupal_render($form['leads'][$rid]);
$f = $form['next'][$rid];
$row[] = drupal_render($form['next'][$rid]);
$rows[] = $row;
}
}
else {
$rows[] = array(
array(
'data' => t('No reminders pending'),
'colspan' => $cols,
),
);
}
$output .= theme('table', $header, $rows);
$output .= drupal_render($form);
return $output;
}
/**
* Theme function to render a datereminder table.
*
* @param array $form
* Form to be rendered
*
* @return array
* The rendered table
*/
function theme_datereminder_table($form) {
$output = '';
$header = array();
$rows = array();
$doselect = FALSE;
if ($form['#table_select']) {
$doselect = TRUE;
$header[] = theme('table_select_header_cell');
}
foreach ($form['#table_cols'] as $c) {
if ($c[0] == 'select') {
$header[] = theme('table_select_header_cell');
}
else {
$header[] = $c[1];
}
}
$tbl = $form['#table_name'];
foreach ($form['#table_rows'] as $rtag) {
$row = array();
foreach ($form['#table_cols'] as $c) {
$ctag = $c[0];
$row[] = drupal_render($form["{$tbl}_{$ctag}_{$rtag}"]);
}
$rows[] = $row;
}
$output .= theme('table', $header, $rows);
$output .= drupal_render($form);
return $output;
}
/**
* Check if this node has reminders enabled, and there are any
* occurrances of the field in the future.
*
* @param node $node
* The node to query
*/
function _datereminder_has_future_dates($node) {
module_load_include('inc', 'datereminder', 'includes/date');
$type = $node->type;
$dfname = variable_get("datereminder_datefield_{$type}", '');
if ($dfname != '') {
$dfcontent = $node->{$dfname};
return _datereminder_get_next_occurance($dfcontent, 0) != NULL;
}
return FALSE;
}
Functions
Name![]() |
Description |
---|---|
datereminder_form | Build the user reminder form. |
datereminder_form_summary | Build a form with a list of reminders. |
theme_datereminder_manage_reminders | Theme a table of reminders. |
theme_datereminder_table | Theme function to render a datereminder table. |
_datereminder_default_leadtime_list | Get default leadtime list. |
_datereminder_has_future_dates | Check if this node has reminders enabled, and there are any occurrances of the field in the future. |
_datereminder_leadtime_form | Generates a form element to select a valid leadtime. |
_datereminder_leadtime_list | Generates list of leadtime options. |