View source
<?php
function weekdays_date_restrictions_date_restrictions_allowed_values_info() {
return array(
'weekdays' => array(
'title' => t('Week days'),
'settings' => array(),
),
'weekdays_host_entity' => array(
'title' => t('Host entity: get week days from a field in the host entity'),
'settings' => array(
'field' => null,
'reversed' => false,
),
'dependencies' => 'date_restrictions_host_entity',
),
'weekdays_product_display' => array(
'title' => t('Product display: get week days from a source field'),
'settings' => array(
'field' => null,
'reversed' => false,
),
'dependencies' => 'date_restrictions_commerce_line_item',
),
);
}
function weekdays_date_restrictions_allowed_values_settings_form($type, $default_value, $context) {
switch ($type) {
case 'weekdays':
$element = array(
'#type' => 'weekdays',
'#title' => t('Select available week days'),
'#default_value' => $default_value,
);
break;
case 'weekdays_host_entity':
case 'weekdays_product_display':
$instance = $context['instance'];
if ($type == 'weekdays_host_entity') {
$bundles[$instance['entity_type']] = array(
$instance['bundle'],
);
}
else {
$bundles = date_restrictions_commerce_line_item_get_product_displays($instance['bundle']);
}
$options = date_restrictions_get_bundle_instances_as_options($bundles, 'weekdays');
$element = array(
'#theme_wrappers' => array(
'container',
),
'#attributes' => array(
'class' => array(
'container-inline',
),
),
);
$element['field'] = array(
'#type' => 'select',
'#title' => t('Choose field'),
'#options' => $options,
'#default_value' => $default_value['field'],
);
$element['reversed'] = array(
'#type' => 'checkbox',
'#title' => t('Reverse week days'),
'#default_value' => $default_value['reversed'],
);
break;
}
return $element;
}
function weekdays_date_restrictions_allowed_values_settings_validate($type, $settings, $form, &$form_state) {
switch ($type) {
case 'weekdays':
form_set_value($form['allowed_values'][$type], array_filter($settings), $form_state);
break;
}
}
function weekdays_date_restrictions_allowed_values_valid_date($date, $type, $settings, $element, $form_state, $form) {
switch ($type) {
case 'weekdays':
$weekdays = $settings;
break;
case 'weekdays_host_entity':
list($entity_type, $bundle, $field_name) = explode(':', $settings['field']);
$values = $form_state[HOST_ENTITY_KEY]['values'][$field_name];
$weekdays = array_filter($values[0]['value']);
$weekdays = $settings['reversed'] ? weekdays_reverse($weekdays) : $weekdays;
break;
case 'weekdays_product_display':
list($entity_type, $bundle, $field_name) = explode(':', $settings['field']);
$line_item = $form_state['line_item'];
$entity_id = $line_item->data['context']['entity']['entity_id'];
$entity = entity_load_single($entity_type, $entity_id);
$weekdays = field_get_items($entity_type, $entity, $field_name);
$weekdays = $weekdays[0]['value'];
$weekdays = $settings['reversed'] ? weekdays_reverse($weekdays) : $weekdays;
break;
}
return weekdays_valid_date($date, $weekdays);
}
function weekdays_date_restrictions_allowed_values_remitter_pack($type, $element, $form_state, $context) {
switch ($type) {
case 'weekdays':
$instance = $element['#instance'];
return $instance['entity_type'] . ':' . $instance['bundle'] . ':' . $instance['field_id'];
break;
case 'weekdays_host_entity':
return date_restrictions_host_entity_allowed_values_remitter_pack($type, $element, $form_state, $context);
break;
case 'weekdays_product_display':
return date_restrictions_commerce_line_item_allowed_values_remitter_pack($type, $element, $form_state, $context);
break;
}
}
function weekdays_date_restrictions_allowed_values_remitter_unpack($type, $remitter) {
switch ($type) {
case 'weekdays':
list($entity_type, $bundle, $field_id) = explode(':', $remitter);
$field = field_info_field_by_id($field_id);
$instance = field_info_instance($entity_type, $field['field_name'], $bundle);
$weekdays = $instance['settings']['restrictions']['allowed_values'][$type];
$unpacked = array(
'settings' => $weekdays,
);
break;
case 'weekdays_host_entity':
$unpacked = date_restrictions_host_entity_allowed_values_remitter_unpack($type, $remitter);
break;
case 'weekdays_product_display':
$unpacked = date_restrictions_commerce_line_item_allowed_values_remitter_unpack($type, $remitter);
break;
}
return $unpacked;
}
function weekdays_date_restrictions_allowed_values_access_callback($type, $remitter) {
switch ($type) {
case 'weekdays':
return true;
break;
case 'weekdays_product_display':
list($entity_type, $bundle, $field_name) = explode(':', $remitter['settings']['field']);
$entity = entity_load_single($entity_type, $remitter['entity_id']);
return entity_access('view', $entity_type, $entity);
break;
case 'weekdays_host_entity':
return true;
}
}
function weekdays_date_restrictions_allowed_values_page_callback($type, $remitter, $year, $month) {
switch ($type) {
case 'weekdays':
$weekdays = $remitter['settings'];
break;
case 'weekdays_host_entity':
$settings = $remitter['settings'];
list($entity_type, $bundle, $field_name) = explode(':', $settings['field']);
$weekdays = array_filter($remitter['values'][$field_name][0]['value']);
$weekdays = $settings['reversed'] ? weekdays_reverse($weekdays) : $weekdays;
break;
case 'weekdays_product_display':
$entity_id = $remitter['entity_id'];
$settings = $remitter['settings'];
list($entity_type, $bundle, $field_name) = explode(':', $settings['field']);
$entity_info = entity_get_info($entity_type);
$query = new EntityFieldQueryExtraFields();
$query
->entityCondition('entity_type', $entity_type)
->propertyCondition($entity_info['entity keys']['id'], $entity_id)
->addExtraField($field_name, 'value', 'value');
$values = $query
->execute();
$weekdays = $values[$entity_type][$entity_id]->extraFields->{$field_name . '_value'};
$weekdays = weekdays_bitwise_to_array($weekdays);
$weekdays = $settings['reversed'] ? weekdays_reverse($weekdays) : $weekdays;
break;
}
$days = date_days_in_month($year, $month);
$start = new DateObject("{$year}-{$month}-01");
$end = new DateObject("{$year}-{$month}-{$days}");
return weekdays_days_in_date_range($start, $end, $weekdays);
}