Fixed bug #9095: xhtml in the backend by default (Thanks to Christian Kuhn)
[Packages/TYPO3.CMS.git] / typo3 / wizard_table.php
1 <?php
2 /***************************************************************
3 * Copyright notice
4 *
5 * (c) 1999-2008 Kasper Skaarhoj (kasperYYYY@typo3.com)
6 * All rights reserved
7 *
8 * This script is part of the TYPO3 project. The TYPO3 project is
9 * free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
13 *
14 * The GNU General Public License can be found at
15 * http://www.gnu.org/copyleft/gpl.html.
16 * A copy is found in the textfile GPL.txt and important notices to the license
17 * from the author is found in LICENSE.txt distributed with these scripts.
18 *
19 *
20 * This script is distributed in the hope that it will be useful,
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 * GNU General Public License for more details.
24 *
25 * This copyright notice MUST APPEAR in all copies of the script!
26 ***************************************************************/
27 /**
28 * Wizard to help make tables (eg. for tt_content elements) of type "table".
29 * Each line is a table row, each cell divided by a |
30 *
31 * $Id$
32 * Revised for TYPO3 3.6 November/2003 by Kasper Skaarhoj
33 * XHTML compliant
34 *
35 * @author Kasper Skaarhoj <kasperYYYY@typo3.com>
36 */
37 /**
38 * [CLASS/FUNCTION INDEX of SCRIPT]
39 *
40 *
41 *
42 * 84: class SC_wizard_table
43 * 116: function init()
44 * 158: function main()
45 * 173: function printContent()
46 * 184: function tableWizard()
47 *
48 * SECTION: Helper functions
49 * 223: function getConfigCode($row)
50 * 293: function getTableHTML($cfgArr,$row)
51 * 450: function changeFunc()
52 * 572: function cfgArray2CfgString($cfgArr)
53 * 603: function cfgString2CfgArray($cfgStr,$cols)
54 *
55 * TOTAL FUNCTIONS: 9
56 * (This index is automatically created/updated by the extension "extdeveval")
57 *
58 */
59
60
61
62 $BACK_PATH='';
63 require ('init.php');
64 require ('template.php');
65 $LANG->includeLLFile('EXT:lang/locallang_wizards.xml');
66
67
68
69
70
71
72
73
74
75
76
77 /**
78 * Script Class for rendering the Table Wizard
79 *
80 * @author Kasper Skaarhoj <kasperYYYY@typo3.com>
81 * @package TYPO3
82 * @subpackage core
83 */
84 class SC_wizard_table {
85
86 // Internal, dynamic:
87 /**
88 * document template object
89 *
90 * @var mediumDoc
91 */
92 var $doc;
93 var $content; // Content accumulation for the module.
94 var $include_once=array(); // List of files to include.
95 var $inputStyle=0; // True, then <input> fields are shown, not textareas.
96
97
98 // Internal, static:
99 var $xmlStorage=0; // If set, the string version of the content is interpreted/written as XML instead of the original linebased kind. This variable still needs binding to the wizard parameters - but support is ready!
100 var $numNewRows=1; // Number of new rows to add in bottom of wizard
101 var $colsFieldName='cols'; // Name of field in parent record which MAY contain the number of columns for the table - here hardcoded to the value of tt_content. Should be set by TCEform parameters (from P)
102
103
104 // Internal, static: GPvars
105 var $P; // Wizard parameters, coming from TCEforms linking to the wizard.
106 var $TABLECFG; // The array which is constantly submitted by the multidimensional form of this wizard.
107
108 // table parsing
109 var $tableParsing_quote; // quoting of table cells
110 var $tableParsing_delimiter; // delimiter between table cells
111
112
113
114
115
116 /**
117 * Initialization of the class
118 *
119 * @return void
120 */
121 function init() {
122 global $BACK_PATH;
123
124 // GPvars:
125 $this->P = t3lib_div::_GP('P');
126 $this->TABLECFG = t3lib_div::_GP('TABLE');
127
128 // Setting options:
129 $this->xmlStorage = $this->P['params']['xmlOutput'];
130 $this->numNewRows = t3lib_div::intInRange($this->P['params']['numNewRows'],1,50,5);
131
132 // Textareas or input fields:
133 $this->inputStyle=isset($this->TABLECFG['textFields']) ? $this->TABLECFG['textFields'] : 1;
134
135 // Document template object:
136 $this->doc = t3lib_div::makeInstance('mediumDoc');
137 $this->doc->backPath = $BACK_PATH;
138 $this->doc->JScode=$this->doc->wrapScriptTags('
139 function jumpToUrl(URL,formEl) { //
140 window.location.href = URL;
141 }
142 ');
143
144 // Setting form tag:
145 list($rUri) = explode('#',t3lib_div::getIndpEnv('REQUEST_URI'));
146 $this->doc->form ='<form action="'.htmlspecialchars($rUri).'" method="post" name="wizardForm">';
147
148 // Start page:
149 $this->content.=$this->doc->startPage('Table');
150
151 // If save command found, include tcemain:
152 if ($_POST['savedok_x'] || $_POST['saveandclosedok_x']) {
153 $this->include_once[]=PATH_t3lib.'class.t3lib_tcemain.php';
154 }
155
156 $this->tableParsing_delimiter = '|';
157 $this->tableParsing_quote = '';
158 }
159
160 /**
161 * Main function, rendering the table wizard
162 *
163 * @return void
164 */
165 function main() {
166 global $LANG;
167
168 if ($this->P['table'] && $this->P['field'] && $this->P['uid']) {
169 $this->content.=$this->doc->section($LANG->getLL('table_title'),$this->tableWizard(),0,1);
170 } else {
171 $this->content.=$this->doc->section($LANG->getLL('table_title'),'<span class="typo3-red">'.$LANG->getLL('table_noData',1).'</span>',0,1);
172 }
173 }
174
175 /**
176 * Outputting the accumulated content to screen
177 *
178 * @return void
179 */
180 function printContent() {
181 $this->content.= $this->doc->endPage();
182 $this->content = $this->doc->insertStylesAndJS($this->content);
183 echo $this->content;
184 }
185
186 /**
187 * Draws the table wizard content
188 *
189 * @return string HTML content for the form.
190 */
191 function tableWizard() {
192
193 // First, check the references by selecting the record:
194 $row = t3lib_BEfunc::getRecord($this->P['table'],$this->P['uid']);
195 if (!is_array($row)) {
196 t3lib_BEfunc::typo3PrintError ('Wizard Error','No reference to record',0);
197 exit;
198 }
199
200 // This will get the content of the form configuration code field to us - possibly cleaned up, saved to database etc. if the form has been submitted in the meantime.
201 $tableCfgArray = $this->getConfigCode($row);
202
203 // Generation of the Table Wizards HTML code:
204 $content = $this->getTableHTML($tableCfgArray,$row);
205
206 // Return content:
207 return $content;
208 }
209
210
211
212
213
214
215
216 /***************************
217 *
218 * Helper functions
219 *
220 ***************************/
221
222 /**
223 * Will get and return the configuration code string
224 * Will also save (and possibly redirect/exit) the content if a save button has been pressed
225 *
226 * @param array Current parent record row
227 * @return array Table config code in an array
228 * @access private
229 */
230 function getConfigCode($row) {
231
232 // get delimiter settings
233 $flexForm = t3lib_div::xml2array($row['pi_flexform']);
234
235 if (is_array($flexForm)) {
236 $this->tableParsing_quote = $flexForm['data']['s_parsing']['lDEF']['tableparsing_quote']['vDEF']?chr(intval($flexForm['data']['s_parsing']['lDEF']['tableparsing_quote']['vDEF'])):'';
237 $this->tableParsing_delimiter = $flexForm['data']['s_parsing']['lDEF']['tableparsing_delimiter']['vDEF']?chr(intval($flexForm['data']['s_parsing']['lDEF']['tableparsing_delimiter']['vDEF'])):'|';
238 }
239
240 // If some data has been submitted, then construct
241 if (isset($this->TABLECFG['c'])) {
242
243 // Process incoming:
244 $this->changeFunc();
245
246
247 // Convert to string (either line based or XML):
248 if ($this->xmlStorage) {
249 // Convert the input array to XML:
250 $bodyText = t3lib_div::array2xml_cs($this->TABLECFG['c'],'T3TableWizard');
251
252 // Setting cfgArr directly from the input:
253 $cfgArr = $this->TABLECFG['c'];
254 } else {
255 // Convert the input array to a string of configuration code:
256 $bodyText = $this->cfgArray2CfgString($this->TABLECFG['c']);
257
258 // Create cfgArr from the string based configuration - that way it is cleaned up and any incompatibilities will be removed!
259 $cfgArr = $this->cfgString2CfgArray($bodyText,$row[$this->colsFieldName]);
260 }
261
262 // If a save button has been pressed, then save the new field content:
263 if ($_POST['savedok_x'] || $_POST['saveandclosedok_x']) {
264
265 // Make TCEmain object:
266 $tce = t3lib_div::makeInstance('t3lib_TCEmain');
267 $tce->stripslashes_values=0;
268
269 // Put content into the data array:
270 $data=array();
271 $data[$this->P['table']][$this->P['uid']][$this->P['field']]=$bodyText;
272
273 // Perform the update:
274 $tce->start($data,array());
275 $tce->process_datamap();
276
277 // If the save/close button was pressed, then redirect the screen:
278 if ($_POST['saveandclosedok_x']) {
279 header('Location: '.t3lib_div::locationHeaderUrl($this->P['returnUrl']));
280 exit;
281 }
282 }
283 } else { // If nothing has been submitted, load the $bodyText variable from the selected database row:
284 if ($this->xmlStorage) {
285 $cfgArr = t3lib_div::xml2array($row[$this->P['field']]);
286 } else { // Regular linebased table configuration:
287 $cfgArr = $this->cfgString2CfgArray($row[$this->P['field']],$row[$this->colsFieldName]);
288 }
289 $cfgArr = is_array($cfgArr) ? $cfgArr : array();
290 }
291
292 return $cfgArr;
293 }
294
295 /**
296 * Creates the HTML for the Table Wizard:
297 *
298 * @param array Table config array
299 * @param array Current parent record array
300 * @return string HTML for the table wizard
301 * @access private
302 */
303 function getTableHTML($cfgArr,$row) {
304 global $LANG;
305
306 // Traverse the rows:
307 $tRows=array();
308 $k=0;
309 foreach($cfgArr as $cellArr) {
310 if (is_array($cellArr)) {
311 // Initialize:
312 $cells=array();
313 $a=0;
314
315 // Traverse the columns:
316 foreach($cellArr as $cellContent) {
317 if ($this->inputStyle) {
318 $cells[]='<input type="text"'.$this->doc->formWidth(20).' name="TABLE[c]['.(($k+1)*2).']['.(($a+1)*2).']" value="'.htmlspecialchars($cellContent).'" />';
319 } else {
320 $cellContent=eregi_replace('<br[ ]?[\/]?>',chr(10),$cellContent);
321 $cells[]='<textarea '.$this->doc->formWidth(20).' rows="5" name="TABLE[c]['.(($k+1)*2).']['.(($a+1)*2).']">'.t3lib_div::formatForTextarea($cellContent).'</textarea>';
322 }
323
324 // Increment counter:
325 $a++;
326 }
327
328 // CTRL panel for a table row (move up/down/around):
329 $onClick="document.wizardForm.action+='#ANC_".(($k+1)*2-2)."';";
330 $onClick=' onclick="'.htmlspecialchars($onClick).'"';
331 $ctrl='';
332
333 $brTag=$this->inputStyle?'':'<br />';
334 if ($k!=0) {
335 $ctrl.='<input type="image" name="TABLE[row_up]['.(($k+1)*2).']"'.t3lib_iconWorks::skinImg($this->doc->backPath,'gfx/pil2up.gif','').$onClick.' title="'.$LANG->getLL('table_up',1).'" />'.$brTag;
336 } else {
337 $ctrl.='<input type="image" name="TABLE[row_bottom]['.(($k+1)*2).']"'.t3lib_iconWorks::skinImg($this->doc->backPath,'gfx/turn_up.gif','').$onClick.' title="'.$LANG->getLL('table_bottom',1).'" />'.$brTag;
338 }
339 $ctrl.='<input type="image" name="TABLE[row_remove]['.(($k+1)*2).']"'.t3lib_iconWorks::skinImg($this->doc->backPath,'gfx/garbage.gif','').$onClick.' title="'.$LANG->getLL('table_removeRow',1).'" />'.$brTag;
340
341 // FIXME what is $tLines? See wizard_forms.php for the same.
342 if (($k+1)!=count($tLines)) {
343 $ctrl.='<input type="image" name="TABLE[row_down]['.(($k+1)*2).']"'.t3lib_iconWorks::skinImg($this->doc->backPath,'gfx/pil2down.gif','').$onClick.' title="'.$LANG->getLL('table_down',1).'" />'.$brTag;
344 } else {
345 $ctrl.='<input type="image" name="TABLE[row_top]['.(($k+1)*2).']"'.t3lib_iconWorks::skinImg($this->doc->backPath,'gfx/turn_down.gif','').$onClick.' title="'.$LANG->getLL('table_top',1).'" />'.$brTag;
346 }
347 $ctrl.='<input type="image" name="TABLE[row_add]['.(($k+1)*2).']"'.t3lib_iconWorks::skinImg($this->doc->backPath,'gfx/add.gif','').$onClick.' title="'.$LANG->getLL('table_addRow',1).'" />'.$brTag;
348
349 $tRows[]='
350 <tr class="bgColor4">
351 <td class="bgColor5"><a name="ANC_'.(($k+1)*2).'"></a><span class="c-wizButtonsV">'.$ctrl.'</span></td>
352 <td>'.implode('</td>
353 <td>',$cells).'</td>
354 </tr>';
355
356 // Increment counter:
357 $k++;
358 }
359 }
360
361 // CTRL panel for a table column (move left/right/around/delete)
362 $cells=array();
363 $cells[]='';
364 // Finding first row:
365 reset($cfgArr);
366 $firstRow=current($cfgArr);
367 if (is_array($firstRow)) {
368
369 // Init:
370 $a=0;
371 $cols=count($firstRow);
372
373 // Traverse first row:
374 foreach($firstRow as $temp) {
375 $ctrl='';
376 if ($a!=0) {
377 $ctrl.='<input type="image" name="TABLE[col_left]['.(($a+1)*2).']"'.t3lib_iconWorks::skinImg($this->doc->backPath,'gfx/pil2left.gif','').' title="'.$LANG->getLL('table_left',1).'" />';
378 } else {
379 $ctrl.='<input type="image" name="TABLE[col_end]['.(($a+1)*2).']"'.t3lib_iconWorks::skinImg($this->doc->backPath,'gfx/turn_left.gif','').' title="'.$LANG->getLL('table_end',1).'" />';
380 }
381 $ctrl.='<input type="image" name="TABLE[col_remove]['.(($a+1)*2).']"'.t3lib_iconWorks::skinImg($this->doc->backPath,'gfx/garbage.gif','').' title="'.$LANG->getLL('table_removeColumn',1).'" />';
382 if (($a+1)!=$cols) {
383 $ctrl.='<input type="image" name="TABLE[col_right]['.(($a+1)*2).']"'.t3lib_iconWorks::skinImg($this->doc->backPath,'gfx/pil2right.gif','').' title="'.$LANG->getLL('table_right',1).'" />';
384 } else {
385 $ctrl.='<input type="image" name="TABLE[col_start]['.(($a+1)*2).']"'.t3lib_iconWorks::skinImg($this->doc->backPath,'gfx/turn_right.gif','').' title="'.$LANG->getLL('table_start',1).'" />';
386 }
387 $ctrl.='<input type="image" name="TABLE[col_add]['.(($a+1)*2).']"'.t3lib_iconWorks::skinImg($this->doc->backPath,'gfx/add.gif','').' title="'.$LANG->getLL('table_addColumn',1).'" />';
388 $cells[]='<span class="c-wizButtonsH">'.$ctrl.'</span>';
389
390 // Incr. counter:
391 $a++;
392 }
393 $tRows[]='
394 <tr class="bgColor5">
395 <td align="center">'.implode('</td>
396 <td align="center">',$cells).'</td>
397 </tr>';
398 }
399
400 $content = '';
401
402 // Add CSH:
403 $content.= t3lib_BEfunc::cshItem('xMOD_csh_corebe', 'wizard_table_wiz', $GLOBALS['BACK_PATH'],'');
404
405 // Implode all table rows into a string, wrapped in table tags.
406 $content.= '
407
408
409 <!--
410 Table wizard
411 -->
412 <table border="0" cellpadding="0" cellspacing="1" id="typo3-tablewizard">
413 '.implode('',$tRows).'
414 </table>';
415
416 // Add saving buttons in the bottom:
417 $content.= '
418
419 <!--
420 Save buttons:
421 -->
422 <div id="c-saveButtonPanel">';
423 $content.= '<input type="image" class="c-inputButton" name="savedok"'.t3lib_iconWorks::skinImg($this->doc->backPath,'gfx/savedok.gif','').' title="'.$LANG->sL('LLL:EXT:lang/locallang_core.php:rm.saveDoc',1).'" />';
424 $content.= '<input type="image" class="c-inputButton" name="saveandclosedok"'.t3lib_iconWorks::skinImg($this->doc->backPath,'gfx/saveandclosedok.gif','').' title="'.$LANG->sL('LLL:EXT:lang/locallang_core.php:rm.saveCloseDoc',1).'" />';
425 $content.= '<a href="#" onclick="'.htmlspecialchars('jumpToUrl(unescape(\''.rawurlencode($this->P['returnUrl']).'\')); return false;').'">'.
426 '<img'.t3lib_iconWorks::skinImg($this->doc->backPath,'gfx/closedok.gif','width="21" height="16"').' class="c-inputButton" title="'.$LANG->sL('LLL:EXT:lang/locallang_core.php:rm.closeDoc',1).'" alt="" />'.
427 '</a>';
428 $content.= '<input type="image" class="c-inputButton" name="_refresh"'.t3lib_iconWorks::skinImg($this->doc->backPath,'gfx/refresh_n.gif','').' title="'.$LANG->getLL('forms_refresh',1).'" />';
429 $content.= t3lib_BEfunc::cshItem('xMOD_csh_corebe', 'wizard_table_wiz_buttons', $GLOBALS['BACK_PATH'],'');
430 $content.= '
431 </div>
432 ';
433
434 // Input type checkbox:
435 $content.= '
436
437 <!--
438 Input mode check box:
439 -->
440 <div id="c-inputMode">
441 '.
442 '<input type="hidden" name="TABLE[textFields]" value="0" />'.
443 '<input type="checkbox" name="TABLE[textFields]" id="textFields" value="1"'.($this->inputStyle?' checked="checked"':'').' /> <label for="textFields">'.
444 $LANG->getLL('table_smallFields').'</label>
445 </div>
446
447 <br /><br />
448 ';
449
450 // Return content:
451 return $content;
452 }
453
454 /**
455 * Detects if a control button (up/down/around/delete) has been pressed for an item and accordingly it will manipulate the internal TABLECFG array
456 *
457 * @return void
458 * @access private
459 */
460 function changeFunc() {
461 if ($this->TABLECFG['col_remove']) {
462 $kk = key($this->TABLECFG['col_remove']);
463 $cmd='col_remove';
464 } elseif ($this->TABLECFG['col_add']) {
465 $kk = key($this->TABLECFG['col_add']);
466 $cmd='col_add';
467 } elseif ($this->TABLECFG['col_start']) {
468 $kk = key($this->TABLECFG['col_start']);
469 $cmd='col_start';
470 } elseif ($this->TABLECFG['col_end']) {
471 $kk = key($this->TABLECFG['col_end']);
472 $cmd='col_end';
473 } elseif ($this->TABLECFG['col_left']) {
474 $kk = key($this->TABLECFG['col_left']);
475 $cmd='col_left';
476 } elseif ($this->TABLECFG['col_right']) {
477 $kk = key($this->TABLECFG['col_right']);
478 $cmd='col_right';
479 } elseif ($this->TABLECFG['row_remove']) {
480 $kk = key($this->TABLECFG['row_remove']);
481 $cmd='row_remove';
482 } elseif ($this->TABLECFG['row_add']) {
483 $kk = key($this->TABLECFG['row_add']);
484 $cmd='row_add';
485 } elseif ($this->TABLECFG['row_top']) {
486 $kk = key($this->TABLECFG['row_top']);
487 $cmd='row_top';
488 } elseif ($this->TABLECFG['row_bottom']) {
489 $kk = key($this->TABLECFG['row_bottom']);
490 $cmd='row_bottom';
491 } elseif ($this->TABLECFG['row_up']) {
492 $kk = key($this->TABLECFG['row_up']);
493 $cmd='row_up';
494 } elseif ($this->TABLECFG['row_down']) {
495 $kk = key($this->TABLECFG['row_down']);
496 $cmd='row_down';
497 }
498
499 if ($cmd && t3lib_div::testInt($kk)) {
500 if (substr($cmd,0,4)=='row_') {
501 switch($cmd) {
502 case 'row_remove':
503 unset($this->TABLECFG['c'][$kk]);
504 break;
505 case 'row_add':
506 for($a=1;$a<=$this->numNewRows;$a++) {
507 if (!isset($this->TABLECFG['c'][$kk+$a])) { // Checking if set: The point is that any new row inbetween existing rows will be true after one row is added while if rows are added in the bottom of the table there will be no existing rows to stop the addition of new rows which means it will add up to $this->numNewRows rows then.
508 $this->TABLECFG['c'][$kk+$a] = array();
509 } else {
510 break;
511 }
512 }
513 break;
514 case 'row_top':
515 $this->TABLECFG['c'][1]=$this->TABLECFG['c'][$kk];
516 unset($this->TABLECFG['c'][$kk]);
517 break;
518 case 'row_bottom':
519 $this->TABLECFG['c'][10000000]=$this->TABLECFG['c'][$kk];
520 unset($this->TABLECFG['c'][$kk]);
521 break;
522 case 'row_up':
523 $this->TABLECFG['c'][$kk-3]=$this->TABLECFG['c'][$kk];
524 unset($this->TABLECFG['c'][$kk]);
525 break;
526 case 'row_down':
527 $this->TABLECFG['c'][$kk+3]=$this->TABLECFG['c'][$kk];
528 unset($this->TABLECFG['c'][$kk]);
529 break;
530 }
531 ksort($this->TABLECFG['c']);
532 }
533 if (substr($cmd,0,4)=='col_') {
534 reset($this->TABLECFG['c']);
535 while(list($cAK)=each($this->TABLECFG['c'])) {
536 switch($cmd) {
537 case 'col_remove':
538 unset($this->TABLECFG['c'][$cAK][$kk]);
539 break;
540 case 'col_add':
541 $this->TABLECFG['c'][$cAK][$kk+1]='';
542 break;
543 case 'col_start':
544 $this->TABLECFG['c'][$cAK][1]=$this->TABLECFG['c'][$cAK][$kk];
545 unset($this->TABLECFG['c'][$cAK][$kk]);
546 break;
547 case 'col_end':
548 $this->TABLECFG['c'][$cAK][1000000]=$this->TABLECFG['c'][$cAK][$kk];
549 unset($this->TABLECFG['c'][$cAK][$kk]);
550 break;
551 case 'col_left':
552 $this->TABLECFG['c'][$cAK][$kk-3]=$this->TABLECFG['c'][$cAK][$kk];
553 unset($this->TABLECFG['c'][$cAK][$kk]);
554 break;
555 case 'col_right':
556 $this->TABLECFG['c'][$cAK][$kk+3]=$this->TABLECFG['c'][$cAK][$kk];
557 unset($this->TABLECFG['c'][$cAK][$kk]);
558 break;
559 }
560 ksort($this->TABLECFG['c'][$cAK]);
561 }
562 }
563 }
564
565 // Convert line breaks to <br /> tags:
566 reset($this->TABLECFG['c']);
567 while(list($a)=each($this->TABLECFG['c'])) {
568 reset($this->TABLECFG['c'][$a]);
569 while(list($b)=each($this->TABLECFG['c'][$a])) {
570 $this->TABLECFG['c'][$a][$b] = str_replace(chr(10),'<br />',str_replace(chr(13),'',$this->TABLECFG['c'][$a][$b]));
571 }
572 }
573 }
574
575 /**
576 * Converts the input array to a configuration code string
577 *
578 * @param array Array of table configuration (follows the input structure from the table wizard POST form)
579 * @return string The array converted into a string with line-based configuration.
580 * @see cfgString2CfgArray()
581 */
582 function cfgArray2CfgString($cfgArr) {
583
584 // Initialize:
585 $inLines=array();
586
587 // Traverse the elements of the table wizard and transform the settings into configuration code.
588 reset($this->TABLECFG['c']);
589 while(list($a)=each($this->TABLECFG['c'])) {
590 $thisLine=array();
591 reset($this->TABLECFG['c'][$a]);
592 while(list($b)=each($this->TABLECFG['c'][$a])) {
593 $thisLine[]=$this->tableParsing_quote.str_replace($this->tableParsing_delimiter,'',$this->TABLECFG['c'][$a][$b]).$this->tableParsing_quote;
594 }
595 $inLines[]=implode($this->tableParsing_delimiter,$thisLine);
596 }
597
598 // Finally, implode the lines into a string:
599 $bodyText = implode(chr(10),$inLines);
600
601 // Return the configuration code:
602 return $bodyText;
603 }
604
605 /**
606 * Converts the input configuration code string into an array
607 *
608 * @param string Configuration code
609 * @param integer Default number of columns
610 * @return array Configuration array
611 * @see cfgArray2CfgString()
612 */
613 function cfgString2CfgArray($cfgStr,$cols) {
614
615 // Explode lines in the configuration code - each line is a table row.
616 $tLines=explode(chr(10),$cfgStr);
617
618 // Setting number of columns
619 if (!$cols && trim($tLines[0])) { // auto...
620 $cols = count(explode($this->tableParsing_delimiter,$tLines[0]));
621 }
622 $cols=$cols?$cols:4;
623
624 // Traverse the number of table elements:
625 $cfgArr=array();
626 foreach($tLines as $k => $v) {
627
628 // Initialize:
629 $vParts = explode($this->tableParsing_delimiter,$v);
630
631 // Traverse columns:
632 for ($a=0;$a<$cols;$a++) {
633 if ($this->tableParsing_quote && substr($vParts[$a],0,1) == $this->tableParsing_quote && substr($vParts[$a],-1,1) == $this->tableParsing_quote) {
634 $vParts[$a] = substr(trim($vParts[$a]),1,-1);
635 }
636 $cfgArr[$k][$a]=$vParts[$a];
637 }
638 }
639
640 // Return configuration array:
641 return $cfgArr;
642 }
643 }
644
645 // Include extension?
646 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['typo3/wizard_table.php']) {
647 include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['typo3/wizard_table.php']);
648 }
649
650
651
652
653
654
655
656
657
658
659
660
661 // Make instance:
662 $SOBE = t3lib_div::makeInstance('SC_wizard_table');
663 $SOBE->init();
664
665 // Include files?
666 foreach($SOBE->include_once as $INC_FILE) include_once($INC_FILE);
667
668 $SOBE->main();
669 $SOBE->printContent();
670 ?>