View source
<?php
const WEEKDAYS_SU = 1;
const WEEKDAYS_MO = 2;
const WEEKDAYS_TU = 4;
const WEEKDAYS_WE = 8;
const WEEKDAYS_TH = 16;
const WEEKDAYS_FR = 32;
const WEEKDAYS_SA = 64;
function weekdays_codes() {
static $codes;
if (empty($codes)) {
foreach (array_keys(date_repeat_dow_day_options()) as $daycode) {
$codes[$daycode] = constant('WEEKDAYS_' . $daycode);
}
}
return $codes;
}
function weekdays_bitwise_to_array($bitwise) {
$codes = weekdays_codes();
$array = array();
foreach ($codes as $daycode => $code) {
if ($bitwise & $code) {
$array[$daycode] = $daycode;
}
}
return $array;
}
function weekdays_array_to_bitwise($array) {
$codes = weekdays_codes();
$bitwise = 0;
foreach ($array as $daycode => $selected) {
if ($selected) {
$bitwise = $bitwise | $codes[$daycode];
}
}
return $bitwise;
}
function weekdays_element_info() {
$types = array();
$types['weekdays'] = array(
'#input' => TRUE,
'#multiple' => TRUE,
'#process' => array(
'weekdays_element_process',
),
'#pre_render' => array(
'form_pre_render_conditional_form_element',
),
'#value_callback' => 'form_type_checkboxes_value',
);
return $types;
}
function weekdays_element_process($element, &$form_state, $form) {
static $options = FALSE;
if (!$options) {
$options = date_repeat_dow_day_options(TRUE);
$options = date_repeat_dow_day_options_ordered($options);
}
$element['#options'] = $options;
if (!empty($element['#ajax'])) {
$element['#ajax'] += array(
'trigger_as' => array(
'name' => $element['#name'],
),
'event' => 'change',
);
}
if ($element['#multiple']) {
$element['#theme_wrappers'] = array(
'checkboxes',
);
$element = form_process_checkboxes($element);
}
else {
$element['#theme_wrappers'] = array(
'radios',
);
$element = form_process_radios($element);
}
return $element;
}
function weekdays_field_info() {
return array(
'weekdays' => array(
'label' => t('Week days'),
'description' => t('Select week days.'),
'default_widget' => 'weekdays_default',
'default_formatter' => 'weekdays_default',
'property_type' => 'list',
),
);
}
function weekdays_field_load($entity_type, $entities, $field, $instances, $langcode, &$items) {
foreach ($entities as $id => $entity) {
foreach ($items[$id] as $delta => $item) {
if (is_numeric($item['value'])) {
$items[$id][$delta]['value'] = weekdays_bitwise_to_array($item['value']);
}
}
}
}
function weekdays_field_presave($entity_type, $entity, $field, $instance, $langcode, &$items) {
foreach ($items as $delta => $item) {
if (is_array($item['value'])) {
$items[$delta]['value'] = weekdays_array_to_bitwise($item['value']);
}
}
}
function weekdays_field_is_empty($item, $field) {
foreach ($item['value'] as $key => $value) {
if ($value !== 0) {
return FALSE;
}
}
return TRUE;
}
function weekdays_field_widget_info() {
return array(
'weekdays_default' => array(
'label' => t('Weekdays'),
'field types' => array(
'weekdays',
),
),
);
}
function weekdays_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
$element['value'] = $element + array(
'#type' => 'weekdays',
'#default_value' => isset($items[$delta]['value']) ? $items[$delta]['value'] : array(),
);
return $element;
}
function weekdays_field_formatter_info() {
return array(
'weekdays_default' => array(
'label' => t('Weekdays default'),
'field types' => array(
'weekdays',
),
),
);
}
function weekdays_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
$days = date_repeat_dow_day_options(TRUE);
$element = array();
foreach ($items as $delta => $item) {
$value = array();
foreach (array_filter($item['value']) as $daycode) {
$value[] = $days[$daycode];
}
$element[$delta] = array(
'#markup' => implode(', ', $value),
);
}
return $element;
}
function weekdays_reverse($weekdays) {
$reversed = array();
foreach (array_keys(date_repeat_dow_day_options()) as $daycode) {
if (!isset($weekdays[$daycode])) {
$reversed[$daycode] = $daycode;
}
}
return $reversed;
}
function weekdays_valid_date($date, $weekdays) {
$dow = array_keys(date_repeat_dow_day_options(TRUE));
$wday = $dow[date_day_of_week($date)];
return in_array($wday, $weekdays);
}
function weekdays_days_in_date_range(DateObject $start, DateObject $end, array $weekdays, array $include = array(), array $exclude = array()) {
$dow = array_keys(date_repeat_dow_day_options(TRUE));
$wday = $dow[date_day_of_week($start)];
while (!in_array($wday, $weekdays) && $start < $end) {
$start
->modify('+1 day');
$wday = $dow[date_day_of_week($start)];
}
if (!empty($weekdays)) {
$rrule = 'RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=' . implode(',', $weekdays) . ';';
$dates = date_repeat_calc($rrule, (string) $start, (string) $end);
}
else {
$dates = array();
}
foreach ($dates as $date) {
$date = substr($date, 0, 10);
if (!in_array($date, $exclude)) {
$include[] = $date;
}
}
return $include;
}