Passed
Branch master (4b538d)
by Osma
10:57
created

ConceptPropertyValue::getSubMembers()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 7
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 3
nc 2
nop 0
dl 0
loc 7
rs 10
c 0
b 0
f 0
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 = '')
18
    {
19
        parent::__construct($model, $vocab, $resource);
20
        $this->submembers = array();
21
        $this->type = $prop;
22
        $this->clang = $clang;
23
        // check if the resource is external to the current vocabulary
24
        $this->external = ($this->getLabel('', 'null') === null);
25
        if ($this->external) {
26
            // if we find the resource in another vocabulary, use it instead
27
            $exvocab = $this->getExVocab();
28
            if ($exvocab !== null) {
29
                $this->vocab = $exvocab;
30
            }
31
        }
32
    }
33
34
    public function __toString()
35
    {
36
        $label = is_string($this->getLabel()) ? $this->getLabel() : $this->getLabel()->getValue();
0 ignored issues
show
introduced by
The condition is_string($this->getLabel()) is always false.
Loading history...
37
        if ($this->vocab->getConfig()->sortByNotation()) {
38
            $label = ltrim($this->getNotation() . ' ') . $label;
39
        }
40
41
        return $label;
42
    }
43
44
    public function getLang()
45
    {
46
        return $this->getEnvLang();
47
    }
48
49
    public function getLabel($lang = '', $fallbackToUri = 'uri')
50
    {
51
        if ($this->clang) {
52
            $lang = $this->clang;
53
        }
54
        if ($this->vocab->getConfig()->getLanguageOrder($lang)) {
55
            foreach ($this->vocab->getConfig()->getLanguageOrder($lang) as $fallback) {
56
                if ($this->resource->label($fallback) !== null) {
57
                    return $this->resource->label($fallback);
58
                }
59
                // We need to check all the labels in case one of them matches a subtag of the current language
60
                if ($this->resource->allLiterals('skos:prefLabel')) {
61
                    foreach($this->resource->allLiterals('skos:prefLabel') as $label) {
62
                        // the label lang code is a subtag of the UI lang eg. en-GB - create a new literal with the main language
63
                        if ($label !== null && strpos($label->getLang(), $fallback . '-') === 0) {
64
                            return EasyRdf\Literal::create($label, $fallback);
65
                        }
66
                    }
67
                }
68
            }
69
        }
70
71
        if ($this->resource->label($lang) !== null) { // current language
72
            return $this->resource->label($lang);
73
        } elseif ($this->resource->label($this->vocab->getConfig()->getDefaultLanguage()) !== null) { // vocab default language
74
            return $this->resource->label($this->vocab->getConfig()->getDefaultLanguage());
75
        } elseif ($this->resource->label() !== null) { // any language
76
            return $this->resource->label();
77
        } elseif ($this->resource->getLiteral('rdf:value', $lang) !== null) { // current language
78
            return $this->resource->getLiteral('rdf:value', $lang);
79
        } elseif ($this->resource->getLiteral('rdf:value') !== null) { // any language
80
            return $this->resource->getLiteral('rdf:value');
81
        }
82
83
        // see if we can find a label in another vocabulary known by the skosmos instance
84
        $label = $this->getExternalLabel($this->vocab, $this->getUri(), $lang);
85
        if ($label) {
0 ignored issues
show
introduced by
$label is of type EasyRdf\Literal, thus it always evaluated to true.
Loading history...
86
            return $label;
87
        }
88
89
        if ($fallbackToUri == 'uri') {
90
            // return uri if no label is found
91
            return $this->resource->shorten() ? $this->resource->shorten() : $this->getUri();
92
        }
93
        return null;
94
    }
95
96
    public function getType()
97
    {
98
        return $this->type;
99
    }
100
101
    public function getUri()
102
    {
103
        return $this->resource->getUri();
104
    }
105
106
    public function getExVocab()
107
    {
108
        return $this->model->guessVocabularyFromURI($this->getUri(), $this->vocab->getId());
109
    }
110
111
    public function getVocab()
112
    {
113
        return $this->vocab;
114
    }
115
116
    public function getVocabName()
117
    {
118
        return $this->vocab->getShortName();
119
    }
120
121
    public function addSubMember($member, $lang = '')
122
    {
123
        $label = $member->getLabel($lang) ? $member->getLabel($lang) : $member->getLabel();
124
        $this->submembers[$label->getValue()] = $member;
125
        $this->sortSubMembers();
126
    }
127
128
    public function getSubMembers()
129
    {
130
        if (empty($this->submembers)) {
131
            return null;
132
        }
133
134
        return $this->submembers;
135
    }
136
137
    private function sortSubMembers()
138
    {
139
        if (!empty($this->submembers)) {
140
            ksort($this->submembers);
141
        }
142
143
    }
144
145
    public function isExternal() {
146
        return $this->external;
147
    }
148
149
    public function getNotation()
150
    {
151
        if ($this->vocab->getConfig()->showNotation() && $this->resource->get('skos:notation')) {
152
            return $this->resource->get('skos:notation')->getValue();
153
        }
154
155
    }
156
157
    public function isReified() {
158
        return (!$this->resource->label() && $this->resource->getLiteral('rdf:value'));
159
    }
160
161
    public function getReifiedPropertyValues() {
162
        $ret = array();
163
        $props = $this->resource->propertyUris();
164
        foreach($props as $prop) {
165
            $prop = (EasyRdf\RdfNamespace::shorten($prop) !== null) ? EasyRdf\RdfNamespace::shorten($prop) : $prop;
166
            foreach ($this->resource->allLiterals($prop) as $val) {
167
                if ($prop !== 'rdf:value') { // shown elsewhere
168
                    $ret[gettext($prop)] = new ConceptPropertyValueLiteral($this->model, $this->vocab, $this->resource, $val, $prop);
169
                }
170
            }
171
            foreach ($this->resource->allResources($prop) as $val) {
172
                $ret[gettext($prop)] = new ConceptPropertyValue($this->model, $this->vocab, $val, $prop, $this->clang);
173
            }
174
        }
175
        return $ret;
176
    }
177
178
}
179