/[drupal]/contributions/modules/cck_fullname/cck_fullname.module
ViewVC logotype

Contents of /contributions/modules/cck_fullname/cck_fullname.module

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.9 - (show annotations) (download) (as text)
Mon Dec 17 20:28:05 2007 UTC (23 months, 1 week ago) by rconstantine
Branch: MAIN
CVS Tags: HEAD
Changes since 1.8: +33 -14 lines
File MIME type: text/x-php
#201359 took care of validation problems.
1 <?php
2 /**
3 * This is the cck_fullname module for use with CCK.
4 *
5 * <p>This file contains information on the cck_fullname module. The module adds to
6 * the field types available for inclusion in a content type definition. This field
7 * is made up of five standard html form text fields - prefix, first name, middle,
8 * last, and suffix - times two; one set for legal names and one for preferred.
9 * See the README for more details.</p>
10 * TODO it looks like the stars for the required fields might not work on small screens so
11 * instead, maybe use outlines - yellow for required on required fields, blue for required
12 * on optional field?
13 *
14 * @version $Id$;
15 * @package CCK_Fullname
16 * @category NeighborForge
17 * @author Ryan Constantine
18 * @filesource
19 * @license http://www.gnu.org/licenses/gpl.txt GNU_GENERAL_PUBLIC_LICENSE
20 * @link none yet
21 */
22
23
24 //-----------------------------------------CCK hooks--------------------------------------------------
25 //-----------------------------------------CCK hooks--------------------------------------------------
26 //-----------------------------------------CCK hooks--------------------------------------------------
27
28 /**
29 * Implementation of hook_field_info().
30 *
31 * @return
32 * An array keyed by field type name. Each element of the array is an associative
33 * array with these keys and values:
34 * - "label": The human-readable label for the field type.
35 */
36 function cck_fullname_field_info() {
37 return array(
38 'cck_fullname' => array('label' => 'Full Name'),
39 );
40 } // function cck_fullname_field_info()
41
42 /**
43 * Implementation of hook_field_settings().
44 *
45 * @param $op
46 * The operation to be performed.
47 * @param $field
48 * The field on which the operation is to be performed.
49 * @return
50 * This varies depending on the operation.
51 * - "form": an array of form elements to add to
52 * the settings page.
53 * - "validate": no return value. Use form_set_error().
54 * - "save": an array of names of form elements to
55 * be saved in the database.
56 * - "database columns": an array keyed by column name, with arrays of column
57 * information as values.
58 * - "filters": an array whose values are 'filters'
59 * definitions as expected by views.module (see Views Documentation).
60 * - "callbacks": an array describing the field's behaviour regarding hook_field
61 * operations. The array is keyed by hook_field operations ('view', 'validate'...)
62 * and has the following possible values :
63 * CONTENT_CALLBACK_NONE : do nothing for this operation
64 * CONTENT_CALLBACK_CUSTOM : use the behaviour in hook_field(operation)
65 * CONTENT_CALLBACK_DEFAULT : use content.module's default bahaviour
66 * Note : currently only the 'view' operation implements this feature.
67 * All other field operation implemented by the module _will_ be executed
68 * no matter what.
69 */
70 function cck_fullname_field_settings($op, $field) {
71 switch ($op) {
72 case 'form':
73 $form = array();
74
75 //borrowed from namefield module
76 //----------allow content type creator to determine which fields are required-----------
77 $required_default = array();
78 if (is_array($field['required_parts'])) {
79 foreach ($field['required_parts'] as $part => $required) {
80 if ($required) { $required_default[] = $part; }
81 } // foreach possibly-required part
82 } else {
83 $required_default = array('legal_first', 'legal_last');
84 } // if we can make up our own defaults
85
86 $form['required'] = array(
87 '#type' => 'fieldset',
88 '#weight' => 3,
89 '#collapsible' => TRUE,
90 '#collapsed' => TRUE,
91 '#title' => t("Required Parts"),
92 );
93 $form['required']['required_parts'] = array(
94 '#type' => 'checkboxes',
95 '#title' => t("Required Parts"),
96 '#description' => t("Choose which of these components should be required.
97 Only applies if you chose the field in the above <em>Legal name</em> or <em>Preferred name</em> sections,
98 either <strong>Required</strong>, or <strong>Optional</strong>. (Ex. 1) If you <strong>Require</strong>
99 Legal names, then the fields checked here will be a part of that requirement. Unchecked fields will be optional
100 if you elected to use them above.
101 (Ex. 2) If Preferred names are <strong>Optional</strong>, then all fields are optional until one is filled in,
102 then those checked here are required. Unchecked fields would still be optional. This will
103 prevent the entering of partial/incomplete names."),
104 '#default_value' => $required_default,
105 '#options' => array(
106 'legal_prefix' => t("Legal Prefix"),
107 'legal_first' => t("Legal First"),
108 'legal_middle' => t("Legal Middle"),
109 'legal_last' => t("Legal Last"),
110 'legal_suffix' => t("Legal Suffix"),
111 'preferred_prefix' => t("Preferred Prefix"),
112 'preferred_first' => t("Preferred First"),
113 'preferred_middle' => t("Preferred Middle"),
114 'preferred_last' => t("Preferred Last"),
115 'preferred_suffix' => t("Preferred Suffix"),
116 ),
117 );
118
119 //----------allow content type creator to determine which legal name fields to use-----------
120 $legal_default = array();
121 if (is_array($field['legalname'])) {
122 foreach ($field['legalname'] as $part => $legal) {
123 if ($legal) { $legal_default[] = $part; }
124 } // foreach possibly-legal part
125 } else {
126 $legal_default = array('legal_first', 'legal_middle', 'legal_last');
127 } // if we can make up our own default
128
129 $form['legal_name'] = array(
130 '#type' => 'fieldset',
131 '#weight' => 2,
132 '#collapsible' => TRUE,
133 '#collapsed' => TRUE,
134 '#title' => t('Legal Name'),
135 );
136 $form['legal_name']['use_legalname'] = array(
137 '#type' => 'radios',
138 '#title' => t('Use legal name?'),
139 '#description' => t("Check how legal names should be used. The legal name is the default name when only one is needed."),
140 '#required' => TRUE,
141 '#default_value' => isset($field['use_legalname']) ? $field['use_legalname'] : 'legal_require',
142 '#options' => array(
143 'legal_require' => t("Required"),
144 'legal_optional' => t("Optional"),
145 ),
146 );
147 $form['legal_name']['legalname'] = array(
148 '#type' => 'checkboxes',
149 '#title' => t('Legal name'),
150 '#description' => t("Check which of these fields should be available for legal names."),
151 '#required' => TRUE,
152 '#default_value' => $legal_default,
153 '#options' => array(
154 'legal_prefix' => t("Prefix"),
155 'legal_first' => t("First"),
156 'legal_middle' => t("Middle"),
157 'legal_last' => t("Last"),
158 'legal_suffix' => t("Suffix"),
159 ),
160 );
161 //end borrowed section
162
163 //similar to copied section
164 //----------allow content type creator to determine which preferred name fields to use-----------
165 $preferred_default = array();
166 if (is_array($field['preferredname'])) {
167 foreach ($field['preferredname'] as $part => $preferred) {
168 if ($preferred) { $preferred_default[] = $part; }
169 } // foreach possibly-legal part
170 } else {
171 $preferred_default = array('preferred_first', 'preferred_middle', 'preferred_last');
172 } // if we can make up our own default
173
174 $form['preferred_name'] = array(
175 '#type' => 'fieldset',
176 '#weight' => 2,
177 '#collapsible' => TRUE,
178 '#collapsed' => TRUE,
179 '#title' => t('Preferred Name'),
180 );
181 $form['preferred_name']['use_preferredname'] = array(
182 '#type' => 'radios',
183 '#title' => t('Use preferred name?'),
184 '#description' => t("Check how preferred names should be used."),
185 '#required' => TRUE,
186 '#default_value' => isset($field['use_preferredname']) ? $field['use_preferredname'] : 'preferred_optional',
187 '#options' => array(
188 'preferred_require' => t("Required"),
189 'preferred_optional' => t("Optional"),
190 'preferred_hide' => t("Don't use"),
191 ),
192 );
193 $form['preferred_name']['preferredname'] = array(
194 '#type' => 'checkboxes',
195 '#title' => t('Preferred Name'),
196 '#description' => t("Check which of these fields should be available for preferred names."),
197 '#required' => TRUE,
198 '#default_value' => $preferred_default,
199 '#options' => array(
200 'preferred_prefix' => t("Prefix"),
201 'preferred_first' => t("First"),
202 'preferred_middle' => t("Middle"),
203 'preferred_last' => t("Last"),
204 'preferred_suffix' => t("Suffix"),
205 ),
206 );
207
208 $form['note'] = array(
209 '#type' => 'item',
210 '#title' => t('Notes'),
211 '#weight' => -1,
212 '#description' => t('In the "Help text" field above, cut and paste the following: Notice the stars indicating what is required.
213 If either "Legal name" or "Preferred name" have stars next to them, that means you must fill out at least the fields which have a highlighted border.
214 If either "Legal name" or "Preferred name" do not have stars, then you only fill out the fields which have a highlighted border if you fill out ANY of the
215 fields. If you leave all highlighted fields blank for an unstarred name, then you don\'t have to fill out ANY of them. For multiple sets of
216 names, names after the first set are always optional, but their fields will follow the same rules as optional names already explained.'),
217 );
218
219 $form['middle_initial'] = array(//TODO remove this because with the ability to specify the field length, this is redundant
220 '#type' => 'checkbox',
221 '#title' => t('Use middle initial only?'),
222 '#default_value' => isset($field['middle_initial']) ? $field['middle_initial'] : 1,
223 '#return_value' => 1,
224 '#description' => t('Do you want to store only middle initials? This is not simply a display option and should be set only once. Changing it has unpredictable results.'),
225 );
226
227 //-------------specify maximum lengths for each field------------------------
228 $form['max_lengths_legal'] = array(
229 '#type' => 'fieldset',
230 '#weight' => 4,
231 '#title' => t('Legal name maximum field lengths'),
232 '#collapsible' => TRUE,
233 '#collapsed' => TRUE,
234 );
235 $form['max_lengths_legal']['max_length_prefix_legal'] = array(
236 '#type' => 'textfield',
237 '#title' => t('Prefix maximum length'),
238 '#size' => 1,
239 '#default_value' => isset($field['max_length_prefix_legal']) ? $field['max_length_prefix_legal'] : '',
240 '#required' => FALSE,
241 '#description' => t('The maximum length of the field in characters. Leave blank for an unlimited size.'),
242 );
243 $form['max_lengths_legal']['max_length_first_legal'] = array(
244 '#type' => 'textfield',
245 '#title' => t('First name maximum length'),
246 '#size' => 6,
247 '#default_value' => isset($field['max_length_first_legal']) ? $field['max_length_first_legal'] : '',
248 '#required' => FALSE,
249 '#description' => t('The maximum length of the field in characters. Leave blank for an unlimited size.'),
250 );
251 $form['max_lengths_legal']['max_length_middle_legal'] = array(
252 '#type' => 'textfield',
253 '#title' => t('Middle name maximum length'),
254 '#size' => 6,
255 '#required' => FALSE,
256 '#description' => t('The maximum length of the field in characters (unless Middle Initial is used instead). Leave blank for an unlimited size.'),
257 );
258 if ($field['middle_initial'] == 1) {
259 $form['max_lengths_legal']['max_length_middle_legal']['#default_value'] = 1;
260 }
261 else {
262 $form['max_lengths_legal']['max_length_middle_legal']['#default_value'] = isset($field['max_length_middle_legal']) ? $field['max_length_middle_legal'] : '';
263 }
264 $form['max_lengths_legal']['max_length_last_legal'] = array(
265 '#type' => 'textfield',
266 '#title' => t('Last name maximum length'),
267 '#size' => 6,
268 '#default_value' => isset($field['max_length_last_legal']) ? $field['max_length_last_legal'] : '',
269 '#required' => FALSE,
270 '#description' => t('The maximum length of the field in characters. Leave blank for an unlimited size.'),
271 );
272 $form['max_lengths_legal']['max_length_suffix_legal'] = array(
273 '#type' => 'textfield',
274 '#title' => t('Suffix maximum length'),
275 '#size' => 1,
276 '#default_value' => isset($field['max_length_suffix_legal']) ? $field['max_length_suffix_legal'] : '',
277 '#required' => FALSE,
278 '#description' => t('The maximum length of the field in characters. Leave blank for an unlimited size.'),
279 );
280
281 $form['max_lengths_preferred'] = array(
282 '#type' => 'fieldset',
283 '#weight' => 4,
284 '#title' => t('Preferred name maximum field lengths'),
285 '#collapsible' => TRUE,
286 '#collapsed' => TRUE,
287 );
288 $form['max_lengths_preferred']['max_length_prefix_preferred'] = array(
289 '#type' => 'textfield',
290 '#title' => t('Prefix maximum length'),
291 '#size' => 1,
292 '#default_value' => isset($field['max_length_prefix_preferred']) ? $field['max_length_prefix_preferred'] : '',
293 '#required' => FALSE,
294 '#description' => t('The maximum length of the field in characters. Leave blank for an unlimited size.'),
295 );
296 $form['max_lengths_preferred']['max_length_first_preferred'] = array(
297 '#type' => 'textfield',
298 '#title' => t('First name maximum length'),
299 '#size' => 6,
300 '#default_value' => isset($field['max_length_first_preferred']) ? $field['max_length_first_preferred'] : '',
301 '#required' => FALSE,
302 '#description' => t('The maximum length of the field in characters. Leave blank for an unlimited size.'),
303 );
304 $form['max_lengths_preferred']['max_length_middle_preferred'] = array(
305 '#type' => 'textfield',
306 '#title' => t('Middle name maximum length'),
307 '#size' => 6,
308 '#required' => FALSE,
309 '#description' => t('The maximum length of the field in characters (unless Middle Initial is used instead). Leave blank for an unlimited size.'),
310 );
311 if ($field['middle_initial'] == 1) {
312 $form['max_lengths_preferred']['max_length_middle_preferred']['#default_value'] = 1;
313 }
314 else {
315 $form['max_lengths_preferred']['max_length_middle_preferred']['#default_value'] = isset($field['max_length_middle_preferred']) ? $field['max_length_middle_preferred'] : '';
316 }
317 $form['max_lengths_preferred']['max_length_last_preferred'] = array(
318 '#type' => 'textfield',
319 '#title' => t('Last name maximum length'),
320 '#size' => 6,
321 '#default_value' => isset($field['max_length_last_preferred']) ? $field['max_length_last_preferred'] : '',
322 '#required' => FALSE,
323 '#description' => t('The maximum length of the field in characters. Leave blank for an unlimited size.'),
324 );
325 $form['max_lengths_preferred']['max_length_suffix_preferred'] = array(
326 '#type' => 'textfield',
327 '#title' => t('Suffix maximum length'),
328 '#size' => 1,
329 '#default_value' => isset($field['max_length_suffix_preferred']) ? $field['max_length_suffix_preferred'] : '',
330 '#required' => FALSE,
331 '#description' => t('The maximum length of the field in characters. Leave blank for an unlimited size.'),
332 );
333
334 return $form;
335
336 case 'save':
337 return array(
338 'required_parts',
339 'use_legalname',
340 'legalname',
341 'use_preferredname',
342 'preferredname',
343 'middle_initial',
344 'max_length_prefix_legal',
345 'max_length_first_legal',
346 'max_length_middle_legal',
347 'max_length_last_legal',
348 'max_length_suffix_legal',
349 'max_length_prefix_preferred',
350 'max_length_first_preferred',
351 'max_length_middle_preferred',
352 'max_length_last_preferred',
353 'max_length_suffix_preferred',
354 );
355
356 case 'database columns':
357 $columns = array(
358 'last' => array('type' => 'varchar', 'not null' => TRUE, 'default' => "''", 'sortable' => TRUE),
359 'first' => array('type' => 'varchar', 'not null' => TRUE, 'default' => "''", 'sortable' => TRUE),
360 'middle' => array('type' => 'varchar', 'not null' => TRUE, 'default' => "''", 'sortable' => TRUE),
361 'prefix' => array('type' => 'varchar', 'not null' => TRUE, 'default' => "''", 'sortable' => TRUE),
362 'suffix' => array('type' => 'varchar', 'not null' => TRUE, 'default' => "''", 'sortable' => TRUE),
363 'last_preferred' => array('type' => 'varchar', 'not null' => TRUE, 'default' => "''", 'sortable' => TRUE),
364 'first_preferred' => array('type' => 'varchar', 'not null' => TRUE, 'default' => "''", 'sortable' => TRUE),
365 'middle_preferred' => array('type' => 'varchar', 'not null' => TRUE, 'default' => "''", 'sortable' => TRUE),
366 'prefix_preferred' => array('type' => 'varchar', 'not null' => TRUE, 'default' => "''", 'sortable' => TRUE),
367 'suffix_preferred' => array('type' => 'varchar', 'not null' => TRUE, 'default' => "''", 'sortable' => TRUE),
368 );
369 //adjust field lengths based on settings for legal names
370 if ($field['max_lengths_legal']['max_length_prefix_legal'] == 0 || $field['max_lengths_legal']['max_length_prefix_legal'] > 255) {
371 $columns['prefix']['type'] = 'longtext';
372 }
373 else {
374 $columns['prefix']['length'] = $field['max_lengths_legal']['max_length_prefix_legal'];
375 }
376 if ($field['max_lengths_legal']['max_length_first_legal'] == 0 || $field['max_lengths_legal']['max_length_first_legal'] > 255) {
377 $columns['first']['type'] = 'longtext';
378 }
379 else {
380 $columns['first']['length'] = $field['max_lengths_legal']['max_length_first_legal'];
381 }
382 if (($field['max_lengths_legal']['max_length_middle_legal'] == 0 || $field['max_lengths_legal']['max_length_middle_legal'] > 255) && ($field['middle_initial'] != 1)) {
383 $columns['middle']['type'] = 'longtext';
384 }
385 elseif ($field['middle_initial'] == 1) {
386 $columns['middle']['length'] = 1;
387 }
388 else {
389 $columns['middle']['length'] = $field['max_lengths_legal']['max_length_middle_legal'];
390 }
391 if ($field['max_lengths_legal']['max_length_last_legal'] == 0 || $field['max_lengths_legal']['max_length_last_legal'] > 255) {
392 $columns['last']['type'] = 'longtext';
393 }
394 else {
395 $columns['last']['length'] = $field['max_lengths_legal']['max_length_last_legal'];
396 }
397 if ($field['max_lengths_legal']['max_length_suffix_legal'] == 0 || $field['max_lengths_legal']['max_length_suffix_legal'] > 255) {
398 $columns['suffix']['type'] = 'longtext';
399 }
400 else {
401 $columns['suffix']['length'] = $field['max_lengths_legal']['max_length_suffix_legal'];
402 }
403
404 //adjust field lengths based on settings for preferred names
405 if ($field['max_lengths_preferred']['max_length_prefix_preferred'] == 0 || $field['max_lengths_preferred']['max_length_prefix_preferred'] > 255) {
406 $columns['prefix_preferred']['type'] = 'longtext';
407 }
408 else {
409 $columns['prefix_preferred']['length'] = $field['max_lengths_preferred']['max_length_prefix_preferred'];
410 }
411 if ($field['max_lengths_preferred']['max_length_first_preferred'] == 0 || $field['max_lengths_preferred']['max_length_first_preferred'] > 255) {
412 $columns['first_preferred']['type'] = 'longtext';
413 }
414 else {
415 $columns['first_preferred']['length'] = $field['max_lengths_preferred']['max_length_first_preferred'];
416 }
417 if (($field['max_lengths_preferred']['max_length_middle_preferred'] == 0 || $field['max_lengths_preferred']['max_length_middle_preferred'] > 255) && ($field['middle_initial'] != 1)) {
418 $columns['middle_preferred']['type'] = 'longtext';
419 }
420 elseif ($field['middle_initial'] == 1) {
421 $columns['middle_preferred']['length'] = 1;
422 }
423 else {
424 $columns['middle_preferred']['length'] = $field['max_lengths_preferred']['max_length_middle_preferred'];
425 }
426 if ($field['max_lengths_preferred']['max_length_last_preferred'] == 0 || $field['max_lengths_preferred']['max_length_last_preferred'] > 255) {
427 $columns['last_preferred']['type'] = 'longtext';
428 }
429 else {
430 $columns['last_preferred']['length'] = $field['max_lengths_preferred']['max_length_last_preferred'];
431 }
432 if ($field['max_lengths_preferred']['max_length_suffix_preferred'] == 0 || $field['max_lengths_preferred']['max_length_suffix_preferred'] > 255) {
433 $columns['suffix_preferred']['type'] = 'longtext';
434 }
435 else {
436 $columns['suffix_preferred']['length'] = $field['max_lengths_preferred']['max_length_suffix_preferred'];
437 }
438 return $columns;
439
440 case 'filters':
441 return array(
442 'default' => array(
443 'operator' => 'views_handler_operator_like',
444 'handler' => 'views_handler_filter_like',
445 ),
446 );
447
448 case 'callbacks'://pairs up with cck_fullname_field::view
449 return array(
450 'view' => CONTENT_CALLBACK_CUSTOM,
451 );
452 }
453 } // function cck_fullname_field_settings()
454
455 /**
456 * Implementation of hook_field().
457 *
458 * Validate the user's input. At present, only English alphabetic characters
459 * are valid. Would like to add support for other languages.
460 * Or present the data for viewing.
461 * @param $op
462 * What kind of action is being performed.
463 * @param &$node
464 * The node the action is being performed on.
465 * @param $field
466 * The field the action is being performed on.
467 * @param &$node_field
468 * The contents of the field in this node. Changes to this variable will
469 * be saved back to the node object.
470 * @return
471 * This varies depending on the operation.
472 * - The "load" operation should return an object containing extra values
473 * to be merged into the node object.
474 * - The "view" operation should return a string containing an HTML
475 * representation of the field data.
476 * - The "insert", "update", "delete", "validate", and "submit" operations
477 * have no return value.
478 */
479 function cck_fullname_field($op, &$node, $field, &$items, $teaser, $page) {
480 switch ($op) {
481 case 'submit':
482 $info = content_database_info($field['field_name']);
483 break;
484 case 'validate':
485 //validate field lengths
486 //validate the legal name field lengths; TODO restructure these into one big foreach instead of several small ones - use a case statement on $data, then test field lengths in each case
487 if ($field['max_lengths_legal']['max_length_prefix_legal'] > 0) {
488 foreach ($items as $delta => $data) {
489 $error_field_prefix = $field['field_name']. '][' .$delta. '][prefix';
490 if (strlen($data['prefix']) > $field['max_lengths_legal']['max_length_prefix_legal']) {
491 form_set_error($error_field_prefix, t('%label\'s Prefix Name field is longer than %max characters.', array('%label' => $field['widget']['label'], '%max' => $field['max_lengths_legal']['max_length_prefix_legal'])));
492 }
493 }
494 }
495 if ($field['max_lengths_legal']['max_length_first_legal'] > 0) {
496 foreach ($items as $delta => $data) {
497 $error_field_first = $field['field_name']. '][' .$delta. '][first';
498 if (strlen($data['first']) > $field['max_lengths_legal']['max_length_first_legal']) {
499 form_set_error($error_field_first, t('%label\'s First Name field is longer than %max characters.', array('%label' => $field['widget']['label'], '%max' => $field['max_lengths_legal']['max_length_first_legal'])));
500 }
501 }
502 }
503 if ($field['max_lengths_legal']['max_length_middle_legal'] > 0) {
504 foreach ($items as $delta => $data) {
505 $error_field_middle = $field['field_name']. '][' .$delta. '][middle';
506 if (strlen($data['middle']) > $field['max_lengths_legal']['max_length_middle_legal']) {
507 form_set_error($error_field_middle, t('%label\'s Middle Name field is longer than %max characters.', array('%label' => $field['widget']['label'], '%max' => $field['max_lengths_legal']['max_length_middle_legal'])));
508 }
509 }
510 }
511 if ($field['max_lengths_legal']['max_length_last_legal'] > 0) {
512 foreach ($items as $delta => $data) {
513 $error_field_last = $field['field_name']. '][' .$delta. '][last';
514 if (strlen($data['last']) > $field['max_lengths_legal']['max_length_last_legal']) {
515 form_set_error($error_field_last, t('%label\'s Last Name field is longer than %max characters.', array('%label' => $field['widget']['label'], '%max' => $field['max_lengths_legal']['max_length_last_legal'])));
516 }
517 }
518 }
519 if ($field['max_lengths_legal']['max_length_suffix_legal'] > 0) {
520 foreach ($items as $delta => $data) {
521 $error_field_suffix = $field['field_name']. '][' .$delta. '][suffix';
522 if (strlen($data['suffix']) > $field['max_lengths_legal']['max_length_suffix_legal']) {
523 form_set_error($error_field_suffix, t('%label\'s Suffix Name field is longer than %max characters.', array('%label' => $field['widget']['label'], '%max' => $field['max_lengths_legal']['max_length_suffix_legal'])));
524 }
525 }
526 }
527
528 //validate the preferred name field lengths
529 if ($field['max_lengths_preferred']['max_length_prefix_preferred'] > 0) {
530 foreach ($items as $delta => $data) {
531 $error_field_prefix_preferred = $field['field_name']. '][' .$delta. '][prefix_preferred';
532 if (strlen($data['prefix_preferred']) > $field['max_lengths_preferred']['max_length_prefix_preferred']) {
533 form_set_error($error_field_prefix_preferred, t('%label\'s Prefix Name field is longer than %max characters.', array('%label' => $field['widget']['label'], '%max' => $field['max_lengths_preferred']['max_length_prefix_preferred'])));
534 }
535 }
536 }
537 if ($field['max_lengths_preferred']['max_length_first_preferred'] > 0) {
538 foreach ($items as $delta => $data) {
539 $error_field_first_preferred = $field['field_name']. '][' .$delta. '][first_preferred';
540 if (strlen($data['first_preferred']) > $field['max_lengths_preferred']['max_length_first_preferred']) {
541 form_set_error($error_field_first_preferred, t('%label\'s First Name field is longer than %max characters.', array('%label' => $field['widget']['label'], '%max' => $field['max_lengths_preferred']['max_length_first_preferred'])));
542 }
543 }
544 }
545 if ($field['max_lengths_preferred']['max_length_middle_preferred'] > 0) {
546 foreach ($items as $delta => $data) {
547 $error_field_middle_preferred = $field['field_name']. '][' .$delta. '][middle_preferred';
548 if (strlen($data['middle_preferred']) > $field['max_lengths_preferred']['max_length_middle_preferred']) {
549 form_set_error($error_field_middle_preferred, t('%label\'s Middle Name field is longer than %max characters.', array('%label' => $field['widget']['label'], '%max' => $field['max_lengths_preferred']['max_length_middle_preferred'])));
550 }
551 }
552 }
553 if ($field['max_lengths_preferred']['max_length_last_preferred'] > 0) {
554 foreach ($items as $delta => $data) {
555 $error_field_last_preferred = $field['field_name']. '][' .$delta. '][last_preferred';
556 if (strlen($data['last_preferred']) > $field['max_lengths_preferred']['max_length_last_preferred']) {
557 form_set_error($error_field_last_preferred, t('%label\'s Last Name field is longer than %max characters.', array('%label' => $field['widget']['label'], '%max' => $field['max_lengths_preferred']['max_length_last_preferred'])));
558 }
559 }
560 }
561 if ($field['max_lengths_preferred']['max_length_suffix_preferred'] > 0) {
562 foreach ($items as $delta => $data) {
563 $error_field_suffix_preferred = $field['field_name']. '][' .$delta. '][suffix_preferred';
564 if (strlen($data['suffix_preferred']) > $field['max_lengths_preferred']['max_length_suffix_preferred']) {
565 form_set_error($error_field_suffix_preferred, t('%label\'s Suffix Name field is longer than %max characters.', array('%label' => $field['widget']['label'], '%max' => $field['max_lengths_preferred']['max_length_suffix_preferred'])));
566 }
567 }
568 }
569
570 //validate required-ness of fields
571 foreach ($items as $delta => $data) {
572 if (is_numeric($delta)) {
573 //deal with legal name fields
574 if (($field['use_legalname'] == 'legal_require') || ($field['use_legalname'] == 'legal_optional')) {
575 $legal_empty = (empty($data['prefix']) && empty($data['first']) && empty($data['middle']) && empty($data['last']) && empty($data['suffix']));
576 if (!$legal_empty) {
577 if (empty($data['prefix']) && $field['required_parts']['legal_prefix'] === 'legal_prefix' && !empty($field['legalname']['legal_prefix'])) {
578 $error_field_prefix = $field['field_name']. '][' .$delta. '][prefix';
579 form_set_error($error_field_prefix, t('Prefix field is required.'));
580 }
581 if (empty($data['first']) && $field['required_parts']['legal_first'] === 'legal_first' && !empty($field['legalname']['legal_first'])) {
582 $error_field_first = $field['field_name']. '][' .$delta. '][first';
583 form_set_error($error_field_first, t('First name field is required.'));
584 }
585 if (empty($data['middle']) && $field['required_parts']['legal_middle'] === 'legal_middle' && !empty($field['legalname']['legal_middle'])) {
586 $error_field_middle = $field['field_name']. '][' .$delta. '][middle';
587 form_set_error($error_field_middle, t('Middle name field is required.'));
588 }
589 if (empty($data['last']) && $field['required_parts']['legal_last'] === 'legal_last' && !empty($field['legalname']['legal_last'])) {
590 $error_field_last = $field['field_name']. '][' .$delta. '][last';
591 form_set_error($error_field_last, t('Last name field is required.'));
592 }
593 if (empty($data['suffix']) && $field['required_parts']['legal_suffix'] === 'legal_suffix' && !empty($field['legalname']['legal_suffix'])) {
594 $error_field_suffix = $field['field_name']. '][' .$delta. '][suffix';
595 form_set_error($error_field_suffix, t('Suffix field is required.'));
596 }
597 }
598 elseif ($field['use_legalname'] == 'legal_require') {
599 form_set_error($field['field_name']. '][' .$delta. ']', t('Legal name field is required.'));
600 }
601 }
602
603 //deal with preferred name fields
604 if (($field['use_preferredname'] == 'preferred_require') || ($field['use_preferredname'] == 'preferred_optional')) {
605 $preferred_empty = (empty($data['prefix_preferred']) && empty($data['first_preferred']) && empty($data['middle_preferred']) && empty($data['last_preferred']) && empty($data['suffix_preferred']));
606 if (!$preferred_empty) {
607 if (empty($data['prefix_preferred']) && $field['required_parts']['preferred_prefix'] === 'preferred_prefix' && !empty($field['preferredname']['preferred_prefix'])) {
608 $error_field_prefix_preferred = $field['field_name']. '][' .$delta. '][prefix_preferred';
609 form_set_error($error_field_prefix_preferred, t('Prefix field is required.'));
610 }
611 if (empty($data['first_preferred']) && $field['required_parts']['preferred_first'] === 'preferred_first' && !empty($field['preferredname']['preferred_first'])) {
612 $error_field_first_preferred = $field['field_name']. '][' .$delta. '][first_preferred';
613 form_set_error($error_field_first_preferred, t('First name field is required.'));
614 }
615 if (empty($data['middle_preferred']) && $field['required_parts']['preferred_middle'] === 'preferred_middle' && !empty($field['preferredname']['preferred_middle'])) {
616 $error_field_middle_preferred = $field['field_name']. '][' .$delta. '][middle_preferred';
617 form_set_error($error_field_middle_preferred, t('Middle name field is required.'));
618 }
619 if (empty($data['last_preferred']) && $field['required_parts']['preferred_last'] === 'preferred_last' && !empty($field['preferredname']['preferred_last'])) {
620 $error_field_last_preferred = $field['field_name']. '][' .$delta. '][last_preferred';
621 form_set_error($error_field_last_preferred, t('Last name field is required.'));
622 }
623 if (empty($data['suffix_preferred']) && $field['required_parts']['preferred_suffix'] === 'preferred_suffix' && !empty($field['preferredname']['preferred_suffix'])) {
624 $error_field_suffix_preferred = $field['field_name']. '][' .$delta. '][suffix_preferred';
625 form_set_error($error_field_suffix_preferred, t('Suffix field is required.'));
626 }
627 }
628 elseif ($field['use_preferredname'] == 'preferred_require') {
629 form_set_error($field['field_name']. '][' .$delta. ']', t('Preferred name field is required.'));
630 }
631 }
632 }
633 }
634 break;
635
636 case 'view':
637 $context = $teaser ? 'teaser' : 'full';
638 $formatter = isset($field['display_settings'][$context]['format']) ? $field['display_settings'][$context]['format'] : 'default';
639 foreach ($items as $delta => $item) {
640 $items[$delta]['view'] = content_format($field, $item, $formatter, $node);
641 }
642 return theme('field', $node, $field, $items, $teaser, $page);
643 }
644 } // function cck_fullname_field()
645
646 /**
647 * Implementation of hook_field_formatter_info().
648 */
649 function cck_fullname_field_formatter_info() {
650 return array(
651 'default' => array(
652 'label' => t('Default, prefix first middle last suffix'),
653 'field types' => array('cck_fullname'),
654 ),
655 'last_name_only' => array(
656 'label' => t('Last name only'),
657 'field types' => array('cck_fullname'),
658 ),
659 'first_name_only' => array(
660 'label' => t('First name only'),
661 'field types' => array('cck_fullname'),
662 ),
663 'last_name_first' => array(
664 'label' => t('Last, first middle'),
665 'field types' => array('cck_fullname'),
666 ),
667 );
668 } // function cck_fullname_field_formatter_info()
669
670 /**
671 * Implemetation of hook_field_formatter().
672 *
673 * Here we format the data for display and make sure it is plain text. It should be as
674 * elsewhere it was validated as alphabetic characters only.
675 * We also check the length of each name and if it's only one character, place a period
676 * after it. Primarily this is for people who go by two initials, or who use an initial
677 * for their first name, but not middle.
678 * The $node argument is necessary so that filter access can be checked on
679 * node preview.
680 * @param $field
681 * The field the action is being performed on.
682 * @param $item
683 * An array, keyed by column, of the data stored for this item in this field.
684 * @param $formatter
685 * The name of the formatter being used to display the field. In our case, we name
686 * it directly, rather than send it through content_format() and therefore we don't
687 * use hook_field_formatter_info either.
688 * @param $node
689 * The node object, for context. Will be NULL in some cases.
690 * Warning : when displaying field retrieved by Views, $node will not
691 * be a "full-fledged" node object, but an object containg the data returned
692 * by the Views query (at least nid, vid, changed)
693 * @return
694 * An HTML string containing the formatted item.
695 */
696 function cck_fullname_field_formatter($field, $item, $formatter, $node) {
697 $output = '';
698 if (!key_exists('prefix', $item)) {
699 return '';
700 }
701 switch ($formatter) {
702 case 'default':
703 //check and clean the values for output
704 if (!empty($item['prefix'])) {
705 $cck_legalname['prefix'] = strip_tags($item['prefix']);
706 }
707 if (!empty($item['first'])) {
708 $cck_legalname['first'] = strip_tags($item['first']);
709 }
710 if (!empty($item['middle'])) {
711 $cck_legalname['middle'] = strip_tags($item['middle']);
712 }
713 if (!empty($item['last'])) {
714 $cck_legalname['last'] = strip_tags($item['last']);
715 }
716 if (!empty($item['suffix'])) {
717 $cck_legalname['suffix'] = strip_tags($item['suffix']);
718 }
719 if (!empty($cck_legalname)) {
720 $output .= t('Legal name: '). theme('cck_fullname', $cck_legalname, $field);
721 }
722 if (!empty($item['prefix_preferred'])) {
723 $cck_preferredname['prefix'] = strip_tags($item['prefix_preferred']);
724 }
725 if (!empty($item['first_preferred'])) {
726 $cck_preferredname['first'] = strip_tags($item['first_preferred']);
727 }
728 if (!empty($item['middle_preferred'])) {
729 $cck_preferredname['middle'] = strip_tags($item['middle_preferred']);
730 }
731 if (!empty($item['last_preferred'])) {
732 $cck_preferredname['last'] = strip_tags($item['last_preferred']);
733 }
734 if (!empty($item['suffix_preferred'])) {
735 $cck_preferredname['suffix'] = strip_tags($item['suffix_preferred']);
736 }
737 if (!empty($cck_preferredname)) {//if there is a preferred name, print it instead of the legal name (overwrite $output)
738 $output = t('Preferred name: '). theme('cck_fullname', $cck_preferredname, $field);
739 }
740 return $output;
741 case 'last_name_only'://output legal last name
742 //check and clean the values for output
743 if (isset($item['last'])) {
744 $cck_fullname['last'] = strip_tags($item['last']);
745 }
746 $output .= theme('cck_fullname', $cck_fullname, $field);
747 return $output;
748 case 'first_name_only'://output preferred first name
749 //check and clean the values for output
750 if (isset($item['first_preferred'])) {
751 $cck_fullname['first_preferred'] = strip_tags($item['first_preferred']);
752 }
753 $output .= theme('cck_fullname', $cck_fullname, $field);
754 return $output;
755 case 'last_name_first':
756 //check and clean the values for output
757 if (!empty($item['prefix'])) {
758 $cck_legalname['prefix'] = strip_tags($item['prefix']);
759 }
760 if (!empty($item['first'])) {
761 $cck_legalname['first'] = strip_tags($item['first']);
762 }
763 if (!empty($item['middle'])) {
764 $cck_legalname['middle'] = strip_tags($item['middle']);
765 }
766 if (!empty($item['last'])) {
767 $cck_legalname['last'] = strip_tags($item['last']);
768 }
769 if (!empty($item['suffix'])) {
770 $cck_legalname['suffix'] = strip_tags($item['suffix']);
771 }
772 if (!empty($cck_legalname)) {
773 $output .= t('Legal name: '). theme('cck_fullname', $cck_legalname, $field, TRUE);
774 }
775 if (!empty($item['prefix_preferred'])) {
776 $cck_preferredname['prefix'] = strip_tags($item['prefix_preferred']);
777 }
778 if (!empty($item['first_preferred'])) {
779 $cck_preferredname['first'] = strip_tags($item['first_preferred']);
780 }
781 if (!empty($item['middle_preferred'])) {
782 $cck_preferredname['middle'] = strip_tags($item['middle_preferred']);
783 }
784 if (!empty($item['last_preferred'])) {
785 $cck_preferredname['last'] = strip_tags($item['last_preferred']);
786 }
787 if (!empty($item['suffix_preferred'])) {
788 $cck_preferredname['suffix'] = strip_tags($item['suffix_preferred']);
789 }
790 if (!empty($cck_preferredname)) {//if there is a preferred name, print it instead of the legal name (overwrite $output)
791 $output = t('Preferred name: '). theme('cck_fullname', $cck_preferredname, $field, TRUE);
792 }
793 return $output;
794 }
795 } // function cck_fullname_field_formatter()
796
797 /**
798 * Theme for address display as called from cck_fullname_field_formatter().
799 *
800 * @param array $cck_fullname
801 * @param array $field
802 * @param boolean $last_first TRUE if displayed last name first
803 * @return string $output
804 */
805 function theme_cck_fullname($cck_fullname, $field, $last_first = FALSE) {
806 $output = '';
807 //create the output
808 if ($last_first) {
809 if (isset($cck_fullname['last'])) {
810 $output .= $cck_fullname['last'];
811 if (strlen($cck_fullname['last']) == 1) $output .= '., ';
812 else $output .= ', ';
813 }
814 if (isset($cck_fullname['prefix'])) {
815 $output .= $cck_fullname['prefix'];
816 if (strlen($cck_fullname['prefix']) < 4) $output .= '. ';
817 else $output .= ' ';
818 }
819 if (isset($cck_fullname['first'])) {
820 $output .= $cck_fullname['first'];
821 if (strlen($cck_fullname['first']) == 1) $output .= '. ';
822 else $output .= ' ';
823 }
824 if (isset($cck_fullname['middle'])) {
825 $output .= $cck_fullname['middle'];
826 if ($field['middle_initial'] == 1) $output .= '. ';
827 else $output .= ', ';
828 }
829 if (isset($cck_fullname['suffix'])) {
830 $output .= $cck_fullname['suffix'];
831 if (strlen($cck_fullname['suffix']) < 4) $output .= '.';
832 }
833 $output .= '<br />';
834 }
835 else {
836 if (isset($cck_fullname['prefix'])) {
837 $output .= $cck_fullname['prefix'];
838 if (strlen($cck_fullname['prefix']) < 4) $output .= '. ';
839 else $output .= ' ';
840 }
841 if (isset($cck_fullname['first'])) {
842 $output .= $cck_fullname['first'];
843 if (strlen($cck_fullname['first']) == 1) $output .= '. ';
844 else $output .= ' ';
845 }
846 if (isset($cck_fullname['middle'])) {
847 $output .= $cck_fullname['middle'];
848 if ($field['middle_initial'] == 1) $output .= '. ';
849 else $output .= ' ';
850 }
851 if (isset($cck_fullname['last'])) {
852 $output .= $cck_fullname['last'];
853 if (strlen($cck_fullname['last']) == 1) $output .= '. ';
854 else $output .= ' ';
855 }
856 if (isset($cck_fullname['suffix'])) {
857 $output .= $cck_fullname['suffix'];
858 if (strlen($cck_fullname['suffix']) < 4) $output .= '.';
859 }
860 $output .= '<br />';
861 }
862 return $output;
863 } // function theme_cck_fullname()
864
865 /**
866 * Implementation of hook_widget_info().
867 *
868 * @return
869 * An array keyed by widget name. Each element of the array is an associative
870 * array with these keys and values:
871 * - "label": The human-readable label for the widget.
872 * - "field types": An array of field type names that can be edited using
873 * this widget.
874 */
875 function cck_fullname_widget_info() {
876 return array(
877 'cck_fullname' => array(
878 'label' => 'Full Name',
879 'field types' => array('cck_fullname'),
880 ),
881 );
882 } // function cck_fullname_widget_info()
883
884 /**
885 * Implementation of hook_widget_settings().
886 *
887 * @param $op
888 * The operation to be performed.
889 * @param $widget
890 * The widget on which the operation is to be performed.
891 * @return
892 * This varies depending on the operation.
893 * - "form": an array of form elements to add to the settings page.
894 * - "validate": no return value. Use form_set_error().
895 * - "save": an array of names of form elements to be saved in the database.
896 * - "callbacks": an array describing the widget's behaviour regarding hook_widget
897 * operations. The array is keyed by hook_widget operations ('form', 'validate'...)
898 * and has the following possible values :
899 * CONTENT_CALLBACK_NONE : do nothing for this operation
900 * CONTENT_CALLBACK_CUSTOM : use the behaviour in hook_widget(operation)
901 * CONTENT_CALLBACK_DEFAULT : use content.module's default bahaviour
902 * Note : currently only the 'default value' operation implements this feature.
903 * All other widget operation implemented by the module _will_ be executed
904 * no matter what.
905 */
906 function cck_fullname_widget_settings($op, $widget) {
907 switch ($op) {
908 case 'callbacks':
909 return array(
910 'default value' => CONTENT_CALLBACK_CUSTOM,
911 );
912 }
913 } // function cck_fullname_widget_settings()
914
915 /**
916 * Implementation of hook_widget().
917 *
918 * Presently, we don't allow multiple values as people should only have one name.
919 * Also, we intercept the default value fields and unset() them as I couldn't think
920 * of a use case for pre-setting a person's name. We also use a little bit of CSS
921 * to render the form fields approximately the 'size' they've been specified in 'ems'
922 * as the 'size' was not being rendered in 'ems' but as some fraction thereof; this
923 * because a name with mostly wide letters wasn't all fitting in the display.
924 * @param $op
925 * What kind of action is being performed.
926 * @param &$node
927 * The node the action is being performed on.
928 * @param $field
929 * The field the action is being performed on.
930 * @param &$node_field
931 * The contents of the field in this node. Changes to this variable will
932 * be saved back to the node object.
933 * @return
934 * This varies depending on the operation.
935 * - The "form" operation should return an array of form elements to display.
936 * - Other operations have no return value.
937 */
938 function cck_fullname_widget($op, &$node, $field, &$items) {
939 switch ($op) {
940 case 'form':
941 $form = array();
942 $form[$field['field_name']] = array('#tree' => TRUE);
943 $form[$field['field_name']]['#theme'] = 'cck_fullname_display';
944
945 $form[$field['field_name']]['use_legalname'] = array(
946 '#type' => 'value',
947 '#value' => $field['use_legalname'],
948 );
949 $form[$field['field_name']]['use_preferredname'] = array(
950 '#type' => 'value',
951 '#value' => $field['use_preferredname'],
952 );
953 $form[$field['field_name']]['required_parts'] = array(
954 '#type' => 'value',
955 '#value' => $field['required_parts'],
956 );
957 $form[$field['field_name']]['legalname'] = array(
958 '#type' => 'value',
959 '#value' => $field['legalname'],
960 );
961 $form[$field['field_name']]['preferredname'] = array(
962 '#type' => 'value',
963 '#value' => $field['preferredname'],
964 );
965
966 $form[$field['field_name']]['#type'] = 'fieldset';
967 $form[$field['field_name']]['#attributes'] = array('class' => 'cck-fullname-fieldset');
968 $form[$field['field_name']]['#title'] = ucfirst(t($field['widget']['label']));
969 $form[$field['field_name']]['#description'] = $field['widget']['description'];
970 $form[$field['field_name']]['#weight'] = $field['widget']['weight'];
971 if ($field['multiple']) {
972 $delta = 0;
973 foreach ($items as $data) {
974 if (isset($field['legalname']['legal_prefix'])) {
975 $form[$field['field_name']][$delta]['prefix'] = array(
976 '#type' => 'textfield',
977 '#default_value' => isset($data['prefix'])