1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
declare( strict_types = 1 ); |
4
|
|
|
|
5
|
|
|
namespace Wikibase\Repo\Api; |
6
|
|
|
|
7
|
|
|
use ApiMain; |
8
|
|
|
use Wikibase\DataModel\Entity\EntityDocument; |
9
|
|
|
use Wikibase\DataModel\Term\LabelsProvider; |
10
|
|
|
use Wikibase\Lib\Summary; |
11
|
|
|
use Wikibase\Repo\ChangeOp\ChangeOp; |
12
|
|
|
use Wikibase\Repo\ChangeOp\ChangeOps; |
13
|
|
|
use Wikibase\Repo\ChangeOp\FingerprintChangeOpFactory; |
14
|
|
|
use Wikibase\Repo\WikibaseRepo; |
15
|
|
|
|
16
|
|
|
/** |
17
|
|
|
* API module to set the label for a Wikibase entity. |
18
|
|
|
* Requires API write mode to be enabled. |
19
|
|
|
* |
20
|
|
|
* @license GPL-2.0-or-later |
21
|
|
|
* @author Jeroen De Dauw < [email protected] > |
22
|
|
|
* @author John Erling Blad < [email protected] > |
23
|
|
|
* @author Tobias Gritschacher < [email protected] > |
24
|
|
|
*/ |
25
|
|
|
class SetLabel extends ModifyTerm { |
26
|
|
|
|
27
|
|
|
/** |
28
|
|
|
* @var FingerprintChangeOpFactory |
29
|
|
|
*/ |
30
|
|
|
private $termChangeOpFactory; |
31
|
|
|
|
32
|
|
|
public function __construct( |
33
|
|
|
ApiMain $mainModule, |
34
|
|
|
string $moduleName, |
35
|
|
|
FingerprintChangeOpFactory $termChangeOpFactory, |
36
|
|
|
bool $federatedPropertiesEnabled |
37
|
|
|
) { |
38
|
|
|
parent::__construct( $mainModule, $moduleName, $federatedPropertiesEnabled ); |
39
|
|
|
|
40
|
|
|
$this->termChangeOpFactory = $termChangeOpFactory; |
41
|
|
|
} |
42
|
|
|
|
43
|
|
|
public static function factory( ApiMain $mainModule, string $moduleName ): self { |
44
|
|
|
$wikibaseRepo = WikibaseRepo::getDefaultInstance(); |
45
|
|
|
return new self( |
46
|
|
|
$mainModule, |
47
|
|
|
$moduleName, |
48
|
|
|
$wikibaseRepo->getChangeOpFactoryProvider() |
49
|
|
|
->getFingerprintChangeOpFactory(), |
50
|
|
|
$wikibaseRepo->inFederatedPropertyMode() |
51
|
|
|
); |
52
|
|
|
} |
53
|
|
|
|
54
|
|
|
protected function modifyEntity( EntityDocument $entity, ChangeOp $changeOp, array $preparedParameters ): Summary { |
55
|
|
|
if ( !( $entity instanceof LabelsProvider ) ) { |
56
|
|
|
$this->errorReporter->dieError( 'The given entity cannot contain labels', 'not-supported' ); |
|
|
|
|
57
|
|
|
} |
58
|
|
|
|
59
|
|
|
$summary = $this->createSummary( $preparedParameters ); |
60
|
|
|
$language = $preparedParameters['language']; |
61
|
|
|
|
62
|
|
|
$this->applyChangeOp( $changeOp, $entity, $summary ); |
63
|
|
|
|
64
|
|
|
$labels = $entity->getLabels(); |
|
|
|
|
65
|
|
|
$resultBuilder = $this->getResultBuilder(); |
66
|
|
|
|
67
|
|
|
if ( $labels->hasTermForLanguage( $language ) ) { |
68
|
|
|
$termList = $labels->getWithLanguages( [ $language ] ); |
69
|
|
|
$resultBuilder->addLabels( $termList, 'entity' ); |
70
|
|
|
} else { |
71
|
|
|
$resultBuilder->addRemovedLabel( $language, 'entity' ); |
72
|
|
|
} |
73
|
|
|
|
74
|
|
|
return $summary; |
75
|
|
|
} |
76
|
|
|
|
77
|
|
|
protected function getChangeOp( array $preparedParameters, EntityDocument $entity ): ChangeOp { |
78
|
|
|
$label = ""; |
79
|
|
|
$language = $preparedParameters['language']; |
80
|
|
|
|
81
|
|
|
if ( isset( $preparedParameters['value'] ) ) { |
82
|
|
|
$label = $this->stringNormalizer->trimToNFC( $preparedParameters['value'] ); |
83
|
|
|
} |
84
|
|
|
|
85
|
|
|
if ( $label === "" ) { |
86
|
|
|
$op = $this->termChangeOpFactory->newRemoveLabelOp( $language ); |
87
|
|
|
} else { |
88
|
|
|
$op = $this->termChangeOpFactory->newSetLabelOp( $language, $label ); |
89
|
|
|
} |
90
|
|
|
|
91
|
|
|
return $this->termChangeOpFactory->newFingerprintChangeOp( new ChangeOps( $op ) ); |
92
|
|
|
} |
93
|
|
|
|
94
|
|
|
/** |
95
|
|
|
* @see ApiBase::needsToken |
96
|
|
|
* |
97
|
|
|
* @return string |
98
|
|
|
*/ |
99
|
|
|
public function needsToken(): string { |
100
|
|
|
return 'csrf'; |
101
|
|
|
} |
102
|
|
|
|
103
|
|
|
/** |
104
|
|
|
* @see ApiBase::isWriteMode() |
105
|
|
|
* |
106
|
|
|
* @return bool Always true. |
107
|
|
|
*/ |
108
|
|
|
public function isWriteMode(): bool { |
109
|
|
|
return true; |
110
|
|
|
} |
111
|
|
|
|
112
|
|
|
/** |
113
|
|
|
* @inheritDoc |
114
|
|
|
*/ |
115
|
|
|
protected function getExamplesMessages(): array { |
116
|
|
|
return [ |
117
|
|
|
'action=wbsetlabel&id=Q42&language=en&value=Wikimedia&format=jsonfm' |
118
|
|
|
=> 'apihelp-wbsetlabel-example-1', |
119
|
|
|
'action=wbsetlabel&site=enwiki&title=Earth&language=en&value=Earth' |
120
|
|
|
=> 'apihelp-wbsetlabel-example-2', |
121
|
|
|
]; |
122
|
|
|
} |
123
|
|
|
|
124
|
|
|
/** |
125
|
|
|
* @inheritDoc |
126
|
|
|
*/ |
127
|
|
|
protected function getAllowedParams(): array { |
128
|
|
|
return array_merge( |
129
|
|
|
parent::getAllowedParams(), |
130
|
|
|
[ |
131
|
|
|
'new' => [ |
132
|
|
|
self::PARAM_TYPE => $this->getEntityTypesWithLabels(), |
133
|
|
|
], |
134
|
|
|
] |
135
|
|
|
); |
136
|
|
|
} |
137
|
|
|
|
138
|
|
|
protected function getEntityTypesWithLabels(): array { |
139
|
|
|
// TODO inject me |
140
|
|
|
$entityFactory = WikibaseRepo::getDefaultInstance()->getEntityFactory(); |
141
|
|
|
$supportedEntityTypes = []; |
142
|
|
|
foreach ( $this->enabledEntityTypes as $entityType ) { |
143
|
|
|
$testEntity = $entityFactory->newEmpty( $entityType ); |
144
|
|
|
if ( $testEntity instanceof LabelsProvider ) { |
145
|
|
|
$supportedEntityTypes[] = $entityType; |
146
|
|
|
} |
147
|
|
|
} |
148
|
|
|
return $supportedEntityTypes; |
149
|
|
|
} |
150
|
|
|
|
151
|
|
|
} |
152
|
|
|
|
This method has been deprecated. The supplier of the class has supplied an explanatory message.
The explanatory message should give you some clue as to whether and when the method will be removed from the class and what other method or class to use instead.