Index: availability_calendars.css =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/availability_calendars/availability_calendars.css,v retrieving revision 1.1 diff -u -p -r1.1 availability_calendars.css --- availability_calendars.css 26 Aug 2008 20:41:14 -0000 1.1 +++ availability_calendars.css 4 Oct 2008 20:26:32 -0000 @@ -1,8 +1,9 @@ table.cal { width: 100px; display: inline; + display: inline-table; /* for Safari */ font-size: 80%; - padding: 6px; + margin: 6px; } .calmonth { Index: availability_calendars.info =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/availability_calendars/availability_calendars.info,v retrieving revision 1.1 diff -u -p -r1.1 availability_calendars.info --- availability_calendars.info 26 Aug 2008 20:41:14 -0000 1.1 +++ availability_calendars.info 27 Sep 2008 11:57:09 -0000 @@ -1,3 +1,4 @@ ; $Id: availability_calendars.info,v 1.1 2008/08/26 20:41:14 geodan Exp $ name = Availability Calendars -description = Allows for availability information to be displayed using calendars on specified content types. \ No newline at end of file +description = Allows for availability information to be displayed using calendars on specified content types. +core = 6.x Index: availability_calendars.install =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/availability_calendars/availability_calendars.install,v retrieving revision 1.1 diff -u -p -r1.1 availability_calendars.install --- availability_calendars.install 26 Aug 2008 20:41:14 -0000 1.1 +++ availability_calendars.install 4 Oct 2008 20:22:53 -0000 @@ -1,48 +1,104 @@ */ /** + * Implementation of hook_schema(). + */ +function availability_calendars_schema() { + + $schema = array(); + $schema['availability_calendars_day'] = array( + 'description' => t('The table for calendar days.'), + 'fields' => array( + 'nid' => array( + 'description' => t('The primary identifier for a node.'), + 'type' => 'int', + 'unsigned' => TRUE, + 'not null' => TRUE + ), + 'year' => array( + 'description' => t('The number of the year.'), + 'type' => 'int', + 'unsigned' => TRUE, + 'not null' => TRUE + ), + 'month' => array( + 'description' => t('The number of the month.'), + 'type' => 'int', + 'unsigned' => TRUE, + 'not null' => TRUE + ), + 'day' => array( + 'description' => t('The number of the day.'), + 'type' => 'int', + 'unsigned' => TRUE, + 'not null' => TRUE + ), + 'status' => array( + 'description' => t('The status.'), + 'type' => 'int', + 'unsigned' => TRUE + ) + ) + ); + + $schema['availability_calendars_week'] = array( + 'description' => t('The table for calendar days.'), + 'fields' => array( + 'nid' => array( + 'description' => t('The primary identifier for a node.'), + 'type' => 'int', + 'unsigned' => TRUE, + 'not null' => TRUE + ), + 'year' => array( + 'description' => t('The number of the year.'), + 'type' => 'int', + 'unsigned' => TRUE, + 'not null' => TRUE + ), + 'month' => array( + 'description' => t('The number of the month.'), + 'type' => 'int', + 'unsigned' => TRUE, + 'not null' => TRUE + ), + 'week' => array( + 'description' => t('The number of the week.'), + 'type' => 'int', + 'unsigned' => TRUE, + 'not null' => TRUE + ), + 'note' => array( + 'description' => t('The status.'), + 'type' => 'varchar', + 'length' => 64 + ) + ) + ); + return $schema; + +} +/** * Implementation of hook_install(). */ -function availability_calendars_install(){ - switch ($GLOBALS['db_type']) { - case 'mysqli': - case 'mysql': - db_query(" - CREATE TABLE {availability_calendars_day} ( - nid int unsigned NOT NULL, - year int unsigned NOT NULL, - month int unsigned NOT NULL, - day int unsigned NOT NULL, - status int unsigned - ) /*!40100 DEFAULT CHARACTER SET utf8 */ - "); - db_query(" - CREATE TABLE {availability_calendars_week} ( - nid int unsigned NOT NULL, - year int unsigned NOT NULL, - month int unsigned NOT NULL, - week int unsigned NOT NULL, - note varchar(64) - ) /*!40100 DEFAULT CHARACTER SET utf8 */ - "); - break; - case 'pgsql': - drupal_set_message(t('Sorry, there is no pgsql support at present.')); - break; - } +function availability_calendars_install() { + drupal_install_schema('availability_calendars'); + drupal_set_message(t('Availability Calendars module installed successfully.'), 'warning'); } /** * Implementation of hook_uninstall(). */ function availability_calendars_uninstall() { - db_query('DROP TABLE {availability_calendars_day}'); - db_query('DROP TABLE {availability_calendars_week}'); + drupal_uninstall_schema('availability_calendars'); variable_del('availability_calendars_display_nodeview'); foreach (node_get_types() as $type => $name) { @@ -50,4 +106,4 @@ function availability_calendars_uninstal } drupal_set_message(t('Availability Calendars module uninstalled successfully.'), 'warning'); -} \ No newline at end of file +} Index: availability_calendars.module =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/availability_calendars/availability_calendars.module,v retrieving revision 1.2 diff -u -p -r1.2 availability_calendars.module --- availability_calendars.module 30 Aug 2008 10:56:26 -0000 1.2 +++ availability_calendars.module 4 Oct 2008 20:36:28 -0000 @@ -10,35 +10,40 @@ */ /** - * Implementation of hook_menu() + * A callback function to see if allowed to edit the calendar. */ -function availability_calendars_menu($may_cache) { +function availability_can_edit() { + + return user_access('edit availability calendars') || user_access('edit own availability calendars'); + +} + +/** + * Implementation of hook_menu(). + */ +function availability_calendars_menu() { $items = array(); - if($may_cache) { - $items[] = array( - 'path' => 'admin/settings/availability-calendars', - 'title' => t('Availability Calendars'), - 'description' => t('Configure global settings for availability calendars module.'), - 'callback' => 'drupal_get_form', - 'callback arguments' => array('availability_calendars_admin_settings') - ); - } - else { - $items[] = array( - 'path' => 'availability-calendars', - 'title' => t('Availability calendar'), - 'callback' => 'availability_calendars_page', - 'access' => user_access('edit availability calendars') || user_access('edit own availability calendars'), - 'type' => MENU_CALLBACK - ); - } + $items['admin/settings/availability-calendars'] = array( + 'title' => 'Availability Calendars', + 'description' => 'Configure global settings for availability calendars module.', + 'page callback' => 'drupal_get_form', + 'page arguments' => array('availability_calendars_admin_settings'), + 'access arguments' => array('edit availability calendars') + ); + + $items['availability-calendars'] = array( + 'title' => 'Availability calendar', + 'page callback' => 'availability_calendars_page', + 'access callback' => 'availability_can_edit', + 'type' => MENU_CALLBACK, + ); return $items; } /** - * Implementation of hook_perm() + * Implementation of hook_perm(). */ function availability_calendars_perm() { return array('edit own availability calendars', 'edit availability calendars'); @@ -63,11 +68,12 @@ function availability_calendars_admin_se $form['display']['availability_calendars_display_monthcount'] = array( '#type' => 'textfield', '#title' => t('Number of months to display'), - '#default_value' => variable_get('availability_calendars_display_monthcount', 12) + '#default_value' => variable_get('availability_calendars_display_monthcount', 12), + '#description' => t("Your calendars will show this number of months to all users except those with the 'edit own availability calendars' or 'edit availability calendars' who will always see 3 extra months on the calendars they can edit. This is to allow them to enter information into future calendars before it is made publicly available.") ); - + //TODO: add status codes and css classes in here - + return system_settings_form($form); } @@ -75,7 +81,7 @@ function availability_calendars_admin_se * Create tab to show node availability */ function availability_calendars_menu_callback() { - $node = node_load(arg(1)); + $node = menu_get_object(); if (availability_calendars_enabled($node->type)) { return theme('availability_calendars_node', $node); @@ -92,7 +98,7 @@ function availability_calendars_page($ni if (is_numeric($nid)) { $node = node_load($nid); drupal_set_title(t('Availability for %name', array('%name' => $node->title))); - + if (is_numeric($year) && is_numeric($month)) { drupal_set_title(t('Availability for %name in %date', array('%name' => $node->title, '%date' => format_date(strtotime("$year-$month-01 12:00"), 'custom', 'M Y')))); if ($edit == 'edit') { @@ -125,7 +131,7 @@ function availability_calendars_page($ni } function availability_calendars_node_edit() { - return drupal_get_form('availability_calendars_node_edit_form'); + return drupal_get_form('availability_calendars_node_edit_form'); } function availability_calendars_node_edit_form() { @@ -144,10 +150,10 @@ function availability_calendars_node_edi '#type' => 'hidden', '#default_value' => $month, ); - + $startofweek = variable_get('availability_calendars_'. $nid .'_startofweek', 1); $month_meta = availability_calendars_month_meta($year, $month, $startofweek); - + // find all entries in database for this month ($availability, $notes) and pre-populate $notes_result = db_query('SELECT week, note FROM {availability_calendars_week} WHERE nid = %d AND year = %d and month = %d', $nid, $year, $month); while ($note = db_fetch_array($notes_result)) { @@ -158,7 +164,7 @@ function availability_calendars_node_edi while ($status = db_fetch_array($status_result)) { $day_status[$status['day']] = $status['status']; } - + $day = 1; for ($week = 1; $week <= $month_meta['weeksinmonth']; $week++) { $form['week-'. $week] = array( @@ -183,7 +189,7 @@ function availability_calendars_node_edi '#title' => t("@date", array('@date' => format_date(strtotime("$year-$month-$day 12:00"), 'custom', 'l d F'))), '#options' => availability_calendars_options(), '#default_value' => $day_status[$day] - ); + ); $day++; $daysinweekremaining--; } @@ -194,85 +200,102 @@ function availability_calendars_node_edi '#value' => t('Submit'), ); - return $form; + return $form; } -function availability_calendars_node_edit_form_submit($form_id, $form_values) { - $nid = check_plain($form_values['nid']); - $year = check_plain($form_values['year']); - $month = check_plain($form_values['month']); - +function availability_calendars_node_edit_form_submit($form, &$form_state) { + $nid = check_plain($form_state['values']['nid']); + $year = check_plain($form_state['values']['year']); + $month = check_plain($form_state['values']['month']); + // save weekly notes $week = 1; $nomoreweeks = FALSE; while (!$nomoreweeks) { - if (isset($form_values['note-'. $week])) { - $notes[$week] = check_plain($form_values['note-'. $week]); + if (isset($form_state['values']['note-'. $week])) { + $notes[$week] = check_plain($form_state['values']['note-'. $week]); $week++; } else { $nomoreweeks = TRUE; } } - + // save $days $day = 1; $nomoredays = FALSE; while (!$nomoredays) { - if (isset($form_values['day-'. $day])) { - $days[$day] = $form_values['day-'. $day]; + if (isset($form_state['values']['day-'. $day])) { + $days[$day] = $form_state['values']['day-'. $day]; $day++; } else { $nomoredays = TRUE; } } - + db_query('DELETE FROM {availability_calendars_week} WHERE nid = %d AND year = %d AND month = %d', $nid, $year, $month); foreach ($notes as $week => $note) { db_query('INSERT INTO {availability_calendars_week} (nid, year, month, week, note) VALUES (%d, %d, %d, %d, "%s")', $nid, $year, $month, $week, $note); } - + db_query('DELETE FROM {availability_calendars_day} WHERE nid = %d AND year = %d AND month = %d', $nid, $year, $month); foreach ($days as $day => $status) { db_query('INSERT INTO {availability_calendars_day} (nid, year, month, day, status) VALUES (%d, %d, %d, %d, %d)', $nid, $year, $month, $day, $status); } - + drupal_set_message('Availability information saved.'); } /** + * Implementation of hook_theme(). + */ +function availability_calendars_theme() { + + return array('availability_calendars_node' => array( + 'arguments' => array('node' => NULL, 'year' => 2008, 'month' => 01, 'monthstodisplay' => 12) + ), + 'availability_calendars_month' => array( + 'arguments' => array('node' => NULL, 'year' => 2008, 'month' => 01, 'startofweek' => NULL, 'booked' => NULL) + ) + ); + +} +//function theme_availability_calendars_month($node, $year, $month, $startofweek, $booked) { + +/** * Themed output to display a lits of node dates. * * @param $node * @return HTML output. */ function theme_availability_calendars_node($node, $year = 2008, $month = 01, $monthstodisplay = 12) { - drupal_add_css(drupal_get_path('module', 'availability_calendars') . '/availability_calendars.css'); + + drupal_add_css(drupal_get_path('module', 'availability_calendars') .'/availability_calendars.css'); $rows = array(); - + // Fill availability array /* foreach ($node->availability_dates as $k => $v) { foreach ($v as $i) { $booked[date("Y", $i['date'])][date("m", $i['date'])][date("d", $i['date'])] = 1; } } */ - - - // Calendar code based on example at http://evolt.org/node/60673 : + + + // Calendar code based on example at http://evolt.org/node/60673 : $day = 1; $startofweek = variable_get('availability_calendars_'. $node->nid .'_startofweek', 1); - $monthsremaining = $monthstodisplay; + $monthsremaining = $monthstodisplay; while ($monthsremaining > 0) { $output .= theme('availability_calendars_month', $node, $year, $month, $startofweek, $booked); - $monthsremaining--; + $monthsremaining--; $month++; if ($month > 12) { $month = 1; - $year++; + $year++; } } @@ -281,57 +304,58 @@ function theme_availability_calendars_no $monthsremaining = 3; while ($monthsremaining > 0) { $output .= theme('availability_calendars_month', $node, $year, $month, $startofweek, $booked); - $monthsremaining--; + $monthsremaining--; $month++; if ($month > 12) { $month = 1; - $year++; + $year++; } - } + } } return $output; - + } function availability_calendars_month_meta($year, $month, $startofweek) { - $month_meta['daysinmonth'] = date("t",mktime(0,0,0,$month,1,$year)); - $month_meta['firstday'] = date("w", mktime(0,0,0,$month,1,$year)) + $startofweek; - $tempDays = $month_meta['firstday'] + $month_meta['daysinmonth']; // padding - $month_meta['weeksinmonth'] = ceil($tempDays/7); + $month_meta['daysinmonth'] = date("t", mktime(0, 0, 0, $month, 1, $year)); + $month_meta['firstday'] = date("w", mktime(0, 0, 0, $month, 1, $year)) + $startofweek; + $temp_days = $month_meta['firstday'] + $month_meta['daysinmonth']; // padding + $month_meta['weeksinmonth'] = ceil($temp_days / 7); // Stop empty weeks occuring at start of month - if ($month_meta['firstday'] > 6) { - $month_meta['firstday'] = $month_meta['firstday'] - 7; - $month_meta['weeksinmonth'] --; + if ($month_meta['firstday'] > 6) { + $month_meta['firstday'] = $month_meta['firstday'] - 7; + $month_meta['weeksinmonth'] --; } return $month_meta; } function theme_availability_calendars_month($node, $year, $month, $startofweek, $booked) { + $month_meta = availability_calendars_month_meta($year, $month, $startofweek); - + for ($j=0;$j<$month_meta['weeksinmonth'];$j++) { for ($i=0;$i<7;$i++) { $counter++; $week[$j][$i] = $counter; // offset the days $week[$j][$i] -= $month_meta['firstday']; - if (($week[$j][$i] < 1) || ($week[$j][$i] > $month_meta['daysinmonth'])) { + if (($week[$j][$i] < 1) || ($week[$j][$i] > $month_meta['daysinmonth'])) { $week[$j][$i] = ""; } } } - $output = "
| ". t("@date", array('@date' => format_date(mktime(12,0,0,$month,1,$year), 'custom', 'F Y'))); + $output .= " | ". t("@date", array('@date' => format_date(mktime(12, 0, 0, $month, 1, $year), 'custom', 'F Y'))); if (user_access('edit availability calendars')) { - $output .= ' '. l('edit', 'availability-calendars/'. $node->nid .'/'. date('Y/m', mktime(0,0,0,$month,1,$year)) .'/edit', NULL, 'destination=node/'. $node->nid); + $output .= ' '. l('edit', 'availability-calendars/'. $node->nid .'/'. date('Y/m', mktime(0, 0, 0, $month, 1, $year)) .'/edit', + array('query' => 'destination=node/'. $node->nid)); } $output .= " | \n"; $output .= "F | \n"; $output .= "\n"; */ - + // find all entries in database for this month ($availability, $notes) and pre-populate $notes_result = db_query('SELECT week, note FROM {availability_calendars_week} WHERE nid = %d AND year = %d AND month = %d', $node->nid, $year, $month); while ($note = db_fetch_array($notes_result)) { @@ -365,35 +389,38 @@ function theme_availability_calendars_mo while ($status = db_fetch_array($status_result)) { $day_status[$status['day']] = $status['status']; } - + $availability_calendars_options = availability_calendars_options(); - - foreach ($week as $key => $val) { - $weeknumber = $key+1; - - $output .= "|||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ". $notes[$weeknumber] ." | \n"; - for ($i=0;$i<7;$i++) { - - // if there's a date, it's part of this month - if ($week[$key][$i]) { - if ($day_status[$week[$key][$i]] == 1) { - // booked - $output .= "". $week[$key][$i] ." | \n"; - } - elseif ($day_status[$week[$key][$i]] == 2) { - // provisionally booked - $output .= "". $week[$key][$i] ." | \n"; - } else { - // available - $output .= "". $week[$key][$i] ." | \n"; + + foreach ($week as $key => $val) { + $weeknumber = $key + 1; + + $output .= "||||||||||||
| ". $notes[$weeknumber] ." | \n"; + for ($i=0; $i<7; $i++) { + + // if there's a date, it's part of this month + if ($week[$key][$i]) { + if ($day_status[$week[$key][$i]] == 1) { + // booked + $output .= "". $week[$key][$i] ." | \n"; + } + elseif ($day_status[$week[$key][$i]] == 2) { + // provisionally booked + $output .= "". $week[$key][$i] ." | \n"; + } + else { + // available + $output .= "". $week[$key][$i] ." | \n"; } } else { - $output .= "". $number ." | \n"; + $output .= "". $number ." | \n"; } - } - $output .= "||||||||||