care-8.x-1.x-dev/care_fields/care_fields.module
care_fields/care_fields.module
<?php
module_load_include('inc', 'care_fields', 'includes/address_select');
module_load_include('inc', 'care_fields', 'includes/address');
module_load_include('inc', 'care_fields', 'includes/date');
module_load_include('inc', 'care_fields', 'includes/email');
module_load_include('inc', 'care_fields', 'includes/membership_number');
module_load_include('inc', 'care_fields', 'includes/memberships');
module_load_include('inc', 'care_fields', 'includes/name');
module_load_include('inc', 'care_fields', 'includes/telephone');
define('CARE_FIELDS_UNCHANGED', 0);
define('CARE_FIELDS_CHANGED', 1);
define('CARE_FIELDS_DELETED', 2);
/**
* Implements hook_permission().
*/
function care_fields_permission() {
return [
'administer care fields integration' => [
'title' => t('Administer CARE fields.'),
'description' => t('Change settings for CARE fields.'),
],
'care_fields view CARE numbers' => [
'title' => t('View CARE data ID numbers in fields.'),
'description' => t('Show values for AddressNumber, CommunicationNumber, for data held in CARE.'),
],
];
}
/**
* Implements hook_menu().
*/
function care_fields_menu() {
$items = [];
$items['admin/config/services/care/fields'] = [
'title' => 'CARE field settings',
'description' => 'Configuration of CARE fields.',
'page callback' => 'drupal_get_form',
'page arguments' => [
'care_fields_admin_settings_form',
],
'file' => 'admin/settings_form.inc',
'access arguments' => [
'administer care fields integration',
],
'type' => MENU_NORMAL_ITEM,
];
return $items;
}
/**
* Implements hook_field_presave().
*/
function care_fields_field_presave($entity_type, $entity, $field, $instance, $langcode, &$items) {
if ($instance['widget']['type'] == 'care_address_select_widget') {
foreach ($items as $delta => $item) {
if ($item['address_index'] >= 0 && isset($item['address_data'])) {
foreach ($item['address_data'][$item['address_index']] as $key => $value) {
$items[$delta][$key] = $value;
}
}
}
}
}
/**
* Implements hook_field_info().
*/
function care_fields_field_info() {
return [
'care_name' => [
'label' => t('CARE name field'),
'description' => t('A field for CARE name data.'),
'default_widget' => 'care_name_widget',
'default_formatter' => 'care_name_formatter',
'settings' => [
'cardinality' => 1,
],
'instance_settings' => [
'input_options' => [
'default_from_current_user' => FALSE,
'readonly_if_known' => FALSE,
],
],
'property_type' => 'care_name',
'property_callbacks' => [
'care_fields_name_property_info_callback',
],
],
'care_membership_number' => [
'label' => t('CARE membership number field'),
'description' => t('A field for CARE membership number data.'),
'default_widget' => 'care_membership_number_widget',
'default_formatter' => 'care_membership_number_formatter',
'settings' => [
'cardinality' => 1,
],
'instance_settings' => [
'input_options' => [
'default_from_current_user' => FALSE,
'readonly_if_known' => 'no',
],
],
'property_type' => 'care_membership_number',
'property_callbacks' => [
'care_fields_membership_number_property_info_callback',
],
],
'care_memberships' => [
'label' => t('CARE memberships field'),
'description' => t('A field for CARE membership data.'),
'default_widget' => 'care_memberships_widget',
'default_formatter' => 'care_memberships_formatter',
'settings' => [
'cardinality' => FIELD_CARDINALITY_UNLIMITED,
],
'property_type' => 'care_memberships',
'property_callbacks' => [
'care_fields_memberships_property_info_callback',
],
],
'care_date' => [
'label' => t('CARE date field'),
'description' => t('A field for CARE date data.'),
'default_widget' => 'care_date_widget',
'default_formatter' => 'care_date_formatter',
'settings' => [
'cardinality' => 1,
],
'instance_settings' => [
'input_options' => [
'default_from_current_user' => FALSE,
'readonly_if_known' => FALSE,
'earliest_date' => '-10 years',
'latest_date' => '+10 years',
],
'default_value_options' => [
'default_date' => '',
'default_date_sets' => 'day',
],
],
'property_type' => 'care_date',
'property_callbacks' => [
'care_fields_date_property_info_callback',
],
],
'care_address' => [
'label' => t('CARE address field'),
'description' => t('A field for CARE address data.'),
'default_widget' => 'care_address_widget',
'default_formatter' => 'care_address_formatter',
'settings' => [
'cardinality' => FIELD_CARDINALITY_UNLIMITED,
],
'instance_settings' => [
'input_options' => [
'default_from_current_user' => FALSE,
],
],
'property_type' => 'care_address',
'property_callbacks' => [
'care_fields_address_property_info_callback',
],
],
'care_telephone' => [
'label' => t('CARE telephone field'),
'description' => t('A field for CARE telephone number data.'),
'default_widget' => 'care_telephone_widget',
'default_formatter' => 'care_telephone_formatter',
'settings' => [
'cardinality' => FIELD_CARDINALITY_UNLIMITED,
],
'instance_settings' => [
'input_options' => [
'default_from_current_user' => FALSE,
],
],
'property_type' => 'care_telephone',
'property_callbacks' => [
'care_fields_telephone_property_info_callback',
],
],
'care_email' => [
'label' => t('CARE email field'),
'description' => t('A field for CARE email address data.'),
'default_widget' => 'care_email_widget',
'default_formatter' => 'care_email_formatter',
'settings' => [
'cardinality' => FIELD_CARDINALITY_UNLIMITED,
],
'instance_settings' => [
'input_options' => [
'default_from_current_user' => FALSE,
'display_type_field' => TRUE,
'fixed_type' => NULL,
],
],
'property_type' => 'care_email',
'property_callbacks' => [
'care_fields_email_property_info_callback',
],
],
];
}
/**
* Implements hook_field_widget_WIDGET_TYPE_form_alter().
*/
function care_fields_field_widget_care_memberships_widget_form_alter(&$element, &$form_state, $context) {
$element['#care_memberships_field'] = TRUE;
}
/**
* Implements hook_theme_registry_alter().
*/
function care_fields_theme_registry_alter(&$theme_registry) {
if (isset($theme_registry['field_multiple_value_form'])) {
$theme_registry['field_multiple_value_form']['type'] = 'module';
$theme_registry['field_multiple_value_form']['theme path'] = drupal_get_path('module', 'care_fields');
$theme_registry['field_multiple_value_form']['function'] = 'care_fields_field_multiple_value_form';
}
}
/**
* Returns HTML for an individual form element, modified for memberships field.
*
* Combine multiple values into a table with drag-n-drop reordering.
* TODO : convert to a template.
*
* @see theme_field_multiple_value_form()
*/
function care_fields_field_multiple_value_form($variables) {
$element = $variables['element'];
$output = '';
$care_memberships_field = isset($element[0]['#care_memberships_field']) && $element[0]['#care_memberships_field'];
if ($element['#cardinality'] > 1 || $element['#cardinality'] == FIELD_CARDINALITY_UNLIMITED) {
$table_id = drupal_html_id($element['#field_name'] . '_values');
$order_class = $element['#field_name'] . '-delta-order';
$required = !empty($element['#required']) ? theme('form_required_marker', $variables) : '';
if ($care_memberships_field) {
$header = [
[
'data' => '<label>' . t('!title !required', [
'!title' => $element['#title'],
'!required' => $required,
]) . "</label>",
'colspan' => 2,
'class' => ['field-label'],
],
];
}
else {
$header = [
[
'data' => '<label>' . t('!title !required', [
'!title' => $element['#title'],
'!required' => $required,
]) . "</label>",
'colspan' => 2,
'class' => ['field-label'],
],
t('Order'),
];
}
$rows = [];
// Sort items according to '_weight' (needed when the form comes back after
// preview or failed validation)
$items = [];
foreach (element_children($element) as $key) {
if ($key === 'add_more') {
$add_more_button = &$element[$key];
}
else {
$items[] = &$element[$key];
}
}
usort($items, '_field_sort_items_value_helper');
// Add the items as table rows.
foreach ($items as $item) {
if ($care_memberships_field) {
unset($item['_weight']);
$cells = [
drupal_render($item),
];
}
else {
$item['_weight']['#attributes']['class'] = [$order_class];
$delta_element = drupal_render($item['_weight']);
$cells = [
['data' => '', 'class' => ['field-multiple-drag']],
drupal_render($item),
['data' => $delta_element, 'class' => ['delta-order']],
];
}
if (!$care_memberships_field || ($item['#delta'] < $element['#max_delta'])) {
$rows[] = [
'data' => $cells,
'class' => $care_memberships_field ? [] : ['draggable'],
];
}
}
$output = '<div class="form-item">';
$output .= theme('table', [
'header' => $header,
'rows' => $rows,
'attributes' => ['id' => $table_id, 'class' => ['field-multiple-table']],
]);
$output .= $element['#description'] ? '<div class="description">' . $element['#description'] . '</div>' : '';
if (!$care_memberships_field) {
$output .= '<div class="clearfix">' . drupal_render($add_more_button) . '</div>';
}
$output .= '</div>';
if (!$care_memberships_field) {
drupal_add_tabledrag($table_id, 'order', 'sibling', $order_class);
}
}
else {
foreach (element_children($element) as $key) {
$output .= drupal_render($element[$key]);
}
}
return $output;
}
/**
* Implements hook_form_FORM_ID_alter().
*
* For field_ui_field_edit_form.
*/
function care_fields_form_field_ui_field_edit_form_alter(&$form, &$form_state, $form_id) {
if (in_array($form['#field']['type'], [
'care_address',
'care_telephone',
'care_email',
])) {
// Limit the cardinality options for these CARE fields.
$limited_options = [
FIELD_CARDINALITY_UNLIMITED => t('All CARE values'),
1 => t('Default CARE value only'),
];
$form['field']['cardinality']['#options'] = $limited_options;
if (!array_key_exists($form['field']['cardinality']['#default_value'], $limited_options)) {
$form['field']['cardinality']['#default_value'] = 1;
}
}
}
/**
* Implements hook_field_instance_settings_form().
*/
function care_fields_field_instance_settings_form($field, $instance) {
$settings = $instance['settings'];
$form = [];
switch ($field['type']) {
case 'care_address':
$form = _care_fields_address_instance_settings_form($settings);
break;
case 'care_date':
$form = _care_fields_date_instance_settings_form($settings);
break;
case 'care_email':
$form = _care_fields_email_instance_settings_form($settings);
break;
case 'care_name':
$form = _care_fields_name_instance_settings_form($settings);
break;
case 'care_membership_number':
$form = _care_fields_membership_number_instance_settings_form($settings);
break;
case 'care_telephone':
$form = _care_fields_telephone_instance_settings_form($settings);
break;
}
return $form;
}
function care_fields_field_widget_info() {
$widgets = [];
$widgets['care_name_widget'] = [
'label' => t('CARE Name field widget'),
'field types' => [
'care_name',
],
];
$widgets['care_membership_number_widget'] = [
'label' => t('CARE Membership Number field widget'),
'field types' => [
'care_membership_number',
],
];
$widgets['care_memberships_widget'] = [
'label' => t('CARE Memberships field widget'),
'field types' => [
'care_memberships',
],
];
$widgets['care_date_widget'] = [
'label' => t('CARE Date field widget'),
'field types' => [
'care_date',
],
];
$widgets['care_address_widget'] = [
'label' => t('CARE Address field widget'),
'field types' => [
'care_address',
],
];
$widgets['care_address_select_widget'] = [
'label' => t('CARE Address selector widget'),
'field types' => [
'care_address',
],
];
$widgets['care_telephone_widget'] = [
'label' => t('CARE Telephone field widget'),
'field types' => [
'care_telephone',
],
];
$widgets['care_email_widget'] = [
'label' => t('CARE Email field widget'),
'field types' => [
'care_email',
],
];
foreach ($widgets as &$widget) {
$widget += [
'behaviors' => [
'default value' => FIELD_BEHAVIOR_NONE,
],
];
}
return $widgets;
}
/**
* Implements hook_field_widget_form().
*/
function care_fields_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
$function = str_replace('care_', '_care_fields_', $instance['widget']['type']);
$function = str_replace('_widget', '_form', $function);
$function($element, $form_state, $field, $instance, $items, $delta);
return $element;
}
/**
* Implements hook_field_is_empty().
*
* Used for validating required single-value fields,
* and to delete empty values in multi-value fields.
*/
function care_fields_field_is_empty($item, $field) {
$function = str_replace('care_', '_care_fields_', $field['type']) . '_field_is_empty';
return $function($item, $field);
}
/**
* Implements hook_field_formatter_info().
*/
function care_fields_field_formatter_info() {
return [
'care_name_formatter' => [
'label' => t('Default'),
'field types' => [
'care_name',
],
],
'care_membership_number_formatter' => [
'label' => t('Default'),
'field types' => [
'care_membership_number',
],
],
'care_memberships_formatter' => [
'label' => t('Default (with renewal links as relevant)'),
'field types' => [
'care_memberships',
],
],
'care_memberships_simple_formatter' => [
'label' => t('Simple (without renewal links)'),
'field types' => [
'care_memberships',
],
],
'care_date_formatter' => [
'label' => t('Default'),
'field types' => [
'care_date',
],
],
'care_address_formatter' => [
'label' => t('Multi-line'),
'field types' => [
'care_address',
],
],
'care_address_oneline_formatter' => [
'label' => t('Single line'),
'field types' => [
'care_address',
],
],
'care_address_minimal_formatter' => [
'label' => t('First line and postcode'),
'field types' => [
'care_address',
],
],
'care_telephone_formatter' => [
'label' => t('Default'),
'field types' => [
'care_telephone',
],
],
'care_email_formatter' => [
'label' => t('Default'),
'field types' => [
'care_email',
],
],
'care_field_changed_formatter' => [
'label' => t('Pending changes?'),
'field types' => [
'care_name',
'care_date',
'care_address',
'care_telephone',
'care_email',
],
],
];
}
/**
* Implements hook_field_formatter_view().
*/
function care_fields_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
$element = [];
foreach ($items as $delta => $item) {
switch ($field['type']) {
case 'care_email':
case 'care_telephone':
$item_number = $item['communication_number'];
break;
case 'care_address':
$item_number = $item['address_number'];
break;
default:
$item_number = -1;
}
switch ($display['type']) {
case 'care_name_formatter':
$element[$delta]['#markup'] = trim($item['title'] . ' ' . $item['forenames'] . ' ' . $item['surname']);
break;
case 'care_membership_number_formatter':
$element[$delta]['#markup'] = trim($item['number']);
break;
case 'care_memberships_formatter':
$element[$delta]['#markup'] = _care_memberships_formatter($item, $entity, $field);
$item['local_unsent_changes'] = CARE_FIELDS_UNCHANGED;
break;
case 'care_memberships_simple_formatter':
$element[$delta]['#markup'] = _care_memberships_simple_formatter($item);
$item['local_unsent_changes'] = CARE_FIELDS_UNCHANGED;
break;
case 'care_date_formatter':
$month_names = date_month_names(TRUE);
$element[$delta]['#markup'] = $item['day'] . ' ' . $month_names[$item['month']] . ' ' . $item['year'];
break;
case 'care_address_formatter':
case 'care_address_oneline_formatter':
$lines = [];
if ($item['address_line_1']) {
$lines[] = check_plain($item['address_line_1']);
}
if ($item['address_line_2']) {
$lines[] = check_plain($item['address_line_2']);
}
if ($item['address_line_3']) {
$lines[] = check_plain($item['address_line_3']);
}
if ($item['town']) {
$lines[] = check_plain($item['town']);
}
if ($item['county']) {
$lines[] = check_plain($item['county']);
}
if ($item['country_code']) {
$county_options = [];
$country_codes = preg_split('/\r\n|[\r\n]/', variable_get('care_fields_countries', "UK|United Kingdom\nUSA|United States of America"));
foreach ($country_codes as $country_code) {
if ($country_code) {
$data = explode('|', $country_code);
$country_options[$data[0]] = $data[1];
}
}
if (array_key_exists($item['country_code'], $country_options)) {
$country = $country_options[$item['country_code']];
}
else {
$country = 'Country code ' . $item['country_code'];
}
$lines[] = check_plain($country);
}
if ($item['postcode']) {
$lines[] = check_plain($item['postcode']);
}
if ($display['type'] == 'care_address_formatter') {
$element[$delta]['#markup'] = implode("<br>", $lines);
}
else {
$element[$delta]['#markup'] = implode(", ", $lines);
}
if (variable_get('care_fields_show_numbers', TRUE) && user_access('care_fields view CARE numbers')) {
$element[$delta]['#markup'] .= ' <i>[' . $item['address_number'] . ']</i>';
}
break;
case 'care_address_minimal_formatter':
if ($item['postcode']) {
$element[$delta]['#markup'] = check_plain($item['address_line_1'] . ', ' . $item['postcode']);
}
break;
case 'care_telephone_formatter':
$element = _care_fields_care_telephone_formatter($delta, $item, $instance);
break;
case 'care_email_formatter':
$element = _care_fields_care_email_formatter($delta, $item, $instance);
break;
case 'care_field_changed_formatter':
if ($item['local_unsent_changes'] == CARE_FIELDS_CHANGED) {
if ($item_number == 0) {
$element[$delta]['#markup'] = 'New';
}
else {
$element[$delta]['#markup'] = 'Changed';
}
}
elseif ($item['local_unsent_changes'] == CARE_FIELDS_DELETED) {
$element[$delta]['#markup'] = 'Deleted';
}
else {
$element[$delta]['#markup'] = '-';
}
break;
}
}
return $element;
}
/**
* Implements hook_field_schema().
*/
function care_fields_field_schema($field) {
$schema_function = '_care_fields_' . $field['type'] . '_schema';
return $schema_function();
}
