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