Project

General

Profile

Download (28.8 KB) Statistics
| Branch: | Tag: | Revision:
1 c70b93c3 Andreas Kohlbecker
<?php
2 f19f47fa Andreas Kohlbecker
/**
3
 * @file
4 bff67f14 Patric Plitzner
 * Functions for dealing with CDM entities of type SpecimenOrOccurrences
5 f19f47fa Andreas Kohlbecker
 *
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 c70b93c3 Andreas Kohlbecker
 */
18
19 b810158e Patric Plitzner
20
/**
21 30845bda Andreas Kohlbecker
 * Provides the HTML markup for a specimen page
22
 *
23
 * @param $specimen
24
 *
25 b810158e Patric Plitzner
 * @return string
26 30845bda Andreas Kohlbecker
 *  The markup for a specimen page
27 b810158e Patric Plitzner
 */
28 30845bda Andreas Kohlbecker
function render_cdm_specimen_page($specimen, $is_specimen_page = false)
29 b810158e Patric Plitzner
{
30
    $detail_html = "";
31
    //link to specimen page
32 30845bda Andreas Kohlbecker
    $pathToSpecimen = path_to_specimen($specimen->uuid);
33
    if (!$is_specimen_page) {
34
        $specimenPageLink = l($specimen->accessionNumber, $pathToSpecimen, array('attributes' => array('target' => '_blank')));
35 a7a302a0 Patric Plitzner
        $detail_html .= "<strong>$specimenPageLink</strong><br>";
36
    }
37
38 30845bda Andreas Kohlbecker
    if($is_specimen_page) {
39
        if($specimen->citation){
40
            $detail_html .= "<br>".create_label("Citation") . $specimen->citation . "<br>";
41 fdc85125 Patric Plitzner
        }
42 b810158e Patric Plitzner
    }
43 30845bda Andreas Kohlbecker
    if($specimen->preferredStableUri){
44
        $detail_html .= "<br>".create_label("Preferred stable URI") . cdm_external_uri($specimen->preferredStableUri) . "<br>";
45 1cefb4e5 Patrick Plitzner
    }
46 30845bda Andreas Kohlbecker
    if($is_specimen_page){
47 fdc85125 Patric Plitzner
        // associated taxa
48 30845bda Andreas Kohlbecker
        if($specimen->associatedTaxa){
49 3dd58832 Patric Plitzner
            $detail_html .= "<br>";
50 eacb76d2 Patrick Plitzner
            $detail_html .= create_label("Associated with");
51 30845bda Andreas Kohlbecker
                if(sizeof($specimen->associatedTaxa)>1){
52 56d58f9b Patric Plitzner
                    $detail_html .= "<br>";
53
                }
54 30845bda Andreas Kohlbecker
            foreach($specimen->associatedTaxa as $associatedTaxon){
55 eacb76d2 Patrick Plitzner
                $detail_html .= l($associatedTaxon->second, path_to_taxon($associatedTaxon->first, "specimens"));//$associatedTaxon->second."<br>";
56 fdc85125 Patric Plitzner
            }
57
        }
58 b810158e Patric Plitzner
    }
59
    // - type information
60
    $types = "";
61 30845bda Andreas Kohlbecker
    if (isset($specimen->types)) {
62 56d58f9b Patric Plitzner
        //typed taxa
63 30845bda Andreas Kohlbecker
        if(sizeof($specimen->types)>1){
64 56d58f9b Patric Plitzner
            $detail_html .= "<br>";
65
        }
66 30845bda Andreas Kohlbecker
        foreach ($specimen->types as $typeStatus => $typedTaxa) {
67
            if($is_specimen_page){
68
                if($specimen->types){
69 fdc85125 Patric Plitzner
                    $detail_html .= "<i>".$typeStatus."</i>: ";
70
                    foreach($typedTaxa as $typedTaxon){
71
                        $detail_html .= $typedTaxon." ";
72
                    }
73
                    $detail_html .= "<br>";
74
                }
75
            }
76
            else{
77
                $types .= $typeStatus." ";
78
            }
79 b810158e Patric Plitzner
        }
80
    }
81 30845bda Andreas Kohlbecker
    $derivateDataDTO = $specimen->derivateDataDTO;
82 b810158e Patric Plitzner
    // - specimen scans
83 65a4de51 Patrick Plitzner
    $specimenScans = create_html_links($derivateDataDTO->specimenScans, true);
84 b810158e Patric Plitzner
    // - molecular data
85
    $molecularData = "";
86
    if ($derivateDataDTO->molecularDataList) {
87
        foreach ($derivateDataDTO->molecularDataList as $molecular) {
88
            //provider link
89
            if (isset($molecular->providerLink)) {
90 65a4de51 Patrick Plitzner
                $molecularData .= create_html_link($molecular->providerLink, true);
91 2c23b054 Patrick Plitzner
            } else {
92
                $molecularData .= "[no provider]";
93 b810158e Patric Plitzner
            }
94
            //contig link
95 2c23b054 Patrick Plitzner
            if (isset($molecular->contigFiles)) {
96 b810158e Patric Plitzner
                $molecularData .= "[";
97 2c23b054 Patrick Plitzner
                if (sizeof($molecular->contigFiles) > 0) {
98 b810158e Patric Plitzner
                    foreach ($molecular->contigFiles as $contigFile) {
99 2c23b054 Patrick Plitzner
                        if (isset($contigFile->contigLink)) {
100
                            if (isset($contigFile->contigLink->uri) and $contigFile->contigLink->uri != null) {
101
                                $molecularData .= create_html_link($contigFile->contigLink, true) . " ";
102 37ab3ddc Patric Plitzner
                            }
103 2c23b054 Patrick Plitzner
                        }
104
                        else {
105
                            $molecularData .= "no contig ";
106
                        }
107
                        //primer links
108
                        if(isset($contigFile->primerLinks)) {
109 65a4de51 Patrick Plitzner
                            $molecularData .= create_html_links($contigFile->primerLinks, true);
110 b810158e Patric Plitzner
                        }
111
                    }
112
                }
113 5eafa5ff Patric Plitzner
                $molecularData = rtrim($molecularData, " ");
114 b810158e Patric Plitzner
                $molecularData .= "]";
115
            }
116
            //FIXME separate with comma (remove trailing comma)
117
        }
118
    }
119
    // - detail images
120 65a4de51 Patrick Plitzner
    $detailImages = create_html_links($derivateDataDTO->detailImages, true);
121 b810158e Patric Plitzner
122
    if ($types) {
123 30845bda Andreas Kohlbecker
        $detail_html .= $is_specimen_page?"<br>":"";
124 a0bbccce Patrick Plitzner
        $detail_html .= create_label("Type(s)") . $types . "<br>";
125 b810158e Patric Plitzner
    }
126 30845bda Andreas Kohlbecker
    if ($specimenScans and !$is_specimen_page) {
127 3dd58832 Patric Plitzner
        $detail_html .= create_label("Specimen Scans") . $specimenScans . "<br>";
128 b810158e Patric Plitzner
    }
129 8d9d64a5 Patric Plitzner
    //specimen scan image gallery
130 30845bda Andreas Kohlbecker
    if($is_specimen_page and isset($derivateDataDTO->specimenScanUuids) and !empty($derivateDataDTO->specimenScanUuids)) {
131 8d9d64a5 Patric Plitzner
        $detail_html .= addImageGallery("Specimen scans", $derivateDataDTO->specimenScanUuids);
132
    }
133
134 b810158e Patric Plitzner
    if ($molecularData) {
135 30845bda Andreas Kohlbecker
        $detail_html .= $is_specimen_page?"<br>":"";
136 3dd58832 Patric Plitzner
        $detail_html .= create_label("Molecular Data") . $molecularData . "<br>";
137 b810158e Patric Plitzner
    }
138 8d9d64a5 Patric Plitzner
139 30845bda Andreas Kohlbecker
    if ($detailImages and !$is_specimen_page) {
140 3dd58832 Patric Plitzner
        $detail_html .= create_label("Detail Images") . $detailImages . "<br>";
141 b810158e Patric Plitzner
    }
142
143 8d9d64a5 Patric Plitzner
    //detail image gallery
144 30845bda Andreas Kohlbecker
    if($is_specimen_page and isset($derivateDataDTO->detailImageUuids) and !empty($derivateDataDTO->detailImageUuids)){
145 8d9d64a5 Patric Plitzner
        $detail_html .= addImageGallery("Detail Images", $derivateDataDTO->detailImageUuids);
146
    }
147
148 b810158e Patric Plitzner
    //character data
149 30845bda Andreas Kohlbecker
    if ($specimen->characterData) {
150
        $detail_html .= $is_specimen_page?"<br>":"";
151 a442acb8 Patric Plitzner
        $detail_html .= create_label("Character Data");
152 30845bda Andreas Kohlbecker
        if($is_specimen_page) {
153 b810158e Patric Plitzner
            $detail_html .= "<br>";
154 30845bda Andreas Kohlbecker
            foreach ($specimen->characterData as $characterStatePair) {
155 a442acb8 Patric Plitzner
                $detail_html .= "<i>" . $characterStatePair->first . "</i>:" . $characterStatePair->second;
156
                $detail_html .= "<br>";
157
            }
158
        }
159
        else{
160
            $detail_html .= l("detail page", $pathToSpecimen,array('attributes' => array('target'=>'_blank')));
161 216abf0b Patric Plitzner
            $detail_html .= "<br>";
162 b810158e Patric Plitzner
        }
163
    }
164 8d9d64a5 Patric Plitzner
    return $detail_html;
165
}
166 8c1d6d72 Patric Plitzner
167 8d9d64a5 Patric Plitzner
function addImageGallery($galleryName, $imageUuids){
168 b5c89485 Patric Plitzner
    $images = array();
169 8d9d64a5 Patric Plitzner
    foreach ($imageUuids as $uuid) {
170
        $images[] = cdm_ws_get(CDM_WS_PORTAL_MEDIA, $uuid);
171 8c1d6d72 Patric Plitzner
    }
172 7cf177d0 Patrick Plitzner
173
    $gallery_html = '';
174
    if (count($imageUuids) > 0) {
175
        $gallery_settings = getGallerySettings(CDM_DATAPORTAL_SPECIMEN_GALLERY_NAME);
176
        $captionElements = array(
177
            'title',
178
            'rights',
179
        );
180
        $alternativeMediaUris = array();
181
        foreach($images as $image){
182 e2eaa6c7 Patrick Plitzner
          $mediaUri = getMediaUri($image);
183
          if($mediaUri){
184
            $alternativeMediaUris[] = $mediaUri;
185
          }
186
          else{
187 7cf177d0 Patrick Plitzner
            $alternativeMediaUris[] = path_to_media($image->uuid);
188 e2eaa6c7 Patrick Plitzner
          }
189 7cf177d0 Patrick Plitzner
        }
190
191 a9815578 Andreas Kohlbecker
        $gallery_html = compose_cdm_media_gallerie(array(
192 7cf177d0 Patrick Plitzner
            'mediaList' => $images,
193
            'galleryName' => $galleryName,
194
            'maxExtend' => $gallery_settings['cdm_dataportal_media_maxextend'],
195
            'cols' => $gallery_settings['cdm_dataportal_media_cols'],
196
            'maxRows' => isset($gallery_settings['cdm_dataportal_media_maxRows']) ? isset($gallery_settings['cdm_dataportal_media_maxRows']) : null,
197
            'captionElements' => $captionElements,
198
            'mediaLinkType' => 'LIGHTBOX',
199
            'alternativeMediaUri' => $alternativeMediaUris,
200
            'galleryLinkUri' => NULL,
201
        ));
202
    }
203
    return "<br>".create_label($galleryName)."<br>".$gallery_html;
204 b810158e Patric Plitzner
}
205
206 e2eaa6c7 Patrick Plitzner
function getMediaUri($media){
207
  if(isset($media->representations) && sizeof($media->representations)==1
208
    && isset($media->representations[0]->parts) &&
209
    sizeof($media->representations[0]->parts)==1) {
210
    return $media->representations[0]->parts[0]->uri;
211
  }
212
  return null;
213
}
214
215 8d9d64a5 Patric Plitzner
216 3dd58832 Patric Plitzner
/**
217 5a079dbf Andreas Kohlbecker
 * Formats the given string to a label for displaying key-object pairs in HTML
218 3dd58832 Patric Plitzner
 * @return string
219
 */
220
function create_label($label)
221
{
222
    return "<span class='specimen_table_label'>".$label.": </span>";
223
}
224
225 f19f47fa Andreas Kohlbecker
/**
226
 * Compose an render array from a CDM DerivedUnitFacade object.
227
 *
228
 * compose_hook() implementation
229 235fc94b Andreas Kohlbecker
 *
230
 * @param object $specimenOrObservation
231
 *   the CDM instance of type SpecimenOrObservation to compose
232
 *   the render array for
233
 * @param array $derivatives
234
 *   the render array which contains the compositions of the derivatives
235
 *   of the supplied $specimenOrObservation
236
 *
237
 * @return array
238
 *   the supplied render array $derivatives to which the composition of the supplied
239
 *   $specimenOrObservation has been added to
240 5b26b91a Andreas Kohlbecker
 *
241
 * @ingroup compose
242 f19f47fa Andreas Kohlbecker
 */
243 6fbdb943 Andreas Kohlbecker
function compose_cdm_specimenOrObservation($specimenOrObservation, &$derivatives = null) {
244 f846e7e7 Andreas Kohlbecker
245 eeb98da8 Andreas Kohlbecker
  $exclude_occurrence_fields = &drupal_static(__FUNCTION__);
246
  if (!isset($exclude_occurrence_fields)) {
247
     $exclude_occurrence_fields = array(
248 5b30a682 Andreas Kohlbecker
        'derivationEvents',
249 eeb98da8 Andreas Kohlbecker
        'titleCache',
250 f19f47fa Andreas Kohlbecker
        'protectedTitleCache',
251 eeb98da8 Andreas Kohlbecker
        'derivedUnitMedia',
252
        'created',
253 f67ffd4e Andreas Kohlbecker
        'publish',
254 eeb98da8 Andreas Kohlbecker
        'updated',
255
        'class',
256 5b3557f9 Andreas Kohlbecker
        'uuid',
257 f19f47fa Andreas Kohlbecker
       ''
258 eeb98da8 Andreas Kohlbecker
    );
259
  }
260
261 f846e7e7 Andreas Kohlbecker
262 98450eb2 Andreas Kohlbecker
  // only show uuid it the user is logged in
263 a67e7364 Andreas Kohlbecker
  if(user_is_logged_in() && ($a_idx = array_search('uuid', $exclude_occurrence_fields)) !== FALSE ) {
264
    unset($exclude_occurrence_fields[$a_idx]);
265 98450eb2 Andreas Kohlbecker
  }
266 9b9037f3 Andreas Kohlbecker
267 6fbdb943 Andreas Kohlbecker
  if (!isset($derivatives)) {
268
    $derivatives = array();
269 f846e7e7 Andreas Kohlbecker
  }
270
271 6fbdb943 Andreas Kohlbecker
  $descriptions = null;
272 0796d2f9 Andreas Kohlbecker
  $derivedFrom = null;
273 f19f47fa Andreas Kohlbecker
274 6fbdb943 Andreas Kohlbecker
  if (is_object($specimenOrObservation)) {
275 f846e7e7 Andreas Kohlbecker
276
    // request again for deeper initialization
277
    $specimenOrObservation = cdm_ws_get("portal/" . CDM_WS_OCCURRENCE, $specimenOrObservation->uuid);
278 9b9037f3 Andreas Kohlbecker
279 15b7c460 Andreas Kohlbecker
280 9b9037f3 Andreas Kohlbecker
    $type_label = $specimenOrObservation->class;
281 15b7c460 Andreas Kohlbecker
    RenderHints::setFootnoteListKey($type_label . '-' . $specimenOrObservation->uuid);
282
283 9b9037f3 Andreas Kohlbecker
    // collect typeStatus as label
284
    if (isset($specimenOrObservation->specimenTypeDesignations)) {
285
      $type_status = array();
286
      foreach ($specimenOrObservation->specimenTypeDesignations as $typeDesignation) {
287 0820cdc0 Andreas Kohlbecker
        if (isset($typeDesignation->typeStatus->representation_L10n)) {
288 9b9037f3 Andreas Kohlbecker
          $type_status[] = $typeDesignation->typeStatus->representation_L10n;
289
        }
290
      }
291 0820cdc0 Andreas Kohlbecker
      if (count($type_status) > 0) {
292 c6787c7d Andreas Kohlbecker
        $type_label = implode(', ', $type_status);
293 cb7db01d Andreas Kohlbecker
      }
294 9b9037f3 Andreas Kohlbecker
    }
295
296 0820cdc0 Andreas Kohlbecker
    $title = $type_label . ': ' . $specimenOrObservation->titleCache;
297 6fbdb943 Andreas Kohlbecker
298 f846e7e7 Andreas Kohlbecker
    $groups = array();
299
    // --- add initialized fields
300 f19f47fa Andreas Kohlbecker
    foreach (get_object_vars($specimenOrObservation) as $field => $value) {
301
      if (!in_array($field, $exclude_occurrence_fields) && ($value && (!is_object($value) || isset($value->class)))) {
302 6fbdb943 Andreas Kohlbecker
        switch ($field) {
303
304
          /* ---- java.lang.Object --- */
305
          case 'class':
306 0820cdc0 Andreas Kohlbecker
            if ($value != '' /* FieldUnit' */) {
307 6fbdb943 Andreas Kohlbecker
              @_description_list_group_add($groups, cdm_occurrence_field_name_label($field), $value);
308
            }
309 0820cdc0 Andreas Kohlbecker
            break;
310 4ae6064e Andreas Kohlbecker
311
          case 'markers':
312
            $dd_elements = array();
313
            foreach ($value as $marker) {
314
              $dd_elements[] = compose_cdm_marker($marker);
315
            }
316
            @_description_list_group_add($groups, cdm_occurrence_field_name_label($field), $dd_elements);
317
            break;
318 f19f47fa Andreas Kohlbecker
319 4ae6064e Andreas Kohlbecker
320 5b30a682 Andreas Kohlbecker
          case 'annotations':
321
            $dd_elements = array();
322
            foreach ($value as $annotation) {
323
              // TODO respect annotation type filter settings
324
              $dd_elements[] = $annotation->text;
325
            }
326
            @_description_list_group_add($groups, t('Notes'), $dd_elements);
327
            break;
328 eeb98da8 Andreas Kohlbecker
329 6fbdb943 Andreas Kohlbecker
          /* ---- SpecimenOrObservationBase --- */
330
          case 'sex':
331
          case 'lifeStage':
332 06d6b7fa Andreas Kohlbecker
          case 'kindOfUnit':
333 6fbdb943 Andreas Kohlbecker
            @_description_list_group_add($groups, cdm_occurrence_field_name_label($field), $value->representation_L10n);
334 f846e7e7 Andreas Kohlbecker
            break;
335
336 6fbdb943 Andreas Kohlbecker
          case 'definition':
337
            // TODO
338
            break;
339
340 a9ed34ad Andreas Kohlbecker
          case 'preferredStableUri':
341
342
            @_description_list_group_add($groups, cdm_occurrence_field_name_label($field), array(array('#markup' => cdm_external_uri($value, false))));
343
            break;
344
345 9b9037f3 Andreas Kohlbecker
          case 'specimenTypeDesignations':
346 4c75b2d9 Andreas Kohlbecker
            @_description_list_group_add(
347
              $groups,
348
              cdm_occurrence_field_name_label($field),
349
              array(
350 0820cdc0 Andreas Kohlbecker
                '#markup' => theme('cdm_typedesignations', array('typeDesignations' => $value)),
351 4c75b2d9 Andreas Kohlbecker
              )
352
            );
353 9b9037f3 Andreas Kohlbecker
            break;
354
355 6fbdb943 Andreas Kohlbecker
          case 'determinations':
356 f19f47fa Andreas Kohlbecker
            $dd_elements = array();
357 42133a60 Andreas Kohlbecker
            $glue = ', ';
358 9b9037f3 Andreas Kohlbecker
359 0820cdc0 Andreas Kohlbecker
            foreach ($value as $determinationEvent) {
360
              $timeperiod_string = NULL;
361
              if (isset($determinationEvent->timeperiod)) {
362
                $timeperiod_string = timePeriodToString($determinationEvent->timeperiod);
363
              }
364
              $weight = isset($determinationEvent->preferred) && $determinationEvent->preferred == 1 ? '0' : ($timeperiod_string ? $timeperiod_string : '1');
365
              // check key exists
366
              while (array_key_exists($weight, $dd_elements)) {
367
                $weight .= '0';
368
              }
369
370
              $taxon_name = '';
371
              $name_link = '';
372
              if ($determinationEvent->taxonName) {
373
                $taxon_name = $determinationEvent->taxonName;
374
              } else if ($determinationEvent->taxon) {
375
                $taxon_name = cdm_ws_get(CDM_WS_TAXON . '/$0/name', $determinationEvent->taxon->uuid);
376
                $name_link = path_to_taxon($determinationEvent->taxon->uuid);
377
              }
378
              if ($taxon_name) {
379 63c3ac73 Andreas Kohlbecker
                $taxon_html = render_taxon_or_name($taxon_name, $name_link);
380 3dd58832 Patric Plitzner
                $dd_elements[$weight] = $taxon_html;
381 0820cdc0 Andreas Kohlbecker
              }
382
              if (isset($determinationEvent->modifier)) {
383
                $dd_elements[$weight] .= cdm_term_representation($determinationEvent->modifier);
384
              }
385
              if ($timeperiod_string) {
386
                $dd_elements[$weight] .= $glue . $timeperiod_string;
387
              }
388
              if (isset($determinationEvent->actor->titleCache)) {
389
                $dd_elements[$weight] .= $glue . $determinationEvent->actor->titleCache;
390
              }
391
              if (isset($determinationEvent->description)) {
392
                $dd_elements[$weight] .= $glue . $determinationEvent->description;
393
              }
394 1b04a204 Andreas Kohlbecker
            }
395 9b9037f3 Andreas Kohlbecker
            ksort($dd_elements);
396 f19f47fa Andreas Kohlbecker
            @_description_list_group_add($groups, cdm_occurrence_field_name_label('determinations'), $dd_elements);
397 1b04a204 Andreas Kohlbecker
            break;
398 f846e7e7 Andreas Kohlbecker
399 f19f47fa Andreas Kohlbecker
          case 'descriptions':
400 bfb2b81a Andreas Kohlbecker
            $occurrence_featureTree = cdm_get_occurrence_featureTree();
401
            $dd_elements = array();
402
403 a7a96336 Andreas Kohlbecker
            foreach ($value as $description) {
404 bfb2b81a Andreas Kohlbecker
              $description = cdm_ws_get(CDM_WS_PORTAL_DESCRIPTION, $description->uuid);
405 a67e7364 Andreas Kohlbecker
//               if($description->imageGallery == TRUE) {
406
//                 continue;
407
//               }
408 fae36a2a Andreas Kohlbecker
              $elements_by_feature = _mergeFeatureTreeDescriptions($occurrence_featureTree->root->childNodes, $description->elements);
409 1b756c5f Andreas Kohlbecker
              $description_render_elements = _block_get_renderable_array(make_feature_block_list($elements_by_feature, null));
410 9b9037f3 Andreas Kohlbecker
              $dd_elements[] = $description_render_elements;
411 bfb2b81a Andreas Kohlbecker
            }
412
413 f19f47fa Andreas Kohlbecker
            @_description_list_group_add($groups, cdm_occurrence_field_name_label($field), $dd_elements);
414 6fbdb943 Andreas Kohlbecker
            break;
415
416 f846e7e7 Andreas Kohlbecker
          case 'sources':
417 0820cdc0 Andreas Kohlbecker
            $dd_elements = array();
418
            foreach ($value as $identifiable_source) {
419
              $dd_elements[] = theme('cdm_OriginalSource', array('source' => $identifiable_source));
420
            }
421
            @_description_list_group_add($groups, cdm_occurrence_field_name_label($field), $dd_elements);
422
            break;
423 0796d2f9 Andreas Kohlbecker
424 f19f47fa Andreas Kohlbecker
425 0796d2f9 Andreas Kohlbecker
          /* ---- DerivedUnitBase --- */
426
          case 'derivedFrom':
427
            $derivedFrom = $value;
428 f19f47fa Andreas Kohlbecker
            break;
429 6fbdb943 Andreas Kohlbecker
430
          case 'collection':
431
            $sub_dl_groups = array();
432 f19f47fa Andreas Kohlbecker
            @_description_list_group_add($sub_dl_groups, cdm_occurrence_field_name_label('code'), $value->code, NULL, 1);
433 0820cdc0 Andreas Kohlbecker
            @_description_list_group_add($sub_dl_groups, cdm_occurrence_field_name_label('codeStandard'), $value->codeStandard, NULL, 2);
434 964c2f69 Andreas Kohlbecker
            @_description_list_group_add($sub_dl_groups, cdm_occurrence_field_name_label('institute'), $value->institute, NULL, 3);
435
            @_description_list_group_add($sub_dl_groups, cdm_occurrence_field_name_label('townOrLocation'), $value->townOrLocation, NULL, 4);
436 6fbdb943 Andreas Kohlbecker
            // TODO "superCollection"
437
            // TODO may have media
438
439
            @_description_list_group_add($groups, cdm_occurrence_field_name_label($field),
440 0820cdc0 Andreas Kohlbecker
              array(
441
                array('#markup' => $value->titleCache),
442
                array('#theme' => 'description_list', '#groups' => $sub_dl_groups)
443
              )
444 f19f47fa Andreas Kohlbecker
            );
445 6fbdb943 Andreas Kohlbecker
            break;
446
447 0820cdc0 Andreas Kohlbecker
          case 'storedUnder':
448
            @_description_list_group_add($groups, cdm_occurrence_field_name_label('storedUnder'), render_taxon_or_name($value));
449
            break;
450 6fbdb943 Andreas Kohlbecker
451
452 0820cdc0 Andreas Kohlbecker
          /* ---- Specimen --- */
453
          case 'sequences':
454
            $dd_elements = array();
455
            foreach ($value as $sequence) {
456
              $dd_elements[] = compose_cdm_sequence($sequence);
457
            }
458
            @_description_list_group_add($groups, cdm_occurrence_field_name_label($field), $dd_elements);
459 0de9cf51 Andreas Kohlbecker
            break;
460
461 0820cdc0 Andreas Kohlbecker
          // TODO preservation
462
          // TODO exsiccatum
463 6fbdb943 Andreas Kohlbecker
464
465
          /* ---- FieldObservation --- */
466
          case 'gatheringEvent':
467
            @_description_list_group_add($groups, cdm_occurrence_field_name_label('collector'), $value->actor->titleCache);
468 7aedf624 Andreas Kohlbecker
            @_description_list_group_add($groups, t('Gathering time'), timePeriodToString($value->timeperiod));
469 f19f47fa Andreas Kohlbecker
            @_description_list_group_add($groups, cdm_occurrence_field_name_label('description'), $value->description);
470 5b30a682 Andreas Kohlbecker
            @_description_list_group_add($groups, cdm_occurrence_field_name_label('locality'), $value->locality->text);
471 6fbdb943 Andreas Kohlbecker
            @_description_list_group_add($groups, cdm_occurrence_field_name_label('country'), $value->country->representation_L10n);
472
            @_description_list_group_add($groups, cdm_occurrence_field_name_label('collectingMethod'), $value->collectingMethod);
473 74ee6b54 Andreas Kohlbecker
            if (isset($value->absoluteElevation)) {
474 5a079dbf Andreas Kohlbecker
              $min_max_markup = min_max_measure($value, 'absoluteElevation');
475
              @_description_list_group_add($groups, cdm_occurrence_field_name_label('absoluteElevation'), $min_max_markup);
476 74ee6b54 Andreas Kohlbecker
            }
477
            if (isset($value->distanceToGround)) {
478 5a079dbf Andreas Kohlbecker
              $min_max_markup = min_max_measure($value, 'distanceToGround');
479 74ee6b54 Andreas Kohlbecker
              @_description_list_group_add($groups, cdm_occurrence_field_name_label('distanceToGround'), $min_max_markup);
480
            }
481
            if (isset($value->distanceToWaterSurface)) {
482 5a079dbf Andreas Kohlbecker
              $min_max_markup = min_max_measure($value, 'distanceToWaterSurface');
483 74ee6b54 Andreas Kohlbecker
              @_description_list_group_add($groups, cdm_occurrence_field_name_label('distanceToWaterSurface'), $min_max_markup);
484
            }
485
486 6fbdb943 Andreas Kohlbecker
            if (isset($value->collectingAreas)) {
487
              $area_representations = array();
488 0820cdc0 Andreas Kohlbecker
              foreach ($value->collectingAreas as $area) {
489 30845bda Andreas Kohlbecker
                $area_representations[] = l($area->representation_L10n, path_to_named_area($area->uuid));
490 6fbdb943 Andreas Kohlbecker
              }
491 30845bda Andreas Kohlbecker
              @_description_list_group_add($groups, cdm_occurrence_field_name_label('collectingAreas'),
492
                array(
493
                  array('#markup' => implode(', ', $area_representations))
494
                )
495
              );
496 6fbdb943 Andreas Kohlbecker
            }
497 c08f7882 Andreas Kohlbecker
            if (isset($value->exactLocation) && $value->exactLocation->sexagesimalString) {
498 6fbdb943 Andreas Kohlbecker
              $sub_dl_groups = array();
499 f19f47fa Andreas Kohlbecker
              @_description_list_group_add($sub_dl_groups, cdm_occurrence_field_name_label('errorRadius'), $value->exactLocation->errorRadius, ' m', 1);
500 9abfeeb1 Andreas Kohlbecker
              @_description_list_group_add($sub_dl_groups, cdm_occurrence_field_name_label('longitude'), round($value->exactLocation->longitude, 7), '°', 2);
501
              @_description_list_group_add($sub_dl_groups, cdm_occurrence_field_name_label('latitude'), round($value->exactLocation->latitude, 7), '°', 3);
502 6fbdb943 Andreas Kohlbecker
              if (isset($value->exactLocation->referenceSystem)) {
503
                @_description_list_group_add($sub_dl_groups, cdm_occurrence_field_name_label('referenceSystem'), $value->exactLocation->referenceSystem->representation_L10n, '', 4);
504
              }
505 f19f47fa Andreas Kohlbecker
506
              @_description_list_group_add($groups, cdm_occurrence_field_name_label('exactLocation'),
507 0820cdc0 Andreas Kohlbecker
                array(
508
                  array('#markup' => $value->exactLocation->sexagesimalString),
509 f19f47fa Andreas Kohlbecker
                  array(
510 0820cdc0 Andreas Kohlbecker
                    '#theme' => 'description_list',
511
                    '#groups' => $sub_dl_groups
512
                  ),
513
                )
514 6fbdb943 Andreas Kohlbecker
              );
515 f19f47fa Andreas Kohlbecker
            }
516
            break;
517
518 f846e7e7 Andreas Kohlbecker
          default:
519 0820cdc0 Andreas Kohlbecker
            if (is_object($value) || is_array($value)) {
520 f19f47fa Andreas Kohlbecker
              drupal_set_message("Unhandled type in compose_cdm_specimenOrObservation() for field " . $field, "warning");
521 f846e7e7 Andreas Kohlbecker
            } else {
522
              _description_list_group_add($groups, cdm_occurrence_field_name_label($field), $value);
523
            }
524 f19f47fa Andreas Kohlbecker
525
        }
526
527
      }
528 f846e7e7 Andreas Kohlbecker
    } // END of loop over $derivedUnitFacade fields
529
530 0820cdc0 Andreas Kohlbecker
    // Extensions
531
    $extensions = cdm_ws_fetch_all(CDM_WS_PORTAL_OCCURRENCE . '/'  . $specimenOrObservation->uuid . '/extensions', array($specimenOrObservation->uuid));
532
    if ($extensions && count($extensions)) {
533
534
      $extensions_render_array = compose_extensions($extensions);
535
      @_description_list_group_add($groups, t('Extensions') . ':',
536
        $extensions_render_array,
537
        '', 100);
538
    }
539
540 f846e7e7 Andreas Kohlbecker
541 eeb98da8 Andreas Kohlbecker
    // template_preprocess_description_list() is not worting by weight so we do it right here
542
    uasort($groups, 'element_sort');
543
544 f846e7e7 Andreas Kohlbecker
    $occurrence_elements = array(
545 f19f47fa Andreas Kohlbecker
        '#title' => $title,
546
        '#theme' => 'description_list',
547 6fbdb943 Andreas Kohlbecker
        '#groups' => $groups,
548 f19f47fa Andreas Kohlbecker
        '#attributes' => array('class' => html_class_attribute_ref($specimenOrObservation)),
549 f846e7e7 Andreas Kohlbecker
    );
550
    $derivatives[] = $occurrence_elements;
551 c9d996cd Andreas Kohlbecker
    // all footnotes which has been assembled so far (e.g. from typeDesignations) to here
552 15b7c460 Andreas Kohlbecker
    $foonote_li_elements = theme('cdm_footnotes', array('footnoteListKey' => RenderHints::getFootnoteListKey(), 'enclosingTag' => 'span'));
553 c9d996cd Andreas Kohlbecker
    if (!empty($foonote_li_elements)) {
554
      $derivatives[] =  array(
555 5dd1c644 Andreas Kohlbecker
          '#markup' =>  '<div class="footnotes">' . $foonote_li_elements . '</div>',
556 c9d996cd Andreas Kohlbecker
      );
557
    }
558 f846e7e7 Andreas Kohlbecker
559
    // --- recurse into originals
560 0796d2f9 Andreas Kohlbecker
    if (!isset($derivedFrom)) {
561
      $derivedFrom = cdm_ws_get(
562 6fbdb943 Andreas Kohlbecker
          CDM_WS_OCCURRENCE,
563
          array($specimenOrObservation->uuid, 'derivedFrom')
564
        );
565
    }
566
567 0796d2f9 Andreas Kohlbecker
    if (isset($derivedFrom)) {
568
      if (isset($derivedFrom->originals)) {
569
        $derived_from_label = t('derived');
570 6644c262 Andreas Kohlbecker
        $preposition = t('from');
571 0796d2f9 Andreas Kohlbecker
        if(isset($derivedFrom->type)){
572 0de9cf51 Andreas Kohlbecker
          $derived_from_label = $derivedFrom->type->representation_L10n;
573 6644c262 Andreas Kohlbecker
          if($derivedFrom->type->uuid == UUID_DERIVATIONEVENTTYPE_ACCESSIONING){
574
            $preposition = t('of');
575
          }
576 0796d2f9 Andreas Kohlbecker
        }
577 4554da02 Andreas Kohlbecker
        if (count($groups) > 0) {
578 eeb98da8 Andreas Kohlbecker
          // TODO  annotations
579
580 4554da02 Andreas Kohlbecker
          // only display the derived from information when the derivative has any element which will be diplayed
581
          $derivatives[] = array(
582 6644c262 Andreas Kohlbecker
              '#markup' => '<div class="derived_from">' . $derived_from_label . ' ' . $preposition . ': </div>',
583 4554da02 Andreas Kohlbecker
          );
584
        }
585 0796d2f9 Andreas Kohlbecker
        foreach ($derivedFrom->originals as $original) {
586
          compose_cdm_specimenOrObservation($original, $derivatives);
587
        }
588 f846e7e7 Andreas Kohlbecker
      }
589
    }
590 f1f05758 Andreas Kohlbecker
591 f846e7e7 Andreas Kohlbecker
  } // END of $specimenOrObservation exists
592 c70b93c3 Andreas Kohlbecker
593 f846e7e7 Andreas Kohlbecker
  return $derivatives;
594 f1f05758 Andreas Kohlbecker
}
595 0de9cf51 Andreas Kohlbecker
596 0820cdc0 Andreas Kohlbecker
597 0de9cf51 Andreas Kohlbecker
/**
598
 * Compose an render array from a CDM Sequence object.
599
 *
600
 * compose_hook() implementation
601
 *
602
 * @param object $sequence
603
 *   CDM instance of type Sequence
604
 * @return array
605
 *   A render array containing the fields of the supplied $sequence
606 5b26b91a Andreas Kohlbecker
 *
607
 * @ingroup compose
608 0de9cf51 Andreas Kohlbecker
 */
609
function compose_cdm_sequence($sequence) {
610
611 eeb98da8 Andreas Kohlbecker
  $exclude_sequence_fields = &drupal_static(__FUNCTION__);
612
  if (!isset($exclude_sequence_fields)) {
613
    $exclude_sequence_fields = array(
614 0de9cf51 Andreas Kohlbecker
      'titleCache',
615
      'protectedTitleCache',
616
      'microReference',
617
      'created',
618
      'updated',
619
      'class',
620 eeb98da8 Andreas Kohlbecker
    );
621
  }
622 0de9cf51 Andreas Kohlbecker
623
  $groups = array();
624
625 eeb98da8 Andreas Kohlbecker
  // -- retrieve additional data if neesscary
626 1083804e Andreas Kohlbecker
  // TODO below call disabled since sequences are not yet supported,
627 a950f2f9 Andreas Kohlbecker
  //      see  #3347 (services and REST service controller for molecular classes implemented)
628
  //
629
  // cdm_load_annotations($sequence);
630 eeb98da8 Andreas Kohlbecker
631 0de9cf51 Andreas Kohlbecker
  foreach (get_object_vars($sequence) as $field => $value) {
632 eeb98da8 Andreas Kohlbecker
633
634
    if (!in_array($field, $exclude_sequence_fields) && ($value && (!is_object($value) || isset($value->class)))) {
635 0de9cf51 Andreas Kohlbecker
      switch ($field) {
636
637 1083804e Andreas Kohlbecker
        case 'geneticAccessionNumber';
638 1b57b3c1 Andreas Kohlbecker
          $dd_elements = array();
639
          foreach ($value as $accession) {
640
            if (isset($accession->uri) ){
641
              $dd_elements[] = l($accession->accessionNumber, $accession->uri);
642
            } else {
643
              $dd_elements[] = $accession->accessionNumber;
644
            }
645 0de9cf51 Andreas Kohlbecker
          }
646 1b57b3c1 Andreas Kohlbecker
          @_description_list_group_add($groups, cdm_occurrence_field_name_label($field),  $dd_elements, NULL, 1);
647 0de9cf51 Andreas Kohlbecker
          break;
648
649
650 1083804e Andreas Kohlbecker
        case 'locus': // FIXME 3.3 now dnaMarker (DefinedTerm)  if multiple amplifications where used to build this consensus sequence it may be the super set of the markers used in amplification.
651 1b57b3c1 Andreas Kohlbecker
          if (isset($value->name)) {
652 2196c738 Andreas Kohlbecker
            @_description_list_group_add($groups, cdm_occurrence_field_name_label($field),  $value->name, NULL, 3);
653 1b57b3c1 Andreas Kohlbecker
          }
654
          if (isset($value->description)) {
655 2196c738 Andreas Kohlbecker
            @_description_list_group_add($groups, cdm_occurrence_field_name_label($field) . ' ' . t('description') , $value->description, NULL, 4);
656 1b57b3c1 Andreas Kohlbecker
          }
657
          break;
658
659 1083804e Andreas Kohlbecker
        case 'consensusSequence':
660 0de9cf51 Andreas Kohlbecker
          // format in genbank style, force linebreaks after each 70 nucleotites
661
          // see also http://stackoverflow.com/questions/499137/css-how-can-i-force-a-long-string-without-any-blank-to-be-wrapped-in-xul-and
662
          @_description_list_group_add(
663
            $groups,
664
            cdm_occurrence_field_name_label($field),
665
            array(
666
              array(
667 1083804e Andreas Kohlbecker
                '#markup' => '<div class="sequence-length">' . $value->length . ' ' . t('pb'). '</div><div>' . wordwrap($value->string, 70, '</br>', TRUE) . '</div>',
668 0de9cf51 Andreas Kohlbecker
                '#wrapper_attributes' => array('class'=>'dna-sequence')
669
                )
670
              ),
671 2196c738 Andreas Kohlbecker
            5);
672 0de9cf51 Andreas Kohlbecker
          break;
673
674 1083804e Andreas Kohlbecker
         case 'dnaSample': // FIXME 3.3 implement
675
            break;
676
        case 'singleReads': // FIXME 3.3 implement
677
          break;
678
        case 'contigFile': // FIXME 3.3 implement - Media
679
            break;
680
        case 'pherograms': // FIXME 3.3 implement - Media
681
          break;
682
        case 'haplotype': // FIXME 3.3 implement
683
            break;
684
        case 'dateSequenced': // FIXME 3.3 now in SingelRead
685 2196c738 Andreas Kohlbecker
          @_description_list_group_add($groups, t('Sequencing date'),  timePeriodToString($value), NULL, 6);
686 0de9cf51 Andreas Kohlbecker
          break;
687
688
        case 'barcode': // boolean
689 2196c738 Andreas Kohlbecker
          @_description_list_group_add($groups, cdm_occurrence_field_name_label($field), $value ? 'Yes': 'No', NULL, 7);
690 0de9cf51 Andreas Kohlbecker
          break;
691 1083804e Andreas Kohlbecker
        case 'barcodeSequencePart': // FIXME 3.3 implement, compose sequence
692
            break;
693 0de9cf51 Andreas Kohlbecker
694
        case 'citation':
695
          @_description_list_group_add($groups,
696
            cdm_occurrence_field_name_label($field),
697 1b57b3c1 Andreas Kohlbecker
            theme('cdm_reference', array('reference' =>$value, 'microReference' => $sequence->microReference)),
698 0de9cf51 Andreas Kohlbecker
            NULL,
699 2196c738 Andreas Kohlbecker
            8
700 0de9cf51 Andreas Kohlbecker
          );
701
          break;
702
703 1b57b3c1 Andreas Kohlbecker
        case 'publishedIn':
704
          @_description_list_group_add($groups,
705
            cdm_occurrence_field_name_label($field),
706
            theme('cdm_reference', array('reference'=>$value)),
707
            NULL,
708
            7
709
          );
710 daef68e9 Andreas Kohlbecker
          break;
711 eeb98da8 Andreas Kohlbecker
712
        case 'rights':
713
          array_merge($groups, cdm_rights_as_dl_groups($value));
714 daef68e9 Andreas Kohlbecker
          break;
715 eeb98da8 Andreas Kohlbecker
716
        case 'annotations':
717
          $dd_elements = array();
718
          foreach ($value as $annotation) {
719
            // TODO respect annotation type filter settings
720
            $dd_elements[] = $annotation->text;
721
          }
722
          @_description_list_group_add($groups, t('Notes'), $dd_elements, NULL, 9);
723 1b57b3c1 Andreas Kohlbecker
          break;
724
725 4ae6064e Andreas Kohlbecker
        case 'markers':
726
          $dd_elements = array();
727
          foreach ($value as $marker) {
728
            $dd_elements[] = compose_cdm_marker($marker);
729
          }
730
          @_description_list_group_add($groups, cdm_occurrence_field_name_label($field), $dd_elements, NULL, 10);
731
          break;
732
733 0de9cf51 Andreas Kohlbecker
        case 'chromatograms':
734 1b57b3c1 Andreas Kohlbecker
          @_description_list_group_add($groups, cdm_occurrence_field_name_label($field),
735 0de9cf51 Andreas Kohlbecker
              array(
736 a9815578 Andreas Kohlbecker
                  '#markup'=>compose_cdm_media_gallerie(array('medialist'=>$value)),
737 2196c738 Andreas Kohlbecker
              ),
738
              NULL,
739 4ae6064e Andreas Kohlbecker
              11);
740 0de9cf51 Andreas Kohlbecker
          break;
741
742
        default:
743
          if(is_object($value) || is_array($value)){
744
            drupal_set_message("Unhandled type in compose_cdm_sequence() for field " . $field, "warning");
745
          } else {
746 eeb98da8 Andreas Kohlbecker
            _description_list_group_add($groups, cdm_occurrence_field_name_label($field), $value, NULL, 20);
747 0de9cf51 Andreas Kohlbecker
          }
748
      }
749
    }
750
  }
751
752 eeb98da8 Andreas Kohlbecker
  // template_preprocess_description_list() is not worting by weight so we do it right here
753
  uasort($groups, 'element_sort');
754
755 0de9cf51 Andreas Kohlbecker
  $sequence_elements = array(
756
      '#theme' => 'description_list',
757
      '#groups' => $groups
758
  );
759
760
  return $sequence_elements;
761
}
762 1083804e Andreas Kohlbecker