You are here

weekdays_date_restrictions.module in Weekdays field 7

File

modules/weekdays_date_restrictions/weekdays_date_restrictions.module
View source
<?php

/**
 * Implements hook_date_restrictions_allowed_values_info().
 */
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',
    ),
  );
}

/**
 * Implements allowed_values_settings_form callback.
 */
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;
}

/**
 * Implements allowed_values_settings_validate callback.
 */
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;
  }
}

/**
 * Implements allowed_values_valid_date callback.
 */
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);
}

/**
 * Implements allowed_values_remitter_pack callback.
 */
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;
  }
}

/**
 * Implements allowed_values_remitter_unpack callback.
 */
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;
}

/**
 * Implements allowed_values_access_callback callback.
 */
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':

      // @todo it is neccesary to check access to field or entity?
      // Problem: can't check 'view' permission for entities being created (no entity_id yet).
      return true;
  }
}

/**
 * Implements allowed_values_page_callback callback.
 */
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':

      // @todo since the entity is already loaded in the access callback,
      // it is cheap (cheaper?) to access its values instead of doing EFQef.
      $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();

      // @todo check if empty.
      $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);
}

Functions

Namesort descending Description
weekdays_date_restrictions_allowed_values_access_callback Implements allowed_values_access_callback callback.
weekdays_date_restrictions_allowed_values_page_callback Implements allowed_values_page_callback callback.
weekdays_date_restrictions_allowed_values_remitter_pack Implements allowed_values_remitter_pack callback.
weekdays_date_restrictions_allowed_values_remitter_unpack Implements allowed_values_remitter_unpack callback.
weekdays_date_restrictions_allowed_values_settings_form Implements allowed_values_settings_form callback.
weekdays_date_restrictions_allowed_values_settings_validate Implements allowed_values_settings_validate callback.
weekdays_date_restrictions_allowed_values_valid_date Implements allowed_values_valid_date callback.
weekdays_date_restrictions_date_restrictions_allowed_values_info Implements hook_date_restrictions_allowed_values_info().