Project

General

Profile

Download (19.9 KB) Statistics
| Branch: | Tag: | Revision:
1
<?php
2
/**
3
 * @file
4
 * Functions for dealing with CDM entities of type SpeciemenOrOccurrences
5
 *
6
 * @copyright
7
 *   (C) 2007-2012 EDIT
8
 *   European Distributed Institute of Taxonomy
9
 *   http://www.e-taxonomy.eu
10
 *
11
 *   The contents of this module are subject to the Mozilla
12
 *   Public License Version 1.1.
13
 * @see http://www.mozilla.org/MPL/MPL-1.1.html
14
 *
15
 * @author
16
 *   - Andreas Kohlbecker <a.kohlbecker@BGBM.org>
17
 */
18

    
19
/**
20
 * Compose an render array from a CDM DerivedUnitFacade object.
21
 *
22
 * compose_hook() implementation
23
 *
24
 * @param object $specimenOrObservation
25
 *   the CDM instance of type SpecimenOrObservation to compose
26
 *   the render array for
27
 * @param array $derivatives
28
 *   the render array which contains the compositions of the derivatives
29
 *   of the supplied $specimenOrObservation
30
 *
31
 * @return array
32
 *   the supplied render array $derivatives to which the composition of the supplied
33
 *   $specimenOrObservation has been added to
34
 *
35
 * @ingroup compose
36
 */
