Refactor the way leaders/helpers are selected

This commit is contained in:
2014-02-08 14:52:40 +11:00
parent 5e2024df17
commit ac78ecd3f1

View File

@@ -15,50 +15,131 @@ function booking_available_leadhelp_select_form() {
//see http://www.jaypan.com/blog/themeing-drupal-7-forms-tables-checkboxes-or-radios
$form = array ();
$options = array ();
$prefix = t("<p>Specify the number of leader or helper sessions for each attendee. Note that this will overwrite the previous value.</p>");
$session_count = array();
$session_count['0'] = 0;
$session_count['1'] = 1;
$session_count['2'] = 2;
$session_count['3'] = 3;
$session_count['4'] = 4;
$session_count['5'] = 5;
$group_options = array();
$session_options = array();
$prefix = t("<p>Allocate a leader/helper session for attendees. Note that at this stage there is no way to remove this data.</p>");
$suffix = t("<p>Make sure you have selected a study group to apply these changes to!</p>");
$form['booking-leadhelp-count'] = array(
//select all the study groups for this event id
$studygroups_query = db_query("SELECT * FROM {booking_studygroup_list} WHERE booking_eventid = :eid", array(':eid' => $event->eid));
$studygroups = $studygroups_query->fetchAllAssoc('sid');
$group_options[0] = '';
foreach ($studygroups as $group)
$group_options[$group->sid] = $group->booking_studygroup_descrip;
//select the number of study group sessions
//assume they all have the same number of sessions
$num_sessions = reset($studygroups)->booking_num_group_sessions;
$session_options[0] = '';
for ($i = 1; $i <= $num_sessions; $i++)
$session_options[$i] = $i;
//select any entries already in the mapping table
$group_mapping_query = db_query("SELECT * FROM {booking_studygroup_mapping} WHERE booking_eventid = :eid", array(':eid' => $event->eid));
$group_mapping = $group_mapping_query->fetchAllAssoc('sid');
//***form starts here***
$form['booking_studygroup'] = array(
'#type' => 'select',
'#title' => t('Set Number of Sessions'),
'#title' => t('Select which Study Group to process'),
'#required' => TRUE,
'#default_value' => '0',
'#options' => $session_count,
'#options' => $group_options,
);
$header = array (
'booking_nid' => array('data' => t('Booking ID')),
'booking_name' => array('data' => t('Name')),
'booking_gender' => array('data' => t('Gender')),
'booking_baptised' => array('data' => t('Baptised?')),
'booking_age' => array('data' => t('Age at start of event')),
'booking_lead_sessions' => array('data' => t('Total number of groups to lead')),
'booking_available_lead' => array('data' => t('Remaining slots')),
'booking_help_sessions' => array('data' => t('Total number of groups to help')),
'booking_available_help' => array('data' => t('Remaining slots')),
'booking_nid' => array('data' => t('Booking ID'), 'field' => 'nid'),
'booking_name' => array('data' => t('Name'), 'field' => 'booking_lastname'),
//'booking_gender' => array('data' => t('Gender')),
'booking_baptised' => array('data' => t('Baptised?'), 'field' => 'booking_baptised'),
'booking_age' => array('data' => t('Age at week'), 'field' => 'booking_dob', 'sort' => 'asc'),
'booking_state' => array('data' => t('State'), 'field' => 'booking_state'),
//'booking_assign_leader_group' => array('data' => t('Assign leader group')),
'booking_assign_leader_session' => array('data' => t('Leader Session')),
//'booking_assign_helper_group' => array('data' => t('Assign helper group')),
'booking_assign_helper_session' => array('data' => t('Helper Session')),
//'booking_lead_sessions' => array('data' => t('Total groups leading')),
//'booking_help_sessions' => array('data' => t('Total groups helping')),
'booking_currently_leadhelp' => array('data' => t('Currently leading/helping')),
);
$result = db_query("SELECT * FROM {booking_person} p left outer join {booking_leadhelp_list} l on p.nid = l.booking_node_id WHERE p.booking_event_id = :eid ORDER BY p.booking_gender DESC, p.booking_dob, p.booking_baptised",
array(':eid' => $event->eid));
$query = db_select('booking_person', 'p');
//$query->leftJoin('booking_leadhelp_list', 'l', 'p.nid = l.booking_node_id');
$db_and = db_and();
$db_and->condition('p.booking_event_id', $event->eid, '=');
$db_and->condition('p.booking_gender', 'M', '=');
$query->condition($db_and);
//$query->fields('p')->fields('l');
$query->fields('p');
$table_sort = $query->extend('TableSort')->orderbyHeader($header);
$result = $table_sort->execute();
foreach($result as $data)
{
$currently_doing = "";
//work out what this person is currently leading/helping
foreach ($group_mapping as $person)
{
if ($person->booking_node_id == $data->nid)
{
if ($person->booking_is_leader == 'Y')
$currently_doing .= "Lead " . $person->booking_studygroup_id . " #" . $person->booking_session_id . "; ";
elseif ($person->booking_is_helper == 'Y')
$currently_doing .= "Help " . $person->booking_studygroup_id . " #" . $person->booking_session_id . "; ";
}
}
$options[$data->nid] = array (
'booking_nid' => l(t('!id', array('!id' => $data->nid)), t('node/!id', array('!id' => $data->nid))),
'booking_name' => $data->booking_firstname . " " . $data->booking_lastname,
'booking_gender' => $data->booking_gender == 'M' ? 'Male' : 'Female',
//'booking_gender' => $data->booking_gender == 'M' ? 'Male' : 'Female',
'booking_baptised' => $data->booking_baptised == 'Y' ? 'Yes' : 'No',
'booking_age' => _booking_avg_age($data->booking_dob, 1, $event->booking_event_start),
'booking_lead_sessions' => $data->booking_total_lead === NULL ? '0' : $data->booking_total_lead,
'booking_available_lead' => $data->booking_available_lead === NULL ? '0' : $data->booking_available_lead,
'booking_help_sessions' => $data->booking_total_help === NULL ? '0' : $data->booking_total_help,
'booking_available_help' => $data->booking_available_help === NULL ? '0' : $data->booking_available_help,
'booking_state' => $data->booking_state,
//'booking_lead_sessions' => $data->booking_total_lead === NULL ? '0' : $data->booking_total_lead,
//'booking_available_lead' => $data->booking_available_lead === NULL ? '0' : $data->booking_available_lead,
//'booking_help_sessions' => $data->booking_total_help === NULL ? '0' : $data->booking_total_help,
//'booking_available_help' => $data->booking_available_help === NULL ? '0' : $data->booking_available_help,
/*
'booking_assign_leader_group' => array('data' => array(
'#type' => 'select',
//'#title' => t('Select group'),
'#default_value' => 0,
'#options' => $group_options,
'#name' => 'booking_assign_leader_group[' . $data->nid . ']',
)
),
*/
'booking_assign_leader_session' => array('data' => array(
'#type' => 'select',
'#default_value' => 0,
'#options' => $session_options,
'#name' => 'booking_assign_leader_session[' . $data->nid . ']',
)
),
/*
'booking_assign_helper_group' => array('data' => array(
'#type' => 'select',
'#default_value' => 0,
'#options' => $group_options,
'#name' => 'booking_assign_helper_group[' . $data->nid . ']',
)
),
*/
'booking_assign_helper_session' => array('data' => array(
'#type' => 'select',
'#default_value' => 0,
'#options' => $session_options,
'#name' => 'booking_assign_helper_session[' . $data->nid . ']',
)
),
'booking_currently_leadhelp' => $currently_doing,
);
}
@@ -67,8 +148,22 @@ function booking_available_leadhelp_select_form() {
'#header' => $header,
'#options' => $options,
'#empty' => t('No attendees found.'),
'#attributes' => array('id' => 'sort-table'),
);
//so we can access the dropdown elements
$form['booking_assign_leader_group'] = array( '#type' => 'value', );
$form['booking_assign_helper_group'] = array( '#type' => 'value', );
$form['booking_assign_leader_session'] = array( '#type' => 'value', );
$form['booking_assign_helper_session'] = array( '#type' => 'value', );
$form['submit'] = array (
'#type' => 'submit',
'#value' => t('Submit'),
);
/*
$form['submit-leader'] = array (
'#type' => 'submit',
'#value' => t('Set Leader'),
@@ -78,16 +173,35 @@ function booking_available_leadhelp_select_form() {
'#type' => 'submit',
'#value' => t('Set Helper'),
);
*/
return array (
'first_para' => array (
'#type' => 'markup',
'#markup' => $prefix,
),
'form' => $form,
'last_para' => array (
'#type' => 'markup',
'#markup' => $suffix,
),
);
}
/**
* Validate the submission for defining which study group sessions people will lead or help
*/
function booking_available_leadhelp_select_form_validate($form, &$form_state) {
//check that a study group was selected
if ($booking_studygroup = $form_state['values']['booking_studygroup'] == 0)
{
form_set_error('booking_studygroup',
t('You forgot to select which study group to apply this list to.')
);
}
}
/**
* Process the submission for number of study group sessions to lead/help
*/
@@ -95,6 +209,108 @@ function booking_available_leadhelp_select_form_submit($form, &$form_state) {
global $event;
$counter = 0;
$checkboxes = $form_state['values']['table'];
$booking_studygroup = $form_state['values']['booking_studygroup'];
//$leader_list = $form_state['values']['booking_assign_leader_group'];
$leader_session = $form_state['values']['booking_assign_leader_session'];
//$helper_list = $form_state['values']['booking_assign_helper_group'];
$helper_session = $form_state['values']['booking_assign_helper_session'];
//watchdog('booking', "Leader list: @info", array('@info' => var_export($leader_list, TRUE)));
//watchdog('booking', "Helper list: @info", array('@info' => var_export($helper_list, TRUE)));
//select any entries already in the mapping table
$group_mapping_query = db_query("SELECT * FROM {booking_studygroup_mapping} WHERE booking_eventid = :eid", array(':eid' => $event->eid));
$group_mapping = $group_mapping_query->fetchAllAssoc('sid');
//update the attendees as specified
foreach($checkboxes as $key => $value)
{
$leader = 'N';
$helper = 'N';
$session = 0;
$found = FALSE;
//was this person set as a leader?
if ($leader_session[$key] <> 0)
{
$leader = 'Y';
$session = $leader_session[$key];
watchdog('booking', 'Person !nid is set to be a leader in session !sid', array ('!nid' => $key, '!sid' => $leader_session[$key]));
}
//was this person set as a helper?
elseif ($helper_session[$key] <> 0)
{
$helper = 'Y';
$session = $helper_session[$key];
watchdog('booking', 'Person !nid is set to be a helper in session !sid', array ('!nid' => $key, '!sid' => $helper_session[$key]));
}
//if we reach the else something weird happened, make sure we don't insert
else
continue;
//check if this person already exists in the booking_studygroup_mapping table
foreach ($group_mapping as $person)
{
if ($person->booking_node_id == $key && $person->booking_studygroup_id == $booking_studygroup &&
($person->booking_is_leader == 'Y' || $person->booking_is_helper == 'Y'))
{
$found = TRUE;
break;
}
}
if ($found == FALSE)
{
//run an insert
db_insert('booking_studygroup_mapping')
->fields(array(
'booking_eventid' => $event->eid,
'booking_node_id' => $key,
'booking_studygroup_id' => $booking_studygroup,
'booking_session_id' => $session,
'booking_is_leader' => $leader,
'booking_is_helper' => $helper,
))
->execute();
}
else
{
//run an update
db_update('booking_studygroup_mapping')
->fields(array (
'booking_session_id' => $session,
'booking_is_leader' => $leader,
'booking_is_helper' => $helper,
))
->condition('booking_node_id', $key)
->condition('booking_studygroup_id', $booking_studygroup)
->execute();
}
$counter++;
/*
$person = db_query("SELECT m.booking_node_id " .
"FROM {booking_studygroup_mapping} m " .
"WHERE booking_node_id = :nid AND booking_eventid = :eid AND booking_studygroup_id = :sid",
array(':nid' => $key, ':eid' => $event->eid, ':sid' = > $value))
->fetchObject();
*/
}
drupal_set_message("Defined leader/helper numbers for $counter people.", 'status', FALSE);
watchdog('booking', "Defined leader/helper numbers for $counter people.");
/*
$session_count = $form_state['values']['booking-leadhelp-count'];
foreach($checkboxes as $key => $value)
@@ -179,6 +395,7 @@ function booking_available_leadhelp_select_form_submit($form, &$form_state) {
drupal_set_message("Defined leader/helper numbers for $counter people.", 'status', FALSE);
watchdog('booking', "Defined leader/helper numbers for $counter people.");
*/
}
/**
@@ -656,34 +873,42 @@ function booking_studygroups_view_form($node, &$form_state, $group_id) {
//watchdog('booking', 'Study groups raw data: @info', array ('@info' => var_export($result, TRUE)));
//retrieve which sort is active in the current view
$sort = tablesort_get_order($header);
foreach($result as $data)
{
$class = "";
//apply theme as required
if ($data->booking_is_leader == 1)
if ($data->booking_is_leader == 'Y')
$class = "leader-row";
elseif ($data->booking_is_helper == 1)
elseif ($data->booking_is_helper == 'Y')
$class = "helper-row";
else
$class = "normal-row";
//Add a different id for first entry of new session, with a border-top to distinguish it
if ($last_session <> $data->booking_session_id && $last_session <> "")
//only add the lines separating groups if we're sorting by the session id
if ($sort['sql'] == "m.booking_session_id")
{
if ($class === "leader-row")
$class = "leader-new-group-row";
elseif ($class === "helper-row")
$class = "helper-new-group-row";
else
$class = "new-group-row";
//Add a different id for first entry of new session, with a border-top to distinguish it
if ($last_session <> $data->booking_session_id && $last_session <> "")
{
if ($class === "leader-row")
$class = "leader-new-group-row";
elseif ($class === "helper-row")
$class = "helper-new-group-row";
else
$class = "new-group-row";
}
}
$options[$data->nid] = array (
'booking_session_id' => $data->booking_session_id,
'booking_name' => $data->booking_firstname . " " . $data->booking_lastname,
'booking_is_leader' => $data->booking_is_leader == 1 ? 'Yes' : 'No',
'booking_is_helper' => $data->booking_is_helper == 1 ? 'Yes' : 'No',
'booking_is_leader' => $data->booking_is_leader == 'Y' ? 'Yes' : 'No',
'booking_is_helper' => $data->booking_is_helper == 'Y' ? 'Yes' : 'No',
'#attributes' => array('id' => array($class))
);