ConceptPropertyValue::__construct()   A
last analyzed

Complexity

Conditions 3
Paths 3

Size

Total Lines 13
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 9
nc 3
nop 5
dl 0
loc 13
rs 9.9666
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', false) === 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
        return 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
    }
38
39
    public function getLang()
40
    {
41
        return $this->model->getLocale();
42
    }
43
44
    public function getSortKey()
45
    {
46
        return strtolower($this->getLabel());
0 ignored issues
show
Bug introduced by
It seems like $this->getLabel() can also be of type null; however, parameter $string of strtolower() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

46
        return strtolower(/** @scrutinizer ignore-type */ $this->getLabel());
Loading history...
47
    }
48
49
    public function getLabel($lang = '', $fallbackToUri = 'uri', $allowExternal = true)
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
        if ($allowExternal) {
85
            $label = $this->getExternalLabel($this->vocab, $this->getUri(), $lang);
86
            if ($label) {
0 ignored issues
show
introduced by
$label is of type EasyRdf\Literal, thus it always evaluated to true.
Loading history...
87
                return $label;
88
            }
89
        }
90
91
        if ($fallbackToUri == 'uri') {
92
            // return uri if no label is found
93
            return $this->resource->shorten() ? $this->resource->shorten() : $this->getUri();
94
        }
95
        return null;
96
    }
97
98
    public function getType()
99
    {
100
        return $this->type;
101
    }
102
103
    public function getUri()
104
    {
105
        return $this->resource->getUri();
106
    }
107
108
    public function getExVocab()
109
    {
110
        return $this->model->guessVocabularyFromURI($this->getUri(), $this->vocab->getId());
111
    }
112
113
    public function getVocab()
114
    {
115
        return $this->vocab;
116
    }
117
118
    public function getVocabName()
119
    {
120
        return $this->vocab->getShortName();
121
    }
122
123
    public function addSubMember($member, $lang = '')
124
    {
125
        $label = $member->getLabel($lang) ? $member->getLabel($lang) : $member->getLabel();
126
        $this->submembers[$label->getValue()] = $member;
127
        $this->sortSubMembers();
128
    }
129
130
    public function getSubMembers()
131
    {
132
        if (empty($this->submembers)) {
133
            return null;
134
        }
135
136
        return $this->submembers;
137
    }
138
139
    private function sortSubMembers()
140
    {
141
        if (!empty($this->submembers)) {
142
            ksort($this->submembers);
143
        }
144
145
    }
146
147
    public function isExternal()
148
    {
149
        return $this->external;
150
    }
151
152
    public function getNotation()
153
    {
154
        if ($this->vocab->getConfig()->showNotation() && $this->resource->get('skos:notation')) {
155
            return $this->resource->get('skos:notation')->getValue();
156
        }
157
158
    }
159
160
    public function isReified()
161
    {
162
        return (!$this->resource->label() && $this->resource->getLiteral('rdf:value'));
163
    }
164
165
    public function getReifiedPropertyValues()
166
    {
167
        $ret = array();
168
        $props = $this->resource->propertyUris();
169
        foreach ($props as $prop) {
170
            $prop = (EasyRdf\RdfNamespace::shorten($prop) !== null) ? EasyRdf\RdfNamespace::shorten($prop) : $prop;
171
            $propkey = str_starts_with($prop, 'dc11:') ?
172
                str_replace('dc11:', 'dc:', $prop) : $prop;
173
            foreach ($this->resource->allLiterals($prop) as $val) {
174
                if ($prop !== 'rdf:value') { // shown elsewhere
175
                    $ret[$this->model->getText($propkey)] = new ConceptPropertyValueLiteral($this->model, $this->vocab, $this->resource, $val, $prop);
176
                }
177
            }
178
            foreach ($this->resource->allResources($prop) as $val) {
179
                $ret[$this->model->getText($propkey)] = new ConceptPropertyValue($this->model, $this->vocab, $val, $prop, $this->clang);
180
            }
181
        }
182
        return $ret;
183
    }
184
185
}
186