1
|
|
|
<?php
|
2
|
|
|
|
3
|
|
|
/**
|
4
|
|
|
* Represents a Select Field.
|
5
|
|
|
* @license GNU GPL v2+
|
6
|
|
|
* @since 3.0.0
|
7
|
|
|
* @author: Alexander Gesinn
|
8
|
|
|
*/
|
9
|
|
|
|
10
|
|
|
namespace SFS;
|
11
|
|
|
|
12
|
|
|
use SMWQueryProcessor as QueryProcessor;
|
13
|
|
|
use Parser;
|
14
|
|
|
use MWDebug;
|
15
|
|
|
|
16
|
|
|
class SelectField {
|
17
|
|
|
|
18
|
|
|
private $mParser = null;
|
19
|
|
|
|
20
|
|
|
//private $mSelectField = array();
|
|
|
|
|
21
|
|
|
private $mValues = null;
|
22
|
|
|
private $mHasStaticValues = false;
|
23
|
|
|
|
24
|
|
|
private $mData = []; # array with all parameters
|
25
|
|
|
private $mQuery = "";
|
26
|
|
|
private $mFunction = "";
|
27
|
|
|
private $mSelectIsMultiple = false;
|
28
|
|
|
private $mSelectTemplate = "";
|
29
|
|
|
private $mSelectField = "";
|
30
|
|
|
private $mValueTemplate = "";
|
31
|
|
|
private $mValueField = "";
|
32
|
|
|
private $mSelectRemove = false;
|
33
|
|
|
private $mLabel = false;
|
34
|
|
|
private $mDelimiter = ",";
|
35
|
|
|
|
36
|
|
|
public function __construct( & $parser ) {
|
37
|
|
|
$this->mParser = $parser;
|
38
|
|
|
}
|
39
|
|
|
|
40
|
|
|
/**
|
41
|
|
|
* Convenience function to process all parameters at once
|
42
|
|
|
*/
|
43
|
|
|
public function processParameters( $input_name = "", $other_args ) {
|
|
|
|
|
44
|
|
|
if ( array_key_exists( "query", $other_args ) ) {
|
45
|
|
|
$this->setQuery( $other_args );
|
46
|
|
|
} elseif ( array_key_exists( "function", $other_args ) ) {
|
47
|
|
|
$this->setFunction( $other_args );
|
48
|
|
|
}
|
49
|
|
|
}
|
50
|
|
|
|
51
|
|
|
/**
|
52
|
|
|
* getData
|
53
|
|
|
*
|
54
|
|
|
* @return array Array with all parameters
|
55
|
|
|
*/
|
56
|
|
|
public function getData() {
|
57
|
|
|
return $this->mData;
|
58
|
|
|
}
|
59
|
|
|
|
60
|
|
|
public function setQuery( $other_args ) {
|
61
|
|
|
$querystr = $other_args["query"];
|
62
|
|
|
$querystr = str_replace( [ "~", "(", ")" ], [ "=", "[", "]" ], $querystr );
|
63
|
|
|
|
64
|
|
|
//$this->mSelectField["query"] = $query;
|
|
|
|
|
65
|
|
|
$this->mQuery = $querystr;
|
66
|
|
|
$this->mData['selectquery'] = $querystr;
|
67
|
|
|
|
68
|
|
|
// unparametrized query
|
69
|
|
|
if ( strpos( $querystr, '@@@@' ) === false ) {
|
70
|
|
|
$rawparams = explode( ";", $querystr );
|
71
|
|
|
|
72
|
|
|
// there is no need to run the parser, $query has been parsed already
|
73
|
|
|
//$params[0] = $wgParser->replaceVariables( $params[0] );
|
|
|
|
|
74
|
|
|
|
75
|
|
|
list( $query, $params ) = QueryProcessor::getQueryAndParamsFromFunctionParams( $rawparams, SMW_OUTPUT_WIKI, QueryProcessor::INLINE_QUERY, false );
|
76
|
|
|
|
77
|
|
|
$result = QueryProcessor::getResultFromQuery( $query, $params, SMW_OUTPUT_WIKI, QueryProcessor::INLINE_QUERY );
|
78
|
|
|
|
79
|
|
|
$this->mValues = $this->getFormattedValuesFrom( $this->mDelimiter, $result );
|
80
|
|
|
|
81
|
|
|
$this->setHasStaticValues( true );
|
82
|
|
|
}
|
83
|
|
|
}
|
84
|
|
|
|
85
|
|
|
public function setFunction( $other_args ) {
|
86
|
|
|
#global $wgParser;
|
87
|
|
|
|
88
|
|
|
$function = $other_args["function"];
|
89
|
|
|
$function = '{{#' . $function . '}}';
|
90
|
|
|
$function = str_replace( [ "~", "(", ")" ], [ "=", "[", "]" ], $function );
|
91
|
|
|
|
92
|
|
|
//$this->mSelectField["function"] = $function;
|
|
|
|
|
93
|
|
|
$this->mFunction = $function;
|
94
|
|
|
$this->mData['selectfunction'] = $function;
|
95
|
|
|
|
96
|
|
|
// unparametrized function
|
97
|
|
|
if ( strpos( $function, '@@@@' ) === false ) {
|
98
|
|
|
$f = str_replace( ";", "|", $function );
|
99
|
|
|
|
100
|
|
|
$this->setValues( $this->mParser->replaceVariables( $f ) );
|
101
|
|
|
|
102
|
|
|
$this->setHasStaticValues( true );
|
103
|
|
|
}
|
104
|
|
|
}
|
105
|
|
|
|
106
|
|
|
public function setSelectIsMultiple( Array $other_args ) {
|
107
|
|
|
$this->mSelectIsMultiple = array_key_exists( "part_of_multiple", $other_args );
|
108
|
|
|
$this->mData["selectismultiple"] = $this->mSelectIsMultiple;
|
109
|
|
|
}
|
110
|
|
|
|
111
|
|
|
public function setSelectTemplate( $input_name = "" ) {
|
112
|
|
|
$index = strpos( $input_name, "[" );
|
113
|
|
|
$this->mSelectTemplate = substr( $input_name, 0, $index );
|
114
|
|
|
$this->mData['selecttemplate'] = $this->mSelectTemplate;
|
115
|
|
|
}
|
116
|
|
|
|
117
|
|
|
public function setSelectField( $input_name = "" ) {
|
118
|
|
|
$index = strrpos( $input_name, "[" );
|
119
|
|
|
$this->mSelectField = substr( $input_name, $index + 1, strlen( $input_name ) - $index - 2 );
|
120
|
|
|
$this->mData['selectfield'] = $this->mSelectField;
|
121
|
|
|
}
|
122
|
|
|
|
123
|
|
|
public function setValueTemplate( Array $other_args ) {
|
124
|
|
|
$this->mValueTemplate =
|
125
|
|
|
array_key_exists( "sametemplate", $other_args ) ? $this->mSelectTemplate : $other_args["template"];
|
126
|
|
|
$this->mData["valuetemplate"] = $this->mValueTemplate;
|
127
|
|
|
}
|
128
|
|
|
|
129
|
|
|
public function setValueField( Array $other_args ) {
|
130
|
|
|
$this->mValueField = $other_args["field"];
|
131
|
|
|
$this->mData["valuefield"] = $this->mValueField;
|
132
|
|
|
|
133
|
|
|
}
|
134
|
|
|
|
135
|
|
|
public function setSelectRemove( Array $other_args ) {
|
136
|
|
|
$this->mSelectRemove = array_key_exists( 'rmdiv', $other_args );
|
137
|
|
|
$this->mData['selectrm'] = $this->mSelectRemove;
|
138
|
|
|
}
|
139
|
|
|
|
140
|
|
|
public function setLabel( Array $other_args ) {
|
141
|
|
|
$this->mLabel = array_key_exists( 'label', $other_args );
|
142
|
|
|
$this->mData['label'] = $this->mLabel;
|
143
|
|
|
}
|
144
|
|
|
|
145
|
|
|
/**
|
146
|
|
|
* setDelimiter
|
147
|
|
|
* @param array $other_args
|
148
|
|
|
*/
|
149
|
|
|
public function setDelimiter( Array $other_args ) {
|
|
|
|
|
150
|
|
|
|
151
|
|
|
$this->mDelimiter = $GLOBALS['wgPageFormsListSeparator'];
|
152
|
|
|
|
153
|
|
|
if ( array_key_exists( 'sep', $other_args ) ) {
|
154
|
|
|
$this->mDelimiter = $other_args['sep'];
|
155
|
|
|
} else {
|
156
|
|
|
// Adding Backcompatibility
|
157
|
|
|
if ( array_key_exists( 'delimiter', $other_args ) ) {
|
158
|
|
|
$this->mDelimiter = $other_args['delimiter'];
|
159
|
|
|
}
|
160
|
|
|
}
|
161
|
|
|
|
162
|
|
|
$this->mData['sep'] = $this->mDelimiter;
|
163
|
|
|
}
|
164
|
|
|
|
165
|
|
|
public function getDelimiter() {
|
166
|
|
|
return $this->mDelimiter;
|
167
|
|
|
}
|
168
|
|
|
|
169
|
|
|
public function getValues() {
|
170
|
|
|
return $this->mValues;
|
171
|
|
|
}
|
172
|
|
|
|
173
|
|
|
/**
|
174
|
|
|
* setValues
|
175
|
|
|
* @param string $values (comma separated, fully parsed list of values)
|
176
|
|
|
*/
|
177
|
|
|
private function setValues( $values ) {
|
178
|
|
|
$values = explode( $this->mDelimiter, $values );
|
179
|
|
|
$values = array_map( "trim", $values );
|
180
|
|
|
$values = array_unique( $values );
|
181
|
|
|
$this->mValues = $values;
|
182
|
|
|
}
|
183
|
|
|
|
184
|
|
|
public function hasStaticValues() {
|
185
|
|
|
return $this->mHasStaticValues;
|
186
|
|
|
}
|
187
|
|
|
|
188
|
|
|
private function setHasStaticValues( $StaticValues ) {
|
189
|
|
|
$this->mHasStaticValues = $StaticValues;
|
190
|
|
|
}
|
191
|
|
|
|
192
|
|
|
/** Copied from ApiSemanticFormsSelectRequestProcessor */
|
193
|
|
|
|
194
|
|
|
private function getFormattedValuesFrom( $sep, $values ) {
|
195
|
|
|
|
196
|
|
|
if ( strpos( $values, $sep ) === false ) {
|
197
|
|
|
return [ $values ];
|
198
|
|
|
}
|
199
|
|
|
|
200
|
|
|
$values = explode( $sep, $values );
|
201
|
|
|
$values = array_map( "trim", $values );
|
202
|
|
|
$values = array_unique( $values );
|
203
|
|
|
|
204
|
|
|
// TODO: sorting here will destroy any sort defined in the query, e.g. in case sorting for labels (instead of mainlable)
|
205
|
|
|
//sort( $values );
|
|
|
|
|
206
|
|
|
// array_unshift( $values, "" ); Unshift no needed here
|
207
|
|
|
|
208
|
|
|
return $values;
|
209
|
|
|
}
|
210
|
|
|
}
|
211
|
|
|
|
Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.
The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.
This check looks for comments that seem to be mostly valid code and reports them.