37
function compose_cdm_specimenOrObservation($specimenOrObservation, &$derivatives = null) {
38

    
39
  $exclude_occurrence_fields = &drupal_static(__FUNCTION__);
40
  if (!isset($exclude_occurrence_fields)) {
41
     $exclude_occurrence_fields = array(
42
        'derivationEvents',
43
        'extensions', // TODO ignored for now, how to handle extensions?
44
        'titleCache',
45
        'protectedTitleCache',
46
        'derivedUnitMedia',
47
        'created',
48
        'updated',
49
        'class',
50
        'uuid'
51
    );
52
  }
53

    
54

    
55
  // only show uuid it the user is logged in
56
  if(user_is_logged_in() && ($a_idx = array_search('uuid', $exclude_occurrence_fields)) !== FALSE ) {
57
    unset($exclude_occurrence_fields[$a_idx]);
58
  }
59

    
60
  if (!isset($derivatives)) {
61
    $derivatives = array();
62
  }
63

    
64
  $descriptions = null;
65
  $derivedFrom = null;
66

    
67
  if (is_object($specimenOrObservation)) {
68

    
69
    // request again for deeper initialization
70
    $specimenOrObservation = cdm_ws_get("portal/" . CDM_WS_OCCURRENCE, $specimenOrObservation->uuid);
71

    
72

    
73
    $type_label = $specimenOrObservation->class;
74
    RenderHints::setFootnoteListKey($type_label . '-' . $specimenOrObservation->uuid);
75

    
76
    // collect typeStatus as label
77
    if (isset($specimenOrObservation->specimenTypeDesignations)) {
78
      $type_status = array();
79
      foreach ($specimenOrObservation->specimenTypeDesignations as $typeDesignation) {
80
        if (isset($typeDesignation->typeStatus->representation_L10n)){
81
          $type_status[] = $typeDesignation->typeStatus->representation_L10n;
82
        }
83
      }
84
      if (count($type_status) > 0){
85
        $type_label = implode(', ', $type_status);
86
      }
87
    }
88

    
89
    $title = $type_label . ': '. $specimenOrObservation->titleCache;
90

    
91
    $groups = array();
92
    // --- add initialized fields
93
    foreach (get_object_vars($specimenOrObservation) as $field => $value) {
94
      if (!in_array($field, $exclude_occurrence_fields) && ($value && (!is_object($value) || isset($value->class)))) {
95
        switch ($field) {
96

    
97
          /* ---- java.lang.Object --- */
98
          case 'class':
99
            if($value != '' /* FieldObservation' */){
100
              @_description_list_group_add($groups, cdm_occurrence_field_name_label($field), $value);
101
            }
102
          break;
103

    
104
          case 'markers':
105
            $dd_elements = array();
106
            foreach ($value as $marker) {
107
              $dd_elements[] = compose_cdm_marker($marker);
108
            }
109
            @_description_list_group_add($groups, cdm_occurrence_field_name_label($field), $dd_elements);
110
            break;
111

    
112

    
113
          case 'annotations':
114
            $dd_elements = array();
115
            foreach ($value as $annotation) {
116
              // TODO respect annotation type filter settings
117
              $dd_elements[] = $annotation->text;
118
            }
119
            @_description_list_group_add($groups, t('Notes'), $dd_elements);
120
            break;
121

    
122
          /* ---- SpecimenOrObservationBase --- */
123
          case 'sex':
124
          case 'lifeStage':
125
            @_description_list_group_add($groups, cdm_occurrence_field_name_label($field), $value->representation_L10n);
126
            break;
127

    
128
          case 'definition':
129
            // TODO
130
            break;
131

    
132
          case 'specimenTypeDesignations':
133
            @_description_list_group_add(
134
              $groups,
135
              cdm_occurrence_field_name_label($field),
136
              array(
137
                '#markup'=>theme('cdm_typedesignations', array('typeDesignations' => $value)),
138
              )
139
            );
140
            break;
141

    
142
          case 'determinations':
143
            $dd_elements = array();
144
            $glue = ', ';
145

    
146
            foreach  ($value as $determinationEvent){
147
              $timeperiod_string = NULL;
148
              if (isset($determinationEvent->timeperiod)) {
149
                $timeperiod_string = timePeriodToString($determinationEvent->timeperiod);
150
              }
151
              $weight = isset($determinationEvent->preferred) && $determinationEvent->preferred == 1 ? '0' : ($timeperiod_string ? $timeperiod_string : '1');
152
              // check key exists
153
              while (array_key_exists($weight, $dd_elements)) {
154
                $weight .= '0';
155
              }
156
              $taxon_name = cdm_ws_get(CDM_WS_TAXON . '/$0/name', $determinationEvent->taxon->uuid);
157
              $taxon_html = theme('cdm_taxonName',
158
                  array(
159
                      'taxonName' => $taxon_name,
160
                      'nameLink' => path_to_taxon($determinationEvent->taxon->uuid),
161
                  )
162
              );
163
              $dd_elements[$weight] = $taxon_html;
164
              if (isset($determinationEvent->modifier)) {
165
                $dd_elements[$weight] .= cdm_term_representation($determinationEvent->modifier);
166
              }
167
              if ($timeperiod_string) {
168
                $dd_elements[$weight] .= $glue . $timeperiod_string;
169
              }
170
              if (isset($determinationEvent->actor->titleCache)) {
171
                $dd_elements[$weight] .= $glue . $determinationEvent->actor->titleCache;
172
              }
173
              if (isset($determinationEvent->description)) {
174
                $dd_elements[$weight] .= $glue . $determinationEvent->description;
175
              }
176
            }
177
            ksort($dd_elements);
178
            @_description_list_group_add($groups, cdm_occurrence_field_name_label('determinations'), $dd_elements);
179
            break;
180

    
181
          case 'descriptions':
182
            $descriptions = $value;
183
            $occurrence_featureTree = cdm_get_occurrence_featureTree();
184
            $dd_elements = array();
185

    
186
            foreach ($value as $description) {
187
              $description = cdm_ws_get(CDM_WS_PORTAL_DESCRIPTION, $description->uuid);
188
//               if($description->imageGallery == TRUE) {
189
//                 continue;
190
//               }
191
              $elements_by_feature = _mergeFeatureTreeDescriptions($occurrence_featureTree->root->children, $description->elements);
192
              $rendered_description = theme(
193
                 'cdm_feature_nodes',
194
                 array('mergedFeatureNodes' => $elements_by_feature)
195
              );
196
              $description_render_elements = array();
197
//               $description_render_elements[] = array('#markup' => '<h4>'. $description->titleCache . '</h4>');
198
              $description_render_elements[] = array('#markup' => $rendered_description);
199
              $dd_elements[] = $description_render_elements;
200
            }
201

    
202
            @_description_list_group_add($groups, cdm_occurrence_field_name_label($field), $dd_elements);
203
            break;
204

    
205
          case 'sources':
206
              $dd_elements = array();
207
              foreach ($value as $identifiable_source) {
208
                $dd_elements[] = theme('cdm_OriginalSource', array('source' => $identifiable_source));
209
              }
210
              @_description_list_group_add($groups, cdm_occurrence_field_name_label($field), $dd_elements);
211
              break;
212

    
213

    
214
          /* ---- DerivedUnitBase --- */
215
          case 'derivedFrom':
216
            $derivedFrom = $value;
217
            break;
218

    
219
          case 'collection':
220
            $sub_dl_groups = array();
221
            @_description_list_group_add($sub_dl_groups, cdm_occurrence_field_name_label('code'), $value->code, NULL, 1);
222
            @_description_list_group_add($sub_dl_groups, cdm_occurrence_field_name_label('codeStandard'),  $value->codeStandard, NULL, 2);
223
            @_description_list_group_add($sub_dl_groups, cdm_occurrence_field_name_label('institute'), $value->institute, NULL, 3);
224
            @_description_list_group_add($sub_dl_groups, cdm_occurrence_field_name_label('townOrLocation'), $value->townOrLocation, NULL, 4);
225
            // TODO "superCollection"
226
            // TODO may have media
227

    
228
            @_description_list_group_add($groups, cdm_occurrence_field_name_label($field),
229
                array(
230
                    array('#markup' => $value->titleCache),
231
                    array('#theme' => 'description_list', '#groups' => $sub_dl_groups)
232
                )
233
            );
234
            break;
235

    
236
            case 'storedUnder':
237
              @_description_list_group_add($groups, cdm_occurrence_field_name_label('storedUnder'), theme('cdm_taxonName', $value));
238
              break;
239

    
240

    
241
            /* ---- Specimen --- */
242
            case 'sequences':
243
              $dd_elements = array();
244
              foreach ($value as $sequence) {
245
                $dd_elements[] = compose_cdm_sequence($sequence);
246
              }
247
              @_description_list_group_add($groups, cdm_occurrence_field_name_label($field), $dd_elements);
248
            break;
249

    
250
            // TODO preservation
251
            // TODO exsiccatum
252

    
253

    
254
          /* ---- FieldObservation --- */
255
          case 'gatheringEvent':
256
            @_description_list_group_add($groups, cdm_occurrence_field_name_label('collector'), $value->actor->titleCache);
257
            @_description_list_group_add($groups, t('Gathering time'), timePeriodToString($value->timeperiod));
258
            @_description_list_group_add($groups, cdm_occurrence_field_name_label('description'), $value->description);
259
            @_description_list_group_add($groups, cdm_occurrence_field_name_label('locality'), $value->locality->text);
260
            @_description_list_group_add($groups, cdm_occurrence_field_name_label('country'), $value->country->representation_L10n);
261
            @_description_list_group_add($groups, cdm_occurrence_field_name_label('collectingMethod'), $value->collectingMethod);
262
            @_description_list_group_add($groups, cdm_occurrence_field_name_label('absoluteElevation'), $value->absoluteElevation, ' m');
263
            @_description_list_group_add($groups, cdm_occurrence_field_name_label('absoluteElevationError'), $value->absoluteElevationError, ' m');
264
            @_description_list_group_add($groups, cdm_occurrence_field_name_label('distanceToGround'), $value->distanceToGround, ' m');
265
            @_description_list_group_add($groups, cdm_occurrence_field_name_label('distanceToWaterSurface'), $value->distanceToWaterSurface, ' m');
266
            if (isset($value->collectingAreas)) {
267
              $area_representations = array();
268
              foreach($value->collectingAreas as $area) {
269
                $area_representations[] = $area->representation_L10n;
270
              }
271
              @_description_list_group_add($groups, cdm_occurrence_field_name_label('collectingAreas'), implode(', ', $area_representations));
272
            }
273
            if (isset($value->exactLocation)) {
274
              $sub_dl_groups = array();
275
              @_description_list_group_add($sub_dl_groups, cdm_occurrence_field_name_label('errorRadius'), $value->exactLocation->errorRadius, ' m', 1);
276
              @_description_list_group_add($sub_dl_groups, cdm_occurrence_field_name_label('longitude'), round($value->exactLocation->longitude, 7), '°', 2);
277
              @_description_list_group_add($sub_dl_groups, cdm_occurrence_field_name_label('latitude'), round($value->exactLocation->latitude, 7), '°', 3);
278
              if (isset($value->exactLocation->referenceSystem)) {
279
                @_description_list_group_add($sub_dl_groups, cdm_occurrence_field_name_label('referenceSystem'), $value->exactLocation->referenceSystem->representation_L10n, '', 4);
280
              }
281

    
282
              @_description_list_group_add($groups, cdm_occurrence_field_name_label('exactLocation'),
283
                  array(
284
                      array('#markup' => $value->exactLocation->sexagesimalString),
285
                      array(
286
                          '#theme' => 'description_list',
287
                          '#groups' => $sub_dl_groups
288
                      ),
289
                  )
290
              );
291
            }
292
            break;
293

    
294
          default:
295
            if(is_object($value) || is_array($value)){
296
              drupal_set_message("Unhandled type in compose_cdm_specimenOrObservation() for field " . $field, "warning");
297
            } else {
298
              _description_list_group_add($groups, cdm_occurrence_field_name_label($field), $value);
299
            }
300

    
301
        }
302

    
303
      }
304
    } // END of loop over $derivedUnitFacade fields
305

    
306

    
307
    // template_preprocess_description_list() is not worting by weight so we do it right here
308
    uasort($groups, 'element_sort');
309

    
310
    $occurrence_elements = array(
311
        '#title' => $title,
312
        '#theme' => 'description_list',
313
        '#groups' => $groups,
314
        '#attributes' => array('class' => html_class_atttibute_ref($specimenOrObservation)),
315
    );
316
    $derivatives[] = $occurrence_elements;
317
    // all footnotes which has been assembled so far (e.g. from typeDesignations) to here
318
    $foonote_li_elements = theme('cdm_footnotes', array('footnoteListKey' => RenderHints::getFootnoteListKey(), 'enclosingTag' => 'span'));
319
    if (!empty($foonote_li_elements)) {
320
      $derivatives[] =  array(
321
          '#markup' =>  '<div class="footnotes">' . $foonote_li_elements . '</div>',
322
      );
323
    }
324

    
325
    // --- recurse into originals
326
    if (!isset($derivedFrom)) {
327
      $derivedFrom = cdm_ws_get(
328
          CDM_WS_OCCURRENCE,
329
          array($specimenOrObservation->uuid, 'derivedFrom')
330
        );
331
    }
332

    
333
    if (isset($derivedFrom)) {
334
      if (isset($derivedFrom->originals)) {
335
        $derived_from_label = t('derived');
336
        $preposition = t('from');
337
        if(isset($derivedFrom->type)){
338
          $derived_from_label = $derivedFrom->type->representation_L10n;
339
          if($derivedFrom->type->uuid == UUID_DERIVATIONEVENTTYPE_ACCESSIONING){
340
            $preposition = t('of');
341
          }
342
        }
343
        if (count($groups) > 0) {
344
          // TODO  annotations
345

    
346
          // only display the derived from information when the derivative has any element which will be diplayed
347
          $derivatives[] = array(
348
              '#markup' => '<div class="derived_from">' . $derived_from_label . ' ' . $preposition . ': </div>',
349
          );
350
        }
351
        foreach ($derivedFrom->originals as $original) {
352
          compose_cdm_specimenOrObservation($original, $derivatives);
353
        }
354
      }
355
    }
356

    
357
  } // END of $specimenOrObservation exists
358

    
359
  return $derivatives;
360
}
361

    
362
/**
363
 * Compose an render array from a CDM Sequence object.
364
 *
365
 * compose_hook() implementation
366
 *
367
 * @param object $sequence
368
 *   CDM instance of type Sequence
369
 * @return array
370
 *   A render array containing the fields of the supplied $sequence
371
 *
372
 * @ingroup compose
373
 */
