1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
/** |
4
|
|
|
* Class for handling concept property values. |
5
|
|
|
*/ |
6
|
|
|
class ConceptPropertyValue extends VocabularyDataObject |
7
|
|
|
{ |
8
|
|
|
/** submembers */ |
9
|
|
|
private $submembers; |
10
|
|
|
/** property type */ |
11
|
|
|
private $type; |
12
|
|
|
/** content language */ |
13
|
|
|
private $clang; |
14
|
|
|
/** whether the property value is external w.r.t. to the subject resource */ |
15
|
|
|
private $external; |
16
|
|
|
|
17
|
|
|
public function __construct($model, $vocab, $resource, $prop, $clang = '', $external = false) |
18
|
|
|
{ |
19
|
|
|
parent::__construct($model, $vocab, $resource); |
20
|
|
|
$this->submembers = array(); |
21
|
|
|
$this->type = $prop; |
22
|
|
|
$this->clang = $clang; |
23
|
|
|
$this->external = $external; |
24
|
|
|
} |
25
|
|
|
|
26
|
|
|
public function __toString() |
27
|
|
|
{ |
28
|
|
|
$label = is_string($this->getLabel()) ? $this->getLabel() : $this->getLabel()->getValue(); |
29
|
|
|
if ($this->vocab->getConfig()->sortByNotation()) { |
30
|
|
|
$label = $this->getNotation() . $label; |
31
|
|
|
} |
32
|
|
|
|
33
|
|
|
return $label; |
34
|
|
|
} |
35
|
|
|
|
36
|
|
|
public function getLang() |
37
|
|
|
{ |
38
|
|
|
return $this->getEnvLang(); |
39
|
|
|
} |
40
|
|
|
|
41
|
|
|
public function getLabel($lang = '', $fallbackToUri = 'uri') |
42
|
|
|
{ |
43
|
|
|
if ($this->clang) { |
44
|
|
|
$lang = $this->clang; |
45
|
|
|
} |
46
|
|
|
if ($this->vocab->getConfig()->getLanguageOrder($lang)) { |
47
|
|
View Code Duplication |
foreach ($this->vocab->getConfig()->getLanguageOrder($lang) as $fallback) { |
|
|
|
|
48
|
|
|
if ($this->resource->label($fallback) !== null) { |
49
|
|
|
return $this->resource->label($fallback); |
50
|
|
|
} |
51
|
|
|
// We need to check all the labels in case one of them matches a subtag of the current language |
52
|
|
|
if ($this->resource->allLiterals('skos:prefLabel')) { |
53
|
|
|
foreach($this->resource->allLiterals('skos:prefLabel') as $label) { |
54
|
|
|
// the label lang code is a subtag of the UI lang eg. en-GB - create a new literal with the main language |
55
|
|
|
if ($label !== null && strpos($label->getLang(), $fallback . '-') === 0) { |
56
|
|
|
return EasyRdf\Literal::create($label, $fallback); |
57
|
|
|
} |
58
|
|
|
} |
59
|
|
|
} |
60
|
|
|
} |
61
|
|
|
} |
62
|
|
|
|
63
|
|
|
if ($this->resource->label($lang) !== null) { // current language |
64
|
|
|
return $this->resource->label($lang); |
65
|
|
|
} elseif ($this->resource->label($this->vocab->getConfig()->getDefaultLanguage()) !== null) { // vocab default language |
66
|
|
|
return $this->resource->label($this->vocab->getConfig()->getDefaultLanguage()); |
67
|
|
|
} elseif ($this->resource->label() !== null) { // any language |
68
|
|
|
return $this->resource->label(); |
69
|
|
|
} elseif ($this->resource->getLiteral('rdf:value', $lang) !== null) { // current language |
70
|
|
|
return $this->resource->getLiteral('rdf:value', $lang); |
71
|
|
|
} elseif ($this->resource->getLiteral('rdf:value') !== null) { // any language |
72
|
|
|
return $this->resource->getLiteral('rdf:value'); |
73
|
|
|
} |
74
|
|
|
|
75
|
|
|
// see if we can find a label in another vocabulary known by the skosmos instance |
76
|
|
|
$label = $this->getExternalLabel($this->vocab, $this->getUri(), $lang); |
77
|
|
|
if ($label) { |
78
|
|
|
return $label; |
79
|
|
|
} |
80
|
|
|
|
81
|
|
|
if ($fallbackToUri == 'uri') { |
82
|
|
|
// return uri if no label is found |
83
|
|
|
$label = $this->resource->shorten() ? $this->resource->shorten() : $this->getUri(); |
84
|
|
|
return $label; |
85
|
|
|
} |
86
|
|
|
return null; |
87
|
|
|
} |
88
|
|
|
|
89
|
|
|
public function getType() |
90
|
|
|
{ |
91
|
|
|
return $this->type; |
92
|
|
|
} |
93
|
|
|
|
94
|
|
|
public function getUri() |
95
|
|
|
{ |
96
|
|
|
return $this->resource->getUri(); |
97
|
|
|
} |
98
|
|
|
|
99
|
|
|
public function getExVocab() |
100
|
|
|
{ |
101
|
|
|
if ($this->isExternal()) { |
102
|
|
|
return $this->vocab; |
103
|
|
|
} else { |
104
|
|
|
return null; |
105
|
|
|
} |
106
|
|
|
} |
107
|
|
|
|
108
|
|
|
public function getVocab() |
109
|
|
|
{ |
110
|
|
|
return $this->vocab; |
111
|
|
|
} |
112
|
|
|
|
113
|
|
|
public function getVocabName() |
114
|
|
|
{ |
115
|
|
|
return $this->vocab->getTitle(); |
116
|
|
|
} |
117
|
|
|
|
118
|
|
|
public function addSubMember($member, $lang = '') |
119
|
|
|
{ |
120
|
|
|
$label = $member->getLabel($lang) ? $member->getLabel($lang) : $member->getLabel(); |
121
|
|
|
$this->submembers[$label->getValue()] = $member; |
122
|
|
|
$this->sortSubMembers(); |
123
|
|
|
} |
124
|
|
|
|
125
|
|
|
public function getSubMembers() |
126
|
|
|
{ |
127
|
|
|
if (empty($this->submembers)) { |
128
|
|
|
return null; |
129
|
|
|
} |
130
|
|
|
|
131
|
|
|
return $this->submembers; |
132
|
|
|
} |
133
|
|
|
|
134
|
|
|
private function sortSubMembers() |
135
|
|
|
{ |
136
|
|
|
if (!empty($this->submembers)) { |
137
|
|
|
ksort($this->submembers); |
138
|
|
|
} |
139
|
|
|
|
140
|
|
|
} |
141
|
|
|
|
142
|
|
|
public function isExternal() { |
143
|
|
|
return $this->external; |
144
|
|
|
} |
145
|
|
|
|
146
|
|
|
public function getNotation() |
147
|
|
|
{ |
148
|
|
|
if ($this->vocab->getConfig()->showNotation() && $this->resource->get('skos:notation')) { |
149
|
|
|
return $this->resource->get('skos:notation')->getValue(); |
150
|
|
|
} |
151
|
|
|
|
152
|
|
|
} |
153
|
|
|
|
154
|
|
|
public function isReified() { |
155
|
|
|
return (!$this->resource->label() && $this->resource->getLiteral('rdf:value')); |
156
|
|
|
} |
157
|
|
|
|
158
|
|
|
public function getReifiedPropertyValues() { |
159
|
|
|
$ret = array(); |
160
|
|
|
$props = $this->resource->propertyUris(); |
161
|
|
|
foreach($props as $prop) { |
162
|
|
|
$prop = (EasyRdf\RdfNamespace::shorten($prop) !== null) ? EasyRdf\RdfNamespace::shorten($prop) : $prop; |
163
|
|
View Code Duplication |
foreach ($this->resource->allLiterals($prop) as $val) { |
|
|
|
|
164
|
|
|
if ($prop !== 'rdf:value') { // shown elsewhere |
165
|
|
|
$ret[gettext($prop)] = new ConceptPropertyValueLiteral($this->model, $this->vocab, $this->resource, $val, $prop); |
166
|
|
|
} |
167
|
|
|
} |
168
|
|
View Code Duplication |
foreach ($this->resource->allResources($prop) as $val) { |
|
|
|
|
169
|
|
|
$ret[gettext($prop)] = new ConceptPropertyValue($this->model, $this->vocab, $val, $prop, $this->clang); |
170
|
|
|
} |
171
|
|
|
} |
172
|
|
|
return $ret; |
173
|
|
|
} |
174
|
|
|
|
175
|
|
|
} |
176
|
|
|
|
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.
You can also find more detailed suggestions in the “Code” section of your repository.