1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
namespace Samwilson\SimpleWikidata\Items; |
4
|
|
|
|
5
|
|
|
use Psr\Cache\CacheItemPoolInterface; |
6
|
|
|
use Samwilson\SimpleWikidata\Item; |
7
|
|
|
use Samwilson\SimpleWikidata\Query; |
8
|
|
|
|
9
|
|
|
/** |
10
|
|
|
* @link |
11
|
|
|
*/ |
12
|
|
|
class Work extends Item { |
13
|
|
|
|
14
|
|
|
const ITEM_WORK = 'Q386724'; |
15
|
|
|
const PROP_SUBTITLE = 'P1680'; |
16
|
|
|
const PROP_GENRE = 'P136'; |
17
|
|
|
const PROP_SUBJECT = 'P921'; |
18
|
|
|
|
19
|
|
|
/** |
20
|
|
|
* @param string $lang ISO639 language code. |
21
|
|
|
* @param CacheItemPoolInterface $cache The cache. |
22
|
|
|
* @return array|Item[] |
23
|
|
|
*/ |
24
|
|
|
public static function getBookTypes( $lang = 'en', $cache ) { |
25
|
|
|
$sparql = "SELECT ?item WHERE { |
26
|
|
|
?item wdt:P279 wd:Q571 . |
27
|
|
|
?item rdfs:label ?label . |
28
|
|
|
FILTER(LANG(?label) = '$lang') . |
29
|
|
|
} ORDER BY ?label "; |
30
|
|
|
$query = new Query( $sparql, $lang ); |
|
|
|
|
31
|
|
|
$query->setCache( $cache ); |
|
|
|
|
32
|
|
|
$bookType = Item::factory( self::ITEM_WORK, $lang, $cache ); |
33
|
|
|
return [ $bookType ] + $query->getItems(); |
34
|
|
|
} |
35
|
|
|
|
36
|
|
|
/** |
37
|
|
|
* @return bool|string |
38
|
|
|
*/ |
39
|
|
|
public function getSubtitle() { |
40
|
|
|
return $this->getPropertyOfTypeText( self::PROP_SUBTITLE ); |
41
|
|
|
} |
42
|
|
|
|
43
|
|
|
/** |
44
|
|
|
* @param string $subtitle The new subtitle. |
45
|
|
|
*/ |
46
|
|
|
public function setSubtitle( $subtitle ) { |
47
|
|
|
$this->setPropertyOfTypeText( self::PROP_SUBTITLE, $subtitle ); |
48
|
|
|
} |
49
|
|
|
|
50
|
|
|
/** |
51
|
|
|
* @param string $property A property identifier. |
52
|
|
|
* @return array |
53
|
|
|
*/ |
54
|
|
|
public function getPropertyOfTypeItems( $property ) { |
55
|
|
|
$entity = $this->getEntity( $this->id ); |
56
|
|
|
if ( !isset( $entity['claims'][ $property ] ) ) { |
57
|
|
|
return []; |
58
|
|
|
} |
59
|
|
|
$items = []; |
60
|
|
|
foreach ( $entity['claims'][ $property ] as $authorClaim ) { |
61
|
|
|
$item_id = $authorClaim['mainsnak']['datavalue']['value']['id']; |
62
|
|
|
$items[] = Item::factory( $item_id, $this->lang, $this->cache ); |
63
|
|
|
} |
64
|
|
|
|
65
|
|
|
return $items; |
66
|
|
|
} |
67
|
|
|
|
68
|
|
|
/** |
69
|
|
|
* @return array |
70
|
|
|
*/ |
71
|
|
|
public function getAuthors() { |
72
|
|
|
return $this->getPropertyOfTypeItems( self::PROP_AUTHOR ); |
73
|
|
|
} |
74
|
|
|
|
75
|
|
|
/** |
76
|
|
|
* @return Item[] |
77
|
|
|
*/ |
78
|
|
|
public function getSubjects() { |
79
|
|
|
return $this->getPropertyOfTypeItems( self::PROP_SUBJECT ); |
80
|
|
|
} |
81
|
|
|
|
82
|
|
|
/** |
83
|
|
|
* @return Item[] |
84
|
|
|
*/ |
85
|
|
|
public function getEditions() { |
86
|
|
|
$sparql = "SELECT ?item WHERE {" |
87
|
|
|
. " ?item wdt:" . Edition::PROP_EDITION_OR_TRANSLATION_OF . " wd:" . $this->getId() |
88
|
|
|
. "}"; |
89
|
|
|
$query = new Query( $sparql, $this->lang, $this->cache ); |
90
|
|
|
$editions = $query->getItems(); |
91
|
|
|
usort( $editions, function ( Item $a, Item $b ) { |
92
|
|
|
if ( $a instanceof Edition && $b instanceof Edition ) { |
93
|
|
|
return $a->getPublicationYear() - $b->getPublicationYear(); |
94
|
|
|
} |
95
|
|
|
return 0; |
96
|
|
|
} ); |
97
|
|
|
|
98
|
|
|
return $editions; |
99
|
|
|
} |
100
|
|
|
|
101
|
|
|
public function newEdition() { |
102
|
|
|
} |
103
|
|
|
|
104
|
|
|
} |
105
|
|
|
|
This check compares calls to functions or methods with their respective definitions. If the call has less arguments than are defined, it raises an issue.
If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress. Please note the @ignore annotation hint above.