function availability_calendars_update_node_states_range in Availability Calendars 7.2
Updates/inserts the states for the calendar for the given node and date range.
Note that $from and $to must be ordered and that if the date parts of $from and $to are equal, no pm and am are allowed. Unexpected results will occur when not obeyed.
Parameters
int $calendar_nid:
string $from: Format: yyyy-mm-dd or yyyy-mm-dd(pm)
string $to: Format: yyyy-mm-dd or yyyy-mm-dd(am) $param string $state
1 call to availability_calendars_update_node_states_range()
- AvailabilityCalendarsNodeEditCalendarFormHandler::submit in ./
availability_calendars.node.inc - Callback to process form submission for the styles form.
File
- ./
availability_calendars.inc, line 431 - General helper methods for Availability Calendars, like database access and settings.
Code
function availability_calendars_update_node_states_range($calendar_nid, $from, $to, $state) {
$from_pm = drupal_substr($from, 10);
/** @var $from DateTime */
$from = new DateTime(drupal_substr($from, 0, 10));
$to_am = drupal_substr($to, 10);
/** @var $to DateTime */
$to = new DateTime(drupal_substr($to, 0, 10));
// Start building the insert query as specific from and to may already lead to insert values.
$values = array(
'nid' => $calendar_nid,
'date' => null,
'status' => $state,
);
$insert = db_insert('availability_calendars_day')
->fields(array_keys($values));
// Get existing dates to be able to differentiate between update and insert.
$existing_states = availability_calendars_get_node_states_range($calendar_nid, $from, $to);
// Handle $from and $to dates specially when a split day range is passed in.
if (!empty($from_pm)) {
$values['date'] = $from
->format(AC_ISODATE);
if (array_key_exists($values['date'], $existing_states)) {
// Update PM state, leave AM state, i.e. AM state becomes current whole day state or current AM state.
$current_state = $existing_states[$values['date']];
$matches = array();
if (preg_match('/([^ ]+)-am/', $current_state, $matches) > 0) {
$current_state = $matches[1];
}
$values['status'] = $current_state . '-am ' . $state . '-pm';
db_update('availability_calendars_day')
->fields(array(
'status' => $values['status'],
))
->condition('nid', $calendar_nid, '=')
->condition('date', $values['date'], '=')
->execute();
}
else {
// Insert default AM status and PM state.
$settings = availability_calendars_get_settings($calendar_nid);
$values['status'] = $settings->defaultstatus . '-am ' . $state . '-pm';
$insert
->values($values);
}
$from
->modify('+1 day');
}
if (!empty($to_am)) {
$values['date'] = $to
->format(AC_ISODATE);
if (array_key_exists($values['date'], $existing_states)) {
// Update AM state, leave PM state, i.e. PM state becomes current whole day state or current PM state.
$current_state = $existing_states[$values['date']];
$matches = array();
if (preg_match('/([^ ]+)-pm/', $current_state, $matches) > 0) {
$current_state = $matches[1];
}
$values['status'] = $state . '-am ' . $current_state . '-pm';
db_update('availability_calendars_day')
->fields(array(
'status' => $values['status'],
))
->condition('nid', $calendar_nid, '=')
->condition('date', $values['date'], '=')
->execute();
}
else {
// Insert AM state and default PM status.
$settings = availability_calendars_get_settings($calendar_nid);
$values['status'] = $state . '-am ' . $settings->defaultstatus . '-pm';
$insert
->values($values);
}
$to
->modify('-1 day');
}
// Only continue when handling split from and to dates did not cover the whole range.
if ($from <= $to) {
// Update the already existing dates.
db_update('availability_calendars_day')
->fields(array(
'status' => $state,
))
->condition('nid', $calendar_nid, '=')
->condition('date', array(
$from
->format(AC_ISODATE),
$to
->format(AC_ISODATE),
), 'BETWEEN')
->execute();
// Insert the non-existing dates.
$values['status'] = $state;
for ($day = $from; $day <= $to; $day
->modify('+1 day')) {
$values['date'] = $day
->format(AC_ISODATE);
if (!array_key_exists($values['date'], $existing_states)) {
$insert
->values($values);
}
}
}
$insert
->execute();
}