-
Notifications
You must be signed in to change notification settings - Fork 0
/
personality_test.module
226 lines (209 loc) · 7.05 KB
/
personality_test.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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
<?php
/**
* @file
* Contains functions to create a new content type and to override it henceforth.
*
* For creation only the first two functions hook_node_info and hook_node_form are needed.
* Custom fields are defined and added from personality_test.install file
*
* The core logic of this module is a multiple choice form.
* Once submitted, the result gets calculated and the view mode switches to 'result'
* to display prepared answers.
*/
/**
* Implements hook_node_info()
*/
function personality_test_node_info() {
return array(
// machine_name
'personality_test' => array(
'name' => t('Personality Test'),
'base' => 'personality_test', // name of module
'description' => t('Create custom personality tests.'),
'has_title' => TRUE,
'title_label' => t('Title'),
)
);
}
/**
* Implements hook_form() // that's the node form, actual quiz form see below
*/
function personality_test_form($node, $form_state) {
return node_content_form($node, $form_state);
}
/**
* Implements hook_entity_info_alter() // for creating a new view mode
*/
function personality_test_entity_info_alter(&$entity_info) {
$entity_info['node']['view modes']['result'] = array(
'label' => t('Result'),
'custom settings' => TRUE,
);
}
/**
* Implements hook_entity_view_mode_alter() // for switching the view mode
*/
function personality_test_entity_view_mode_alter(&$view_mode, $context) {
if (!user_is_anonymous() && $context['entity_type'] == 'node' && $context['entity']->type == 'personality_test' && isset($_SESSION['quiz'])) {
$view_mode = 'result';
}
}
/**
* Implements hook_node_view() // to call our quiz form // and add radios sort script
*/
function personality_test_node_view($node, $view_mode, $langcode) {
if ($node->type == 'personality_test') {
// default view mode, render quiz form
if ($view_mode != 'result') {
$form = drupal_get_form('personality_test', $node);
$node->content['personality_test'] = array(
'#markup' => drupal_render($form),
'#weight' => 2 // display before form
);
// add js
drupal_add_js(drupal_get_path('module', 'personality_test') .'/scripts/radios_sort.js');
}
// result view mode, render reset button
if ($view_mode == 'result') {
$form = drupal_get_form('personality_test_reset_button');
$node->content['reset_button'] = array(
'#markup' => drupal_render($form),
'#weight' => 10 // display after result text
);
}
}
}
/**
* Implements hook_node_view() // to unset second title display in result view
*/
function personality_test_preprocess_node(&$vars) {
// maybe ask for more conditions here
if ($vars['elements']['#view_mode'] == 'result') {
$vars['title'] = FALSE;
}
}
/**
* Implements hook_preprocess_field() // hide unwanted results from display
*/
function personality_test_preprocess_field(&$vars) {
$cookie = isset($_SESSION['quiz']) ? floatval($_SESSION['quiz']) : -1;
if ($vars['element']['#field_name'] == 'personality_test_results') {
if (0 <= $cookie && $cookie < floatval(2/3)) {
unset($vars['items'][1]);
unset($vars['items'][2]);
}
if (floatval(2/3) <= $cookie && $cookie <= floatval((2/3)*2)) {
unset($vars['items'][0]);
unset($vars['items'][2]);
}
if (floatval((2/3)*2) < $cookie && $cookie <= 2) {
unset($vars['items'][0]);
unset($vars['items'][1]);
}
}
}
/**
* Our actual form ...
*/
function personality_test($form, &$form_state, $node) {
// get field collection items from node
$items = $node->personality_test_questions[LANGUAGE_NONE];
// call helper to build form elements from field collection items
$elements = _personality_test_build_form($items);
foreach ($elements as $element => $controls) {
$form[$element] = $controls;
}
// append submit button
$form['submit_button'] = array(
'#type' => 'submit',
'#value' => t('Evaluation'),
);
return $form;
}
function personality_test_validate($form, &$form_state) {
// maybe check if all radios set
// dpm($form_state, 'FORM STATE');
// form_set_error('halt', 'HALT');
}
function personality_test_submit($form, &$form_state) {
$results = array();
if (isset($form_state['values'])) {
foreach ($form_state['values'] as $field => $value) {
if (preg_match('/question_/', $field)) {
$value = intval($value);
$results[$field] = $value;
}
}
}
$number_of_questions = count($results);
$results_sum = array_sum($results);
$score = $results_sum / $number_of_questions;
$_SESSION['quiz'] = $score;
}
/**
* ... and a reset button
*/
function personality_test_reset_button($form, &$form_state) {
$form['reset_button'] = array(
'#type' => 'submit',
'#value' => t('Reset'),
);
return $form;
}
function personality_test_reset_button_submit($form, &$form_state) {
unset($_SESSION['quiz']);
}
/**
* Implements hook_form_FORM_ID_alter() // adding a description to each results field collection item
*/
function personality_test_form_PERSONALITY_TEST_NODE_FORM_alter(&$form, $form_state, $form_id) {
$form['personality_test_results'][LANGUAGE_NONE][0]['personality_test_result_heading'][LANGUAGE_NONE][0]['value']['#description'] = t('Result A');
$form['personality_test_results'][LANGUAGE_NONE][1]['personality_test_result_heading'][LANGUAGE_NONE][0]['value']['#description'] = t('Result B');
$form['personality_test_results'][LANGUAGE_NONE][2]['personality_test_result_heading'][LANGUAGE_NONE][0]['value']['#description'] = t('Result C');
}
/**
* Helper function to build form elements from field collection items
*/
function _personality_test_build_form($items) {
$i = 0;
foreach ($items as $item) {
$i++;
$index = sprintf("%02d", $i);
// get questions, get options
$item_id = $item['value'];
$entity = entity_load('field_collection_item', array($item_id));
$question = $entity[$item_id]->personality_test_question_body[LANGUAGE_NONE][0]['value'];
$option_items = $entity[$item_id]->personality_test_answers[LANGUAGE_NONE];
$options = _personality_test_options($option_items);
// put everything together
$elements['question_'.$index] = array(
'#type' => 'container'
);
$elements['question_'.$index]['markup'] = array(
'#type' => 'markup',
'#prefix' => '<div class="question-number">',
'#suffix' => '</div>',
'#markup' => $index
);
$elements['question_'.$index]['question_'.$index] = array(
'#type' => 'radios',
'#title' => $question,
'#options' => $options
);
}
return $elements;
}
/**
* Helper function to build radio options from field collection items
*/
function _personality_test_options($option_items) {
$options = array();
foreach ($option_items as $item) {
$item_id = $item['value'];
$entity = entity_load('field_collection_item', array($item_id));
$answer = $entity[$item_id]->personality_test_answer_body[LANGUAGE_NONE][0]['value'];
$key = $entity[$item_id]->personality_test_answer_map[LANGUAGE_NONE][0]['value'];
$options[$key] = $answer;
}
return $options;
}