374
function compose_cdm_sequence($sequence) {
375

    
376
  $exclude_sequence_fields = &drupal_static(__FUNCTION__);
377
  if (!isset($exclude_sequence_fields)) {
378
    $exclude_sequence_fields = array(
379
      'titleCache',
380
      'protectedTitleCache',
381
      'microReference',
382
      'created',
383
      'updated',
384
      'class',
385
    );
386
  }
387

    
388
  $groups = array();
389

    
390
  // -- retrieve additional data if neesscary
391
  // TODO bellow call disabled since sequences are not yet supported,
392
  //      see  #3347 (services and REST service controller for molecular classes implemented)
393
  //
394
  // cdm_load_annotations($sequence);
395

    
396
  foreach (get_object_vars($sequence) as $field => $value) {
397

    
398

    
399
    if (!in_array($field, $exclude_sequence_fields) && ($value && (!is_object($value) || isset($value->class)))) {
400
      switch ($field) {
401

    
402
        case 'genBankAccession';
403
          $dd_elements = array();
404
          foreach ($value as $accession) {
405
            if (isset($accession->uri) ){
406
              $dd_elements[] = l($accession->accessionNumber, $accession->uri);
407
            } else {
408
              $dd_elements[] = $accession->accessionNumber;
409
            }
410
          }
411
          @_description_list_group_add($groups, cdm_occurrence_field_name_label($field),  $dd_elements, NULL, 1);
412
          break;
413

    
414
        case 'length':
415
          @_description_list_group_add($groups, t('Sequence length'),  $value , ' ' . t('Nucleotites'), 2);
416
          break;
417

    
418
        case 'locus':
419
          if (isset($value->name)) {
420
            @_description_list_group_add($groups, cdm_occurrence_field_name_label($field),  $value->name, NULL, 3);
421
          }
422
          if (isset($value->description)) {
423
            @_description_list_group_add($groups, cdm_occurrence_field_name_label($field) . ' ' . t('description') , $value->description, NULL, 4);
424
          }
425
          break;
426

    
427
        case 'sequence':
428
          // format in genbank style, force linebreaks after each 70 nucleotites
429
          // see also http://stackoverflow.com/questions/499137/css-how-can-i-force-a-long-string-without-any-blank-to-be-wrapped-in-xul-and
430
          @_description_list_group_add(
431
            $groups,
432
            cdm_occurrence_field_name_label($field),
433
            array(
434
              array(
435
                '#markup' => '<div>' . wordwrap($value, 70, '</br>', TRUE) . '</div>',
436
                '#wrapper_attributes' => array('class'=>'dna-sequence')
437
                )
438
              ),
439
            5);
440
          break;
441

    
442
        case 'dateSequenced':
443
          @_description_list_group_add($groups, t('Sequencing date'),  timePeriodToString($value), NULL, 6);
444
          break;
445

    
446
        case 'barcode': // boolean
447
          @_description_list_group_add($groups, cdm_occurrence_field_name_label($field), $value ? 'Yes': 'No', NULL, 7);
448
          break;
449

    
450
        case 'citation':
451
          @_description_list_group_add($groups,
452
            cdm_occurrence_field_name_label($field),
453
            theme('cdm_reference', array('reference' =>$value, 'microReference' => $sequence->microReference)),
454
            NULL,
455
            8
456
          );
457
          break;
458

    
459
        case 'publishedIn':
460
          @_description_list_group_add($groups,
461
            cdm_occurrence_field_name_label($field),
462
            theme('cdm_reference', array('reference'=>$value)),
463
            NULL,
464
            7
465
          );
466

    
467
        case 'rights':
468
          array_merge($groups, cdm_rights_as_dl_groups($value));
469
        break;
470

    
471
        case 'annotations':
472
          $dd_elements = array();
473
          foreach ($value as $annotation) {
474
            // TODO respect annotation type filter settings
475
            $dd_elements[] = $annotation->text;
476
          }
477
          @_description_list_group_add($groups, t('Notes'), $dd_elements, NULL, 9);
478
          break;
479

    
480
        case 'markers':
481
          $dd_elements = array();
482
          foreach ($value as $marker) {
483
            $dd_elements[] = compose_cdm_marker($marker);
484
          }
485
          @_description_list_group_add($groups, cdm_occurrence_field_name_label($field), $dd_elements, NULL, 10);
486
          break;
487

    
488
        case 'chromatograms':
489
          @_description_list_group_add($groups, cdm_occurrence_field_name_label($field),
490
              array(
491
                  '#markup'=>theme('cdm_media_gallerie', array('medialist'=>$value)),
492
              ),
493
              NULL,
494
              11);
495
          break;
496

    
497
        default:
498
          if(is_object($value) || is_array($value)){
499
            drupal_set_message("Unhandled type in compose_cdm_sequence() for field " . $field, "warning");
500
          } else {
501
            _description_list_group_add($groups, cdm_occurrence_field_name_label($field), $value, NULL, 20);
502
          }
503
      }
504
    }
505
  }
506

    
507
  // template_preprocess_description_list() is not worting by weight so we do it right here
508
  uasort($groups, 'element_sort');
509

    
510
  $sequence_elements = array(
511
      '#theme' => 'description_list',
512
      '#groups' => $groups
513
  );
514

    
515
  return $sequence_elements;
516
}
(4-4/6)