capitalize filename so that wikis with $wgCapitalLinks=false can access
[lhc/web/wiklou.git] / includes / SpecialData.php
1 <?php
2 /**
3 * @package MediaWiki
4 */
5
6 /* You'll need to run these CREATEs :
7
8 CREATE TABLE data (
9 data_cur_id INT NOT NULL ,
10 data_revision INT NOT NULL ,
11 data_key VARCHAR( 255 ) NOT NULL ,
12 data_value MEDIUMTEXT NOT NULL ,
13 INDEX ( data_cur_id ),
14 INDEX (data_revision) ,
15 INDEX (data_key )
16 ) TYPE = MYISAM ;
17
18 CREATE TABLE data_rev (
19 rev_cur_id INT NOT NULL ,
20 rev_id INT NOT NULL ,
21 rev_masterkey VARCHAR( 255 ) NOT NULL,
22 rev_user_id INT NOT NULL ,
23 rev_user_text VARCHAR( 255 ) NOT NULL ,
24 rev_comment VARCHAR( 255 ) NOT NULL ,
25 rev_time INT NOT NULL ,
26 INDEX ( rev_cur_id) ,
27 INDEX (rev_id),
28 INDEX ( rev_user_id ),
29 INDEX ( rev_masterkey )
30 ) TYPE = MYISAM ;
31
32 */
33
34 function wfDataPreview ( &$t , &$dk )
35 {
36 $s = "" ;
37 $u = explode ( "((" , $t ) ;
38 foreach ( $u AS $x )
39 {
40 $y = explode ( "))" , $x ) ;
41 if ( count ( $y ) == 2 )
42 {
43 $z = explode ( "/" , $y[0] ) ;
44 $keyname = $z[0] ;
45 $isMasterKey = false ;
46 if ( substr ( $keyname , 0 , 1 ) == "!" )
47 {
48 $keyname = substr ( $keyname , 1 ) ;
49 $isMasterKey = true ;
50 }
51 if ( isset ( $dk[$keyname] ) ) $value= $dk[$keyname] ;
52 else $value = "" ;
53 if ( $isMasterKey ) $value = "<b>{$value}</b>" ;
54 $s .= $value . $y[1] ;
55 }
56 else $s .= $x ;
57 }
58 return $s ;
59 }
60
61 function wfDataView ( $dt ) # $dt = data type
62 {
63 if ( $dt == "" ) return ;
64 global $wgParser, $wgTitle;
65 global $wgOut , $wgUser ;
66 $nsdata = 20 ;
67 $s = "<h2>{$dt}</h2>" ;
68
69 # Read from source
70 $dbr =& wfGetDB( DB_SLAVE );
71 $sql = "SELECT * FROM cur WHERE cur_namespace={$nsdata} AND cur_title=\"{$dt}\"";
72 $res1 = $dbr->query( $sql, "wfDataEdit" );
73 $data = $dbr->fetchObject( $res1 ) ;
74
75 $sql = "SELECT * FROM data_rev WHERE rev_cur_id={$data->cur_id} GROUP BY rev_masterkey ORDER BY rev_masterkey" ;
76 $r = $dbr->query( $sql, "wfDataEdit" );
77 $mk = array () ;
78 while ( ($d = $dbr->fetchObject( $r )) ) $mk[] = $d->rev_masterkey ;
79 foreach ( $mk AS $x )
80 {
81 $s .= "<li>{$x}</li>" ;
82 }
83
84 $wgOut->AddHTML ( $s ) ;
85 }
86
87 function wfDataEdit ( $dt ) # $dt = data type
88 {
89 if ( $dt == "" ) return ;
90 global $wgParser, $wgTitle;
91 global $wgOut , $wgUser ;
92 $nsdata = 20 ;
93 $s = "<h2>{$dt}</h2>" ;
94
95 if ( isset ( $_POST['revision'] ) ) $revision = $_POST['revision'] ;
96 else if ( isset ( $_GET['revision'] ) ) $revision = $_GET['revision'] ;
97 else $revision = "" ;
98
99 if ( isset ( $_POST['masterkey'] ) ) $masterkey = $_POST['masterkey'] ;
100 else $masterkey = "" ;
101
102 if ( isset ( $_POST['comment'] ) ) $comment = $_POST['comment'] ;
103 else $comment = "" ;
104
105 # Read form source
106 $dbr =& wfGetDB( DB_SLAVE );
107 $sql = "SELECT * FROM cur WHERE cur_namespace={$nsdata} AND cur_title=\"{$dt}\"";
108 $res1 = $dbr->query( $sql, "wfDataEdit" );
109 $data = $dbr->fetchObject( $res1 ) ;
110
111 # Pre-render
112 $parserOutput = $wgParser->parse( $data->cur_text, $wgTitle, $wgOut->mParserOptions, true );
113 $t = $parserOutput->getText() ;
114
115 # Read from last form
116 if ( isset ( $_POST['dk'] ) ) $dk = $_POST['dk'] ;
117
118 # Store new version
119 if ( isset ( $_POST['doit'] ) && $dk[$masterkey] )
120 {
121 # Get next revision number
122 $dbw =& wfGetDB( DB_MASTER ); # Maybe DB_SLAVE didn't update yet
123 $sql = "SELECT MAX(rev_id) AS m FROM data_rev WHERE rev_cur_id={$data->cur_id} AND rev_masterkey=\"" . $dk[$masterkey] . "\"" ;
124 $r = $dbw->query( $sql, "wfDataEdit" );
125 $newrev = $dbr->fetchObject( $r ) ;
126 if ( isset ( $newrev ) AND isset ( $newrev->m ) ) $newrev = $newrev->m ;
127 else $newrev = "" ;
128 if ( $newrev == "" ) $newrev = 1 ;
129
130 # Generate SQL
131 $dbw->query( "BEGIN", "wfDataEdit" );
132 $sql = "INSERT INTO data_rev (rev_cur_id,rev_id,rev_masterkey,rev_user_id,rev_user_text,rev_comment,rev_time) VALUES (" .
133 "\"{$data->cur_id}\"," .
134 "\"{$newrev}\",".
135 "\"" . $dk[$masterkey] . "\"," .
136 "\"" . $wgUser->getID() . "\",".
137 "\"" . $wgUser->getName() . "\",".
138 "\"{$comment}\",".
139 "\"" . time() . "\");" ;
140 $dbw->query( $sql, "wfDataEdit" );
141
142 foreach ( $dk AS $k => $v )
143 {
144 $sql = "INSERT INTO data (data_cur_id,data_revision,data_key,data_value) VALUES (" .
145 "\"" . $data->cur_id . "\"," .
146 "\"" . $newrev . "\"," .
147 "\"" . $k . "\"," .
148 "\"" . $v . "\");" ;
149 $dbw->query( $sql, "wfDataEdit" );
150 }
151 $dbw->query( "COMMIT", "wfDataEdit" );
152
153 $s .= "Action complete.<br>\n" ;
154 $s .= wfDataPreview ( $t , $dk ) ;
155 $wgOut->AddHTML ( $s ) ;
156
157 return ;
158 }
159
160 # Preview
161 if ( isset ( $_POST['preview'] ) ) $s .= wfDataPreview ( $t , $dk ) . "\n<hr>\n" ;
162
163 # Editing
164 $t = explode ( "((" , $t ) ;
165 $s .= "<form method=post href=\"index.php?title=Special:Data\">" ;
166 foreach ( $t AS $x )
167 {
168 $y = explode ( "))" , $x ) ;
169 if ( count ( $y ) == 2 )
170 {
171 $z = explode ( "/" , $y[0] ) ;
172 $keyname = $z[0] ;
173 $isMasterKey = false ;
174 if ( substr ( $keyname , 0 , 1 ) == "!" )
175 {
176 $keyname = substr ( $keyname , 1 ) ;
177 $isMasterKey = true ;
178 }
179
180 $value = "" ;
181 if ( isset ( $dk[$keyname] ) ) $value= $dk[$keyname] ;
182 if ( $isMasterKey )
183 {
184 $masterkey = $keyname ;
185 $masterkeyvalue = $value ;
186 }
187
188 $input = "" ;
189 $name = "dk[" . $keyname . "]" ;
190
191 if ( count ( $z ) == 1 ) $z[] = "line" ; # Default
192 $type = strtolower ( $z[1] ) ;
193 if ( $type == "line" ) $input = "<input type=text style=\"width:100%\" name=\"{$name}\" value=\"{$value}\"></input>" ;
194 else if ( $type == "multiline" ) $input = "<textarea style=\"width:100%\" name=\"{$name}\">{$value}</textarea>" ;
195 else if ( $type == "number" ) $input = "<input type=int width=5 name=\"{$name}\" value=\"{$value}\"></input>" ;
196 else if ( $type == "date" ) $input = "<input type=date width=10 name=\"{$name}\" value=\"{$value}\"></input>" ;
197 else if ( $type == "dropdown" )
198 {
199 $s .= "<select name=\"{$name}\">" ;
200 foreach ( $z AS $k => $v )
201 {
202 if ( htmlentities ( $value ) == $v ) $default = " selected" ;
203 else $default = "" ;
204 if ( $k > 1 ) $s .= "<option value=\"{$v}\"{$default}>{$v}</option>\n" ;
205 }
206 $s .= "</select>" ;
207 }
208 if ( $isMasterKey AND $revision != "" ) $input = "<b>{$value}</b>" ;
209
210 $s .= "{$input}" ;
211 $s .= $y[1] ;
212 }
213 else $s .= $x ;
214 }
215 $s .= "<br>Comment : <input type='test' name='comment' value='{$comment}'></input>" ;
216 $s .= " &nbsp; <input type='hidden' name='revision' value='{$revision}'></input>" ;
217 $s .= "<input type='hidden' name='add_data' value='1'></input>" ;
218 if ( $masterkey ) $s .= "<input type='hidden' name='masterkey' value='{$masterkey}'></input>" ;
219 $s .= "<input type='hidden' name='data_type' value='{$dt}'></input>" ;
220 $s .= "<input type=submit name='doit' value=\"Do it\"></input> " ;
221 $s .= "<input type=submit name='preview' value=\"Preview\"></input>" ;
222 $s .= "</form>" ;
223
224 $wgOut->AddHTML ( $s ) ;
225 }
226
227
228 function wfSpecialData()
229 {
230 global $wgUseData ;
231 if ( !$wgUseData ) return "" ;
232
233 global $wgOut ;
234 if ( isset ( $_GET['data_action'] ) ) $data_action = $_GET['data_action'] ;
235 else $data_action = "" ;
236 if ( isset ( $_POST['add_data'] ) ) $data_action = "add_data" ;
237 if ( isset ( $_POST['view_data'] ) ) $data_action = "view_data" ;
238 $nsdata = 20 ;
239
240 $last = "<hr><a href=\"index.php?title=Special:Data\">Back to data</a>" ;
241
242 if ( $data_action == "" )
243 {
244 $s = "" ;
245
246 $s .= "<form method=post>" ;
247 $s .= "Data type " ;
248 $dbr =& wfGetDB( DB_SLAVE );
249 $sql = "SELECT cur_id,cur_title FROM cur WHERE cur_namespace={$nsdata}";
250 $res1 = $dbr->query( $sql, "wfSpecialData" );
251 $s .= "<select name='data_type'>\n" ;
252 while ( ( $o = $dbr->fetchObject( $res1 ) ) )
253 {
254 $s .= "<option>{$o->cur_title}</option>\n" ;
255 }
256 $s .= "</select><br>\n" ;
257 $s .= "<input type=submit name='add_data' value=\"Add data\"></input> " ;
258 $s .= "<input type=submit name='view_data' value=\"View data\"></input> " ;
259 $s .= "<br>\nTo add a new data type <i>Stuff</i>, edit the page <i>Data:Stuff</i>." ;
260 $s .= "</form>" ;
261
262 $wgOut->AddHTML ( $s ) ;
263 $last = "" ;
264 }
265 else if ( $data_action == "add_data" )
266 {
267 wfDataEdit ( $_POST['data_type'] ) ;
268 }
269 else if ( $data_action == "view_data" )
270 {
271 wfDataView ( $_POST['data_type'] ) ;
272 }
273
274 if ( $last ) $wgOut->AddHTML ( $last ) ;
275
276 return "" ;
277 }
278
279 ?>