1
|
<?php
|
2
|
// $Id$
|
3
|
|
4
|
/**
|
5
|
* Copyright (C) 2007 EDIT
|
6
|
* European Distributed Institute of Taxonomy
|
7
|
* http://www.e-taxonomy.eu
|
8
|
*
|
9
|
* The contents of this file are subject to the Mozilla Public License Version 1.1
|
10
|
* See http://www.mozilla.org/MPL/MPL-1.1.html for the full license terms.
|
11
|
*/
|
12
|
|
13
|
function theme_cdm_search_results($pager, $path, $parameters){
|
14
|
|
15
|
|
16
|
$showThumbnails = $_SESSION['pageoptions']['searchtaxa']['showThumbnails'];
|
17
|
if( !is_numeric($showThumbnails)){
|
18
|
$showThumbnails = 1;
|
19
|
}
|
20
|
$setSessionUri = url('cdm_api/setvalue/session', "var=[pageoption][searchtaxa][showThumbnails]&val=");
|
21
|
drupal_add_js('$(document).ready(function() {
|
22
|
|
23
|
// init
|
24
|
if('.$showThumbnails.' == 1){
|
25
|
$(\'.media_gallery\').show(20);
|
26
|
} else {
|
27
|
$(\'.media_gallery\').hide(20);
|
28
|
}
|
29
|
// add change hander
|
30
|
$(\'#showThumbnails\').change(
|
31
|
function(event){
|
32
|
var state = 0;
|
33
|
if($(this).is(\':checked\')){
|
34
|
$(\'.media_gallery\').show(20);
|
35
|
state = 1;
|
36
|
} else {
|
37
|
$(\'.media_gallery\').hide(20);
|
38
|
}
|
39
|
// store state in session variable
|
40
|
var uri = \''.$setSessionUri.'\' + state;
|
41
|
jQuery.get(uri);
|
42
|
});
|
43
|
});', "inline");
|
44
|
|
45
|
drupal_set_title(t('Search results'));
|
46
|
|
47
|
$out = ''; //l('Advanced Search', '/cdm_dataportal/search');
|
48
|
|
49
|
$out = '<div class="page_options"><form name="pageoptions"><input id="showThumbnails" type="checkbox" name="showThumbnails" '.($showThumbnails == 1? 'checked="checked"': '').'> '.t('Show Thumbnails').'</form></div>';
|
50
|
if(count($pager->records) > 0){
|
51
|
$out .= '<div id="search_results">';
|
52
|
$out .= theme('cdm_list_of_taxa', $pager->records);
|
53
|
$out .= '</div>';
|
54
|
$out .= theme('cdm_pager', $pager, $path, $parameters);
|
55
|
} else {
|
56
|
$out = '<h4 class="error">Sorry, no matching entries found.</h4>';
|
57
|
}
|
58
|
return $out;
|
59
|
}
|
60
|
|
61
|
|
62
|
/**
|
63
|
* renders misapplied names and invalid designations.
|
64
|
* Both relation types are currently treated the same!
|
65
|
*
|
66
|
* @param unknown_type $taxonRelationships
|
67
|
* @return unknown
|
68
|
*/
|
69
|
function theme_cdm_taxonRelationships($taxonRelationships){
|
70
|
|
71
|
if(!$taxonRelationships){
|
72
|
return;
|
73
|
}
|
74
|
|
75
|
RenderHints::pushToRenderStack('taxonRelationships');
|
76
|
$footnoteListKey = 'taxonRelationships';
|
77
|
RenderHints::setFootnoteListKey($footnoteListKey);
|
78
|
|
79
|
$misapplied = array();
|
80
|
$joinedAuthorTeams = array();
|
81
|
|
82
|
$taxon_relationship_types = variable_get(CDM_TAXON_RELATIONSHIP_TYPES, unserialize(CDM_TAXON_RELATIONSHIP_TYPES_DEFAULT));
|
83
|
|
84
|
// aggregate misapplied names having the same fullname:
|
85
|
foreach($taxonRelationships as $taxonRelation){
|
86
|
|
87
|
if( in_array($taxonRelation->type->uuid, $taxon_relationship_types)) {
|
88
|
|
89
|
if( $taxonRelation->type->uuid == UUID_MISAPPLIED_NAME_FOR || $taxonRelation->type->uuid == UUID_INVALID_DESIGNATION_FOR ){
|
90
|
|
91
|
$name = $taxonRelation->fromTaxon->name->titleCache;
|
92
|
|
93
|
$author_team = cdm_ws_get(CDM_WS_REFERENCE_AUTHORTEAM, $taxonRelation->fromTaxon->sec->uuid);
|
94
|
$authorteam = $author_team->titleCache;
|
95
|
|
96
|
if(!isset($misapplied[$name])){
|
97
|
$misapplied[$name]['out'] =
|
98
|
'<span class="misapplied">'
|
99
|
.theme('cdm_related_taxon',$taxonRelation->fromTaxon, UUID_MISAPPLIED_NAME_FOR).
|
100
|
'</span>';
|
101
|
}
|
102
|
|
103
|
// collect all authors for this fullname
|
104
|
if(isset($authorteam)){
|
105
|
$misapplied[$name]['authorteam'][$authorteam] = '';
|
106
|
$joinedAuthorTeams[$authorteam] = 'sensu '.theme('cdm_reference', $taxonRelation->fromTaxon->sec);
|
107
|
}
|
108
|
|
109
|
} else {
|
110
|
// all relationsship types but misapplied_name_for invalid_designation_for
|
111
|
$taxonRelationshipsLines[] = theme('cdm_related_taxon',$taxonRelation->fromTaxon, $taxonRelation->type->uuid, $taxonRelation->type, true);
|
112
|
}
|
113
|
}
|
114
|
}
|
115
|
|
116
|
// sort the joinedAuthorTeams and create footnotes and footnotekeys
|
117
|
ksort($joinedAuthorTeams);
|
118
|
foreach($joinedAuthorTeams as $authorteam=>$sensuCitation){
|
119
|
$footnoteKey = FootnoteManager::addNewFootnote($footnoteListKey, $sensuCitation);
|
120
|
$joinedAuthorTeams[$authorteam] = '<span class="sensu">sensu '.$authorteam. theme('cdm_footnote_key', $footnoteKey).'</span>';
|
121
|
}
|
122
|
|
123
|
// generate output
|
124
|
if(is_array($misapplied) && count($misapplied) >0 ){
|
125
|
$out .= '<ul class="misapplied">';
|
126
|
foreach($misapplied as $misapplied_name){
|
127
|
|
128
|
$out .= '<li class="synonym">'.$misapplied_name['out'] . " ";
|
129
|
if(isset($misapplied_name['authorteam'])){
|
130
|
// fill authors with the renderedFootnoteKey and sorting 'em
|
131
|
foreach($misapplied_name['authorteam'] as $authorteam=>&$renderedFootnoteKey) {
|
132
|
$renderedFootnoteKey = $joinedAuthorTeams[$authorteam];
|
133
|
}
|
134
|
ksort($misapplied_name['authorteam']);
|
135
|
$out .= join('; ', $misapplied_name['authorteam']);
|
136
|
}
|
137
|
$out .= '</li>';
|
138
|
|
139
|
}
|
140
|
$out .= '</ul>';
|
141
|
}
|
142
|
|
143
|
if(is_array($taxonRelationshipsLines) && count($taxonRelationshipsLines) >0 ){
|
144
|
$out .= '<ul class="taxonRelationships">';
|
145
|
foreach($taxonRelationshipsLines as $taxonRelationshipLine){
|
146
|
$out .= '<li class="synonym">'. $taxonRelationshipLine . '</li>';
|
147
|
}
|
148
|
$out .= '</ul>';
|
149
|
}
|
150
|
|
151
|
|
152
|
$tr_footnotes = theme('cdm_footnotes', $footnoteListKey, 'li');
|
153
|
$tr_footnotes_exploded = explode('sensu', $tr_footnotes);
|
154
|
$tr_footnotes_aux = '';
|
155
|
foreach ($tr_footnotes_exploded as $element){
|
156
|
$tr_footnotes_aux .= $element;
|
157
|
}
|
158
|
$out .= '<ul>' . $tr_footnotes_aux . '</ul>';
|
159
|
//$out .= '</ul>';
|
160
|
RenderHints::popFromRenderStack();
|
161
|
return $out;
|
162
|
}
|
163
|
|
164
|
|
165
|
|
166
|
function theme_cdm_acceptedFor(){
|
167
|
RenderHints::pushToRenderStack('acceptedFor');
|
168
|
|
169
|
$out = '';
|
170
|
if(isset($_REQUEST['acceptedFor'])){
|
171
|
|
172
|
$synonym = cdm_ws_get(CDM_WS_PORTAL_TAXON, $_REQUEST['acceptedFor']);
|
173
|
|
174
|
if($synonym){
|
175
|
$out .= '<span class="acceptedFor">';
|
176
|
$out .= t('is accepted for ');
|
177
|
if(isset($synonym->name->nomenclaturalReference)){
|
178
|
$referenceUri = url(path_to_reference($synonym->name->nomenclaturalReference->uuid));
|
179
|
}
|
180
|
$out .= theme('cdm_taxonName', $synonym->name, null, $referenceUri);
|
181
|
$out .= theme('cdm_annotations_as_footnotekeys', $synonym);
|
182
|
$out .= '</span>';
|
183
|
}
|
184
|
}
|
185
|
RenderHints::popFromRenderStack();
|
186
|
return $out;
|
187
|
}
|
188
|
|
189
|
|
190
|
|
191
|
function theme_cdm_list_of_taxa($records, $showMedia = false){
|
192
|
|
193
|
RenderHints::pushToRenderStack('list_of_taxa');
|
194
|
|
195
|
$form_name = 'search_gallery';
|
196
|
//$default_values = unserialize(CDM_DATAPORTAL_GALLERY_SETTINGS);
|
197
|
//$gallery_settings = variable_get($form_name, $default_values);
|
198
|
|
199
|
$gallery_settings = getGallerySettings(CDM_DATAPORTAL_SEARCH_GALLERY_NAME);
|
200
|
|
201
|
$showMedia_taxa = $gallery_settings['cdm_dataportal_show_taxon_thumbnails'];
|
202
|
$showMedia_synonyms = $gallery_settings['cdm_dataportal_show_synonym_thumbnails'];
|
203
|
//$showMedia_taxa = variable_get('cdm_dataportal_findtaxa_show_taxon_thumbnails', 1);
|
204
|
//$showMedia_synonyms = variable_get('cdm_dataportal_findtaxa_show_synonym_thumbnails', 0);
|
205
|
|
206
|
$classification_uuid = get_taxonomictree_uuid_selected();
|
207
|
|
208
|
// .. well, for sure not as performant as before, but better than nothing.
|
209
|
$synonym_uuids = array();
|
210
|
foreach($records as $taxon){
|
211
|
if($taxon->class != "Taxon"){
|
212
|
if(!array_key_exists($taxon->uuid, $synonym_uuids)){
|
213
|
$synonym_uuids[$taxon->uuid] = $taxon->uuid;
|
214
|
}
|
215
|
}
|
216
|
}
|
217
|
// batch service not jet implemented:
|
218
|
// $table_of_accepted = cdm_ws_property(CDM_WS_PORTAL_TAXON_ACCEPTED, join(',', $synonym_uuids));
|
219
|
// thus ...
|
220
|
$table_of_accepted = array();
|
221
|
|
222
|
foreach($synonym_uuids as $synUuid){
|
223
|
$table_of_accepted[$synUuid] = cdm_ws_get(CDM_WS_PORTAL_TAXON_ACCEPTED, array($synUuid, $classification_uuid));
|
224
|
}
|
225
|
|
226
|
$out = '<ul class="cdm_names" style="background-image: none;">';
|
227
|
|
228
|
foreach($records as $taxon){
|
229
|
// its a Taxon
|
230
|
if($taxon->class == "Taxon"){
|
231
|
$taxonUri = url(path_to_taxon($taxon->uuid));
|
232
|
if(isset($taxon->name->nomenclaturalReference)){
|
233
|
$referenceUri = url(path_to_reference($taxon->name->nomenclaturalReference->uuid));
|
234
|
}
|
235
|
$out .= '<li class="Taxon">'.theme('cdm_taxonName', $taxon->name, $taxonUri, $referenceUri);
|
236
|
$out .= theme('cdm_annotations_as_footnotekeys', $taxon);
|
237
|
|
238
|
if($showMedia_taxa){
|
239
|
$out .= theme('cdm_taxon_list_thumbnails', $taxon);
|
240
|
}
|
241
|
$out .= '</li>';
|
242
|
} else {
|
243
|
// its a synonym
|
244
|
$uuid = $taxon->uuid;
|
245
|
$acceptedTaxa = $table_of_accepted[$uuid];
|
246
|
if(count($acceptedTaxa) == 1){
|
247
|
$acceptedTaxon = $acceptedTaxa[0];
|
248
|
$taxonUri = theme('cdm_uri_to_synonym', $taxon->uuid, $acceptedTaxon->uuid, 'synonymy');
|
249
|
if(isset($acceptedTaxon->name->nomenclaturalReference)){
|
250
|
$referenceUri = url(path_to_reference($acceptedTaxon->name->nomenclaturalReference->uuid));
|
251
|
}
|
252
|
$out .= '<li class="Synonym">'.theme('cdm_taxonName', $taxon->name, $taxonUri, $referenceUri);
|
253
|
$out .= theme('cdm_annotations_as_footnotekeys', $taxon);
|
254
|
if($showMedia_synonyms){
|
255
|
$out .= theme('cdm_taxon_list_thumbnails', $acceptedTaxon);
|
256
|
}
|
257
|
$out .= '</li>';
|
258
|
} else {
|
259
|
//TODO avoid using Ajax in the cdm_dynabox .... why?
|
260
|
//TODO add media
|
261
|
$out .= cdm_dynabox(
|
262
|
theme('cdm_taxonName', $taxon->name, null, null, false),
|
263
|
cdm_compose_url(CDM_WS_PORTAL_TAXON_ACCEPTED, array($taxon->uuid, $classification_uuid)),
|
264
|
'cdm_list_of_taxa',
|
265
|
'Click for accepted taxon');
|
266
|
}
|
267
|
}
|
268
|
}
|
269
|
|
270
|
$out .= '</ul>';
|
271
|
RenderHints::popFromRenderStack();
|
272
|
return $out;
|
273
|
}
|
274
|
|
275
|
|
276
|
function theme_cdm_related_taxon($taxon, $reltype_uuid = false, $taxonRelationType = null, $doLinkTaxon = false){
|
277
|
|
278
|
static $relsign_homo = '≡';
|
279
|
static $relsign_hetero = '=';
|
280
|
static $relsign_invalid = '–';
|
281
|
|
282
|
$name_prefix = '';
|
283
|
$name_postfix = '';
|
284
|
|
285
|
$skiptags = array();
|
286
|
|
287
|
if(isset($taxonRelationType->representation_L10n_abbreviatedLabel)){
|
288
|
$relsign = $taxonRelationType->representation_L10n_abbreviatedLabel;
|
289
|
}
|
290
|
|
291
|
$reltype_representation = '';
|
292
|
if(isset($taxonRelationType->representation_L10n)){
|
293
|
$reltype_representation = $taxonRelationType->representation_L10n;
|
294
|
}
|
295
|
|
296
|
if(!$relsign) {
|
297
|
|
298
|
$relsign = '';
|
299
|
switch ($reltype_uuid){
|
300
|
case UUID_HETEROTYPIC_SYNONYM_OF:
|
301
|
case UUID_SYNONYM_OF:
|
302
|
$relsign = $relsign_hetero;
|
303
|
break;
|
304
|
case UUID_HOMOTYPIC_SYNONYM_OF:
|
305
|
$relsign = $relsign_homo;
|
306
|
break;
|
307
|
case UUID_MISAPPLIED_NAME_FOR:
|
308
|
case UUID_INVALID_DESIGNATION_FOR:
|
309
|
$skiptags[] = 'authors';
|
310
|
$relsign = $relsign_invalid;
|
311
|
$name_prefix = '"';
|
312
|
$name_postfix = '"';
|
313
|
break;
|
314
|
default :
|
315
|
$relsign = $relsign_invalid;
|
316
|
}
|
317
|
}
|
318
|
/*
|
319
|
* names with status invalid or nudum are to be displayed with the $relsign_invalid,
|
320
|
* these names appear at the end of all names in their homotypic group
|
321
|
* (ordered correctly by the java cdm_lib)
|
322
|
*/
|
323
|
if ( is_array($taxon->name->status)) {
|
324
|
foreach($taxon->name->status as $status){
|
325
|
if ($status->type->uuid == UUID_NOMENCLATURALSTATUS_TYPE_INVALID || $status->type->uuid == UUID_NOMENCLATURALSTATUS_TYPE_NUDUM){
|
326
|
$relsign = $relsign_invalid;
|
327
|
}
|
328
|
}
|
329
|
}
|
330
|
|
331
|
// now rendering starts ..
|
332
|
|
333
|
RenderHints::pushToRenderStack('related_taxon');
|
334
|
|
335
|
if($taxon->name->nomenclaturalReference){
|
336
|
$referenceUri = url(path_to_reference($taxon->name->nomenclaturalReference->uuid));
|
337
|
}
|
338
|
if($doLinkTaxon){
|
339
|
$taxonUri = url(path_to_taxon($taxon->uuid));
|
340
|
}
|
341
|
//printing the taxonName and the handling the special case of annotations
|
342
|
$nameHtml = theme('cdm_taxonName', $taxon->name, $taxonUri, $referenceUri, true, false, $skiptags);
|
343
|
$special_annotations_array = array();
|
344
|
$special_annotations_array[] = $taxon->name;
|
345
|
$special_annotations_array[] = $taxon;
|
346
|
$nameHtml .= theme('cdm_annotations_as_footnotekeys', $special_annotations_array);
|
347
|
|
348
|
//later homonym or trated as later homonym AND bloking names
|
349
|
$from_name_relations = cdm_ws_get(CDM_WS_PORTAL_TAXON_FROM_NAMERELATIONS, $taxon->uuid);
|
350
|
$to_name_relations = cdm_ws_get(CDM_WS_PORTAL_TAXON_TO_NAMERELATIONS, $taxon->uuid);
|
351
|
//first the FROM RELS
|
352
|
if ($from_name_relations){
|
353
|
foreach($from_name_relations as $element){
|
354
|
switch ($element->type->representation_L10n){
|
355
|
case 'later homonym for':
|
356
|
if(isset($name_relations_html)){
|
357
|
$name_relations_html .= ' nec ' . l($element->toName->titleCache . ' ' . substr($element->toName->nomenclaturalReference->datePublished->start, 0, 4),
|
358
|
'cdm_dataportal/name/' . $element->toName->uuid . '/' . $taxon->uuid . '/' . $element->toName->taxonBases[0]->uuid);
|
359
|
}else{
|
360
|
$name_relations_html = ' non ' . l($element->toName->titleCache . ' ' . substr($element->toName->nomenclaturalReference->datePublished->start, 0, 4),
|
361
|
'cdm_dataportal/name/' . $element->toName->uuid . '/' . $taxon->uuid . '/' . $element->toName->taxonBases[0]->uuid)
|
362
|
. ' ' . $element->toName->datePublished->start;
|
363
|
}
|
364
|
break;
|
365
|
case 'treated as later homonym for':
|
366
|
if(isset($name_relations_html)){
|
367
|
$name_relations_html = ' nec ' . l($element->toName->titleCache . ' ' . substr($element->toName->nomenclaturalReference->datePublished->start, 0, 4),
|
368
|
'cdm_dataportal/name/' . $element->toName->uuid);
|
369
|
}else{
|
370
|
$name_relations_html = ' non ' . l($element->toName->titleCache . ' ' . substr($element->toName->nomenclaturalReference->datePublished->start, 0, 4),
|
371
|
'cdm_dataportal/name/' . $element->toName->uuid);
|
372
|
}
|
373
|
break;
|
374
|
}
|
375
|
}
|
376
|
//second the TO RELS
|
377
|
if ($to_name_relations){
|
378
|
foreach($to_name_relations as $element){
|
379
|
switch ($element->type->representation_L10n){
|
380
|
case 'blocking name for':
|
381
|
if(isset($name_relations_html) ){
|
382
|
$name_relations_html .= ' nec ' . l($element->fromName->titleCache . ' ' . substr($element->fromName->nomenclaturalReference->datePublished->start, 0, 4),
|
383
|
'cdm_dataportal/name/' . $element->fromName->uuid . '/' . $taxon->uuid . '/' . $element->fromName->taxonBases[0]->uuid);
|
384
|
}else{
|
385
|
$name_relations_html = ' non ' . l($element->fromName->titleCache . ' ' . substr($element->fromName->nomenclaturalReference->datePublished->start, 0, 4),
|
386
|
'cdm_dataportal/name/' . $element->fromName->uuid . '/' . $taxon->uuid . '/' . $element->fromName->taxonBases[0]->uuid)
|
387
|
. ' ' . $element->fromName->datePublished->start;
|
388
|
}
|
389
|
break;
|
390
|
}
|
391
|
}
|
392
|
}
|
393
|
//rels output
|
394
|
if(isset($name_relations_html)){
|
395
|
$name_relations_html = '['. $name_relations_html .']';
|
396
|
}
|
397
|
}
|
398
|
//geneal output
|
399
|
$out = '<span class="relation_sign" title="' . $reltype_representation . '">'.$relsign.'</span>'.$name_prefix . $nameHtml . $name_postfix . $name_relations_html;
|
400
|
$out = uuid_anchor($taxon->uuid, $out);
|
401
|
|
402
|
RenderHints::popFromRenderStack();
|
403
|
|
404
|
return $out;
|
405
|
}
|
406
|
|
407
|
/**
|
408
|
*/
|
409
|
function theme_cdm_taxon_list_thumbnails($taxon){
|
410
|
|
411
|
|
412
|
$gallery_settings = getGallerySettings(CDM_DATAPORTAL_SEARCH_GALLERY_NAME);
|
413
|
$showCaption = $gallery_settings['cdm_dataportal_show_thumbnail_captions'];
|
414
|
|
415
|
if($showCaption){
|
416
|
$captionElements = array('title', 'rights');
|
417
|
}
|
418
|
|
419
|
$gallery_name = $taxon->uuid;
|
420
|
|
421
|
$mediaQueryParameters = array("type"=>"ImageFile");
|
422
|
$galleryLinkUri = path_to_taxon($taxon->uuid).'/images';
|
423
|
|
424
|
// cdm_dataportal_show_media = ???? TODO
|
425
|
$selectShowMedia = variable_get('cdm_dataportal_show_media', 0);
|
426
|
if ($selectShowMedia == 0){
|
427
|
$mediaList = cdm_ws_get(CDM_WS_PORTAL_TAXON_MEDIA, array($taxon->uuid), queryString( $mediaQueryParameters ));
|
428
|
}else{
|
429
|
$mediaList = cdm_ws_get(CDM_WS_PORTAL_TAXON_SUBTREE_MEDIA, array($taxon->uuid), queryString( $mediaQueryParameters ));
|
430
|
}
|
431
|
|
432
|
$out .= theme('cdm_media_gallerie', $mediaList, $gallery_name ,
|
433
|
$gallery_settings['cdm_dataportal_media_maxextend'],
|
434
|
$gallery_settings['cdm_dataportal_media_cols'],
|
435
|
$gallery_settings['cdm_dataportal_media_maxRows'],
|
436
|
$captionElements, 'LIGHTBOX', null, $galleryLinkUri);
|
437
|
|
438
|
return $out;
|
439
|
}
|
440
|
|
441
|
|