-
Notifications
You must be signed in to change notification settings - Fork 1
/
eim.module
146 lines (133 loc) · 5.3 KB
/
eim.module
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
<?php
/**
* @file
* Extend the image module.
*
* Extended functionalities
* Supported entity types are node, comment and taxonomy term.
* - Add checkboxes to the content types image field edit form.
* - "Alt field required"
* - "Title field required"
* - Set the alt text field maxlength value on node edit forms to 128.
*/
/**
* Implements hook_field_info_alter().
*/
function eim_field_info_alter(&$info) {
if (isset($info['image'])) {
$info['image']['instance_settings']['alt_field_required'] = 0;
$info['image']['instance_settings']['title_field_required'] = 0;
}
}
/**
* Implements hook_form_FORM_ID_alter().
*
* Add checkboxes to the content types image field edit form.
* - "Alt field required"
* - "Title field required"
*/
function eim_form_field_ui_field_edit_form_alter(&$form, &$form_state, $form_id) {
if ($form['#field']['module'] != 'image') {
return;
}
// Uncompressed version: eim.module.js
backdrop_add_js(backdrop_get_path('module', 'eim') . '/js/eim.module.min.js', array('scope' => 'footer'));
$instance = $form['#instance'];
$settings = $form['#instance']['settings'];
if ($instance['entity_type']) {
$form['instance']['settings']['alt_field_required'] = array(
'#type' => 'checkbox',
'#title' => t('<em>Alt</em> field required'),
'#default_value' => $settings['alt_field_required'],
'#weight' => $form['instance']['settings']['alt_field']['#weight'] + .1,
'#states' => array(
'visible' => array(
'input[name="instance[settings][alt_field]"]' => array('checked' => TRUE),
),
),
);
$form['instance']['settings']['title_field_required'] = array(
'#type' => 'checkbox',
'#title' => t('<em>Title</em> field required'),
'#default_value' => $settings['title_field_required'],
'#weight' => $form['instance']['settings']['title_field']['#weight'] + .1,
'#states' => array(
'visible' => array(
'input[name="instance[settings][title_field]"]' => array('checked' => TRUE),
),
),
);
}
}
/**
* Implements hook_field_widget_WIDGET_TYPE_form_alter().
*
* Add a #process callback to the imagefield widget element so we
* can perform alters.
* See http://drupal.org/node/887424
*/
function eim_field_widget_image_image_form_alter(&$element, &$form_state, $context) {
foreach (element_children($element) as $delta) {
$element[$delta]['#process'][] = 'eim_imagefield_widget_process';
}
}
/**
* Element #process callback function.
*
* Action to
* - make alt and title field per content typeas required
* - alter the maxlength value of image alt fields for all content types
*
* @see eim_field_widget_image_image_form_alter()
*/
function eim_imagefield_widget_process($element, &$form_state, $form) {
$instance = field_info_instance($element['#entity_type'], $element['#field_name'], $element['#bundle']);
// Additional functions to validate field before inserting.
if (module_exists('insert')) {
// Expose module settings to Javascript.
backdrop_add_js(array('eim' => array('altRequired' => $instance['settings']['alt_field_required'])), 'setting');
backdrop_add_js(array('eim' => array('titleRequired' => $instance['settings']['title_field_required'])), 'setting');
if (($instance['settings']['alt_field_required'] || $instance['settings']['title_field_required'])) {
// If either the ALT or TITLE field are required, add the Insert validation.
backdrop_add_js(backdrop_get_path('module', 'eim') . '/js/eim.insert.validation.js');
}
}
if ($instance['settings']['alt_field_required'] == 1) {
$element['alt']['#title'] .= ' <span class="form-required" title="This field is required.">*</span>';
$element['alt']['#element_validate'] = array('_eim_required_fields_validate');
}
if ($instance['settings']['title_field_required'] == 1) {
$element['title']['#title'] .= ' <span class="form-required" title="This field is required.">*</span>';
$element['title']['#element_validate'] = array('_eim_required_fields_validate');
}
$element['alt']['#maxlength'] = 128;
return $element;
}
/**
* Validate callback for alt and title field, if the user wants them required.
*
* This is separated in a validate function instead of a #required flag to avoid
* being validated on the process callback.
*
* @see http://drupal.org/node/815144
*/
function _eim_required_fields_validate($element, &$form_state) {
// Only do validation if the function is triggered from other places than
// the image process form.
if (isset($form_state['triggering_element']['#submit']) && !in_array('file_managed_file_submit', $form_state['triggering_element']['#submit'])) {
// If the image is not there, we do not check for empty values.
$parents = $element['#parents'];
$field = array_pop($parents);
$image_field = backdrop_array_get_nested_value($form_state['input'], $parents);
// We check for the array key, so that it can be NULL (like if the user
// submits the form without using the "upload" button).
if (!is_array($image_field) || !array_key_exists($field, $image_field)) {
return;
}
// Check if field is left emtpy.
elseif (empty($image_field[$field])) {
form_error($element, t('The !title field is required', array('!title' => ucwords($field))));
return;
}
}
}