Fixed bug #16574: PHP notices from XCLASS inclusions
[Packages/TYPO3.CMS.git] / typo3 / wizard_table.php
1 <?php
2 /***************************************************************
3 * Copyright notice
4 *
5 * (c) 1999-2010 Kasper Skårhøj (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 Skårhøj
33 * XHTML compliant
34 *
35 * @author Kasper Skårhøj <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 Skårhøj <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 // GPvars:
123 $this->P = t3lib_div::_GP('P');
124 $this->TABLECFG = t3lib_div::_GP('TABLE');
125
126 // Setting options:
127 $this->xmlStorage = $this->P['params']['xmlOutput'];
128 $this->numNewRows = t3lib_div::intInRange($this->P['params']['numNewRows'],1,50,5);
129
130 // Textareas or input fields:
131 $this->inputStyle=isset($this->TABLECFG['textFields']) ? $this->TABLECFG['textFields'] : 1;
132
133 // Document template object:
134 $this->doc = t3lib_div::makeInstance('template');
135 $this->doc->backPath = $GLOBALS['BACK_PATH'];
136 $this->doc->setModuleTemplate('templates/wizard_table.html');
137 $this->doc->JScode=$this->doc->wrapScriptTags('
138 function jumpToUrl(URL,formEl) { //
139 window.location.href = URL;
140 }
141 ');
142
143 // Setting form tag:
144 list($rUri) = explode('#',t3lib_div::getIndpEnv('REQUEST_URI'));
145 $this->doc->form ='<form action="'.htmlspecialchars($rUri).'" method="post" name="wizardForm">';
146
147 // If save command found, include tcemain:
148 if ($_POST['savedok_x'] || $_POST['saveandclosedok_x']) {
149 $this->include_once[]=PATH_t3lib.'class.t3lib_tcemain.php';
150 }
151
152 $this->tableParsing_delimiter = '|';
153 $this->tableParsing_quote = '';
154 }
155
156 /**
157 * Main function, rendering the table wizard
158 *
159 * @return void
160 */
161 function main() {
162 if ($this->P['table'] && $this->P['field'] && $this->P['uid']) {
163 $this->content.= $this->doc->section($GLOBALS['LANG']->getLL('table_title'), $this->tableWizard(), 0, 1);
164 } else {
165 $this->content.= $this->doc->section($GLOBALS['LANG']->getLL('table_title'), '<span class="typo3-red">' . $GLOBALS['LANG']->getLL('table_noData',1) . '</span>', 0, 1);
166 }
167
168 // Setting up the buttons and markers for docheader
169 $docHeaderButtons = $this->getButtons();
170 $markers['CSH'] = $docHeaderButtons['csh'];
171 $markers['CONTENT'] = $this->content;
172
173 // Build the <body> for the module
174 $this->content = $this->doc->startPage('Table');
175 $this->content.= $this->doc->moduleBody($this->pageinfo, $docHeaderButtons, $markers);
176 $this->content.= $this->doc->endPage();
177 $this->content = $this->doc->insertStylesAndJS($this->content);
178 }
179
180 /**
181 * Outputting the accumulated content to screen
182 *
183 * @return void
184 */
185 function printContent() {
186 echo $this->content;
187 }
188
189 /**
190 * Create the panel of buttons for submitting the form or otherwise perform operations.
191 *
192 * @return array all available buttons as an assoc. array
193 */
194 protected function getButtons() {
195 $buttons = array(
196 'csh' => '',
197 'csh_buttons' => '',
198 'close' => '',
199 'save' => '',
200 'save_close' => '',
201 'reload' => '',
202 );
203
204 if ($this->P['table'] && $this->P['field'] && $this->P['uid']) {
205 // CSH
206 $buttons['csh'] = t3lib_BEfunc::cshItem('xMOD_csh_corebe', 'wizard_table_wiz', $GLOBALS['BACK_PATH'], '');
207
208 // CSH Buttons
209 $buttons['csh_buttons'] = t3lib_BEfunc::cshItem('xMOD_csh_corebe', 'wizard_table_wiz_buttons', $GLOBALS['BACK_PATH'], '');
210
211 // Close
212 $buttons['close'] = '<a href="#" onclick="' . htmlspecialchars('jumpToUrl(unescape(\'' . rawurlencode(t3lib_div::sanitizeLocalUrl($this->P['returnUrl'])) . '\')); return false;') . '">' .
213 t3lib_iconWorks::getSpriteIcon('actions-document-close', array('title' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:rm.closeDoc', TRUE))) .
214 '</a>';
215
216 // Save
217 $buttons['save'] = '<input type="image" class="c-inputButton" name="savedok"' . t3lib_iconWorks::skinImg($this->doc->backPath, 'gfx/savedok.gif') . ' title="' . $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:rm.saveDoc', 1) . '" />';
218
219 // Save & Close
220 $buttons['save_close'] = '<input type="image" class="c-inputButton" name="saveandclosedok"' . t3lib_iconWorks::skinImg($this->doc->backPath, 'gfx/saveandclosedok.gif') . ' title="' . $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:rm.saveCloseDoc', 1) . '" />';
221
222 // Reload
223 $buttons['reload'] = '<input type="image" class="c-inputButton" name="_refresh"' . t3lib_iconWorks::skinImg($this->doc->backPath, 'gfx/refresh_n.gif') . ' title="' . $GLOBALS['LANG']->getLL('forms_refresh', 1) . '" />';
224 }
225
226 return $buttons;
227 }
228
229 /**
230 * Draws the table wizard content
231 *
232 * @return string HTML content for the form.
233 */
234 function tableWizard() {
235
236 // First, check the references by selecting the record:
237 $row = t3lib_BEfunc::getRecord($this->P['table'],$this->P['uid']);
238 if (!is_array($row)) {
239 throw new RuntimeException('Wizard Error: No reference to record');
240 }
241
242 // 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.
243 $tableCfgArray = $this->getConfigCode($row);
244
245 // Generation of the Table Wizards HTML code:
246 $content = $this->getTableHTML($tableCfgArray,$row);
247
248 // Return content:
249 return $content;
250 }
251
252
253
254
255
256
257
258 /***************************
259 *
260 * Helper functions
261 *
262 ***************************/
263
264 /**
265 * Will get and return the configuration code string
266 * Will also save (and possibly redirect/exit) the content if a save button has been pressed
267 *
268 * @param array Current parent record row
269 * @return array Table config code in an array
270 * @access private
271 */
272 function getConfigCode($row) {
273
274 // get delimiter settings
275 $flexForm = t3lib_div::xml2array($row['pi_flexform']);
276
277 if (is_array($flexForm)) {
278 $this->tableParsing_quote = $flexForm['data']['s_parsing']['lDEF']['tableparsing_quote']['vDEF']?chr(intval($flexForm['data']['s_parsing']['lDEF']['tableparsing_quote']['vDEF'])):'';
279 $this->tableParsing_delimiter = $flexForm['data']['s_parsing']['lDEF']['tableparsing_delimiter']['vDEF']?chr(intval($flexForm['data']['s_parsing']['lDEF']['tableparsing_delimiter']['vDEF'])):'|';
280 }
281
282 // If some data has been submitted, then construct
283 if (isset($this->TABLECFG['c'])) {
284
285 // Process incoming:
286 $this->changeFunc();
287
288
289 // Convert to string (either line based or XML):
290 if ($this->xmlStorage) {
291 // Convert the input array to XML:
292 $bodyText = t3lib_div::array2xml_cs($this->TABLECFG['c'],'T3TableWizard');
293
294 // Setting cfgArr directly from the input:
295 $cfgArr = $this->TABLECFG['c'];
296 } else {
297 // Convert the input array to a string of configuration code:
298 $bodyText = $this->cfgArray2CfgString($this->TABLECFG['c']);
299
300 // Create cfgArr from the string based configuration - that way it is cleaned up and any incompatibilities will be removed!
301 $cfgArr = $this->cfgString2CfgArray($bodyText,$row[$this->colsFieldName]);
302 }
303
304 // If a save button has been pressed, then save the new field content:
305 if ($_POST['savedok_x'] || $_POST['saveandclosedok_x']) {
306
307 // Make TCEmain object:
308 $tce = t3lib_div::makeInstance('t3lib_TCEmain');
309 $tce->stripslashes_values=0;
310
311 // Put content into the data array:
312 $data=array();
313 $data[$this->P['table']][$this->P['uid']][$this->P['field']]=$bodyText;
314
315 // Perform the update:
316 $tce->start($data,array());
317 $tce->process_datamap();
318
319 // If the save/close button was pressed, then redirect the screen:
320 if ($_POST['saveandclosedok_x']) {
321 t3lib_utility_Http::redirect(t3lib_div::sanitizeLocalUrl($this->P['returnUrl']));
322 }
323 }
324 } else { // If nothing has been submitted, load the $bodyText variable from the selected database row:
325 if ($this->xmlStorage) {
326 $cfgArr = t3lib_div::xml2array($row[$this->P['field']]);
327 } else { // Regular linebased table configuration:
328 $cfgArr = $this->cfgString2CfgArray($row[$this->P['field']],$row[$this->colsFieldName]);
329 }
330 $cfgArr = is_array($cfgArr) ? $cfgArr : array();
331 }
332
333 return $cfgArr;
334 }
335
336 /**
337 * Creates the HTML for the Table Wizard:
338 *
339 * @param array Table config array
340 * @param array Current parent record array
341 * @return string HTML for the table wizard
342 * @access private
343 */
344 function getTableHTML($cfgArr,$row) {
345 global $LANG;
346
347 // Traverse the rows:
348 $tRows=array();
349 $k=0;
350 foreach($cfgArr as $cellArr) {
351 if (is_array($cellArr)) {
352 // Initialize:
353 $cells=array();
354 $a=0;
355
356 // Traverse the columns:
357 foreach($cellArr as $cellContent) {
358 if ($this->inputStyle) {
359 $cells[]='<input type="text"'.$this->doc->formWidth(20).' name="TABLE[c]['.(($k+1)*2).']['.(($a+1)*2).']" value="'.htmlspecialchars($cellContent).'" />';
360 } else {
361 $cellContent=preg_replace('/<br[ ]?[\/]?>/i',LF,$cellContent);
362 $cells[]='<textarea '.$this->doc->formWidth(20).' rows="5" name="TABLE[c]['.(($k+1)*2).']['.(($a+1)*2).']">'.t3lib_div::formatForTextarea($cellContent).'</textarea>';
363 }
364
365 // Increment counter:
366 $a++;
367 }
368
369 // CTRL panel for a table row (move up/down/around):
370 $onClick="document.wizardForm.action+='#ANC_".(($k+1)*2-2)."';";
371 $onClick=' onclick="'.htmlspecialchars($onClick).'"';
372 $ctrl='';
373
374 $brTag=$this->inputStyle?'':'<br />';
375 if ($k!=0) {
376 $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;
377 } else {
378 $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;
379 }
380 $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;
381
382 // FIXME what is $tLines? See wizard_forms.php for the same.
383 if (($k+1)!=count($tLines)) {
384 $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;
385 } else {
386 $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;
387 }
388 $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;
389
390 $tRows[]='
391 <tr class="bgColor4">
392 <td class="bgColor5"><a name="ANC_'.(($k+1)*2).'"></a><span class="c-wizButtonsV">'.$ctrl.'</span></td>
393 <td>'.implode('</td>
394 <td>',$cells).'</td>
395 </tr>';
396
397 // Increment counter:
398 $k++;
399 }
400 }
401
402 // CTRL panel for a table column (move left/right/around/delete)
403 $cells=array();
404 $cells[]='';
405 // Finding first row:
406 reset($cfgArr);
407 $firstRow=current($cfgArr);
408 if (is_array($firstRow)) {
409
410 // Init:
411 $a=0;
412 $cols=count($firstRow);
413
414 // Traverse first row:
415 foreach($firstRow as $temp) {
416 $ctrl='';
417 if ($a!=0) {
418 $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).'" />';
419 } else {
420 $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).'" />';
421 }
422 $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).'" />';
423 if (($a+1)!=$cols) {
424 $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).'" />';
425 } else {
426 $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).'" />';
427 }
428 $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).'" />';
429 $cells[]='<span class="c-wizButtonsH">'.$ctrl.'</span>';
430
431 // Incr. counter:
432 $a++;
433 }
434 $tRows[]='
435 <tr class="bgColor5">
436 <td align="center">'.implode('</td>
437 <td align="center">',$cells).'</td>
438 </tr>';
439 }
440
441 $content = '';
442
443 // Implode all table rows into a string, wrapped in table tags.
444 $content.= '
445
446
447 <!--
448 Table wizard
449 -->
450 <table border="0" cellpadding="0" cellspacing="1" id="typo3-tablewizard">
451 '.implode('',$tRows).'
452 </table>';
453
454 // Input type checkbox:
455 $content.= '
456
457 <!--
458 Input mode check box:
459 -->
460 <div id="c-inputMode">
461 '.
462 '<input type="hidden" name="TABLE[textFields]" value="0" />'.
463 '<input type="checkbox" name="TABLE[textFields]" id="textFields" value="1"'.($this->inputStyle?' checked="checked"':'').' /> <label for="textFields">'.
464 $LANG->getLL('table_smallFields').'</label>
465 </div>
466
467 <br /><br />
468 ';
469
470 // Return content:
471 return $content;
472 }
473
474 /**
475 * Detects if a control button (up/down/around/delete) has been pressed for an item and accordingly it will manipulate the internal TABLECFG array
476 *
477 * @return void
478 * @access private
479 */
480 function changeFunc() {
481 if ($this->TABLECFG['col_remove']) {
482 $kk = key($this->TABLECFG['col_remove']);
483 $cmd='col_remove';
484 } elseif ($this->TABLECFG['col_add']) {
485 $kk = key($this->TABLECFG['col_add']);
486 $cmd='col_add';
487 } elseif ($this->TABLECFG['col_start']) {
488 $kk = key($this->TABLECFG['col_start']);
489 $cmd='col_start';
490 } elseif ($this->TABLECFG['col_end']) {
491 $kk = key($this->TABLECFG['col_end']);
492 $cmd='col_end';
493 } elseif ($this->TABLECFG['col_left']) {
494 $kk = key($this->TABLECFG['col_left']);
495 $cmd='col_left';
496 } elseif ($this->TABLECFG['col_right']) {
497 $kk = key($this->TABLECFG['col_right']);
498 $cmd='col_right';
499 } elseif ($this->TABLECFG['row_remove']) {
500 $kk = key($this->TABLECFG['row_remove']);
501 $cmd='row_remove';
502 } elseif ($this->TABLECFG['row_add']) {
503 $kk = key($this->TABLECFG['row_add']);
504 $cmd='row_add';
505 } elseif ($this->TABLECFG['row_top']) {
506 $kk = key($this->TABLECFG['row_top']);
507 $cmd='row_top';
508 } elseif ($this->TABLECFG['row_bottom']) {
509 $kk = key($this->TABLECFG['row_bottom']);
510 $cmd='row_bottom';
511 } elseif ($this->TABLECFG['row_up']) {
512 $kk = key($this->TABLECFG['row_up']);
513 $cmd='row_up';
514 } elseif ($this->TABLECFG['row_down']) {
515 $kk = key($this->TABLECFG['row_down']);
516 $cmd='row_down';
517 }
518
519 if ($cmd && t3lib_div::testInt($kk)) {
520 if (substr($cmd,0,4)=='row_') {
521 switch($cmd) {
522 case 'row_remove':
523 unset($this->TABLECFG['c'][$kk]);
524 break;
525 case 'row_add':
526 for($a=1;$a<=$this->numNewRows;$a++) {
527 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.
528 $this->TABLECFG['c'][$kk+$a] = array();
529 } else {
530 break;
531 }
532 }
533 break;
534 case 'row_top':
535 $this->TABLECFG['c'][1]=$this->TABLECFG['c'][$kk];
536 unset($this->TABLECFG['c'][$kk]);
537 break;
538 case 'row_bottom':
539 $this->TABLECFG['c'][10000000]=$this->TABLECFG['c'][$kk];
540 unset($this->TABLECFG['c'][$kk]);
541 break;
542 case 'row_up':
543 $this->TABLECFG['c'][$kk-3]=$this->TABLECFG['c'][$kk];
544 unset($this->TABLECFG['c'][$kk]);
545 break;
546 case 'row_down':
547 $this->TABLECFG['c'][$kk+3]=$this->TABLECFG['c'][$kk];
548 unset($this->TABLECFG['c'][$kk]);
549 break;
550 }
551 ksort($this->TABLECFG['c']);
552 }
553 if (substr($cmd,0,4)=='col_') {
554 foreach ($this->TABLECFG['c'] as $cAK => $value) {
555 switch($cmd) {
556 case 'col_remove':
557 unset($this->TABLECFG['c'][$cAK][$kk]);
558 break;
559 case 'col_add':
560 $this->TABLECFG['c'][$cAK][$kk+1]='';
561 break;
562 case 'col_start':
563 $this->TABLECFG['c'][$cAK][1]=$this->TABLECFG['c'][$cAK][$kk];
564 unset($this->TABLECFG['c'][$cAK][$kk]);
565 break;
566 case 'col_end':
567 $this->TABLECFG['c'][$cAK][1000000]=$this->TABLECFG['c'][$cAK][$kk];
568 unset($this->TABLECFG['c'][$cAK][$kk]);
569 break;
570 case 'col_left':
571 $this->TABLECFG['c'][$cAK][$kk-3]=$this->TABLECFG['c'][$cAK][$kk];
572 unset($this->TABLECFG['c'][$cAK][$kk]);
573 break;
574 case 'col_right':
575 $this->TABLECFG['c'][$cAK][$kk+3]=$this->TABLECFG['c'][$cAK][$kk];
576 unset($this->TABLECFG['c'][$cAK][$kk]);
577 break;
578 }
579 ksort($this->TABLECFG['c'][$cAK]);
580 }
581 }
582 }
583
584 // Convert line breaks to <br /> tags:
585 foreach ($this->TABLECFG['c'] as $a => $value) {
586 foreach ($this->TABLECFG['c'][$a] as $b => $value2) {
587 $this->TABLECFG['c'][$a][$b] = str_replace(LF,'<br />',str_replace(CR,'',$this->TABLECFG['c'][$a][$b]));
588 }
589 }
590 }
591
592 /**
593 * Converts the input array to a configuration code string
594 *
595 * @param array Array of table configuration (follows the input structure from the table wizard POST form)
596 * @return string The array converted into a string with line-based configuration.
597 * @see cfgString2CfgArray()
598 */
599 function cfgArray2CfgString($cfgArr) {
600
601 // Initialize:
602 $inLines=array();
603
604 // Traverse the elements of the table wizard and transform the settings into configuration code.
605 foreach ($this->TABLECFG['c'] as $a => $value) {
606 $thisLine=array();
607 foreach ($this->TABLECFG['c'][$a] as $b => $value) {
608 $thisLine[]=$this->tableParsing_quote.str_replace($this->tableParsing_delimiter,'',$this->TABLECFG['c'][$a][$b]).$this->tableParsing_quote;
609 }
610 $inLines[]=implode($this->tableParsing_delimiter,$thisLine);
611 }
612
613 // Finally, implode the lines into a string:
614 $bodyText = implode(LF,$inLines);
615
616 // Return the configuration code:
617 return $bodyText;
618 }
619
620 /**
621 * Converts the input configuration code string into an array
622 *
623 * @param string Configuration code
624 * @param integer Default number of columns
625 * @return array Configuration array
626 * @see cfgArray2CfgString()
627 */
628 function cfgString2CfgArray($cfgStr,$cols) {
629
630 // Explode lines in the configuration code - each line is a table row.
631 $tLines=explode(LF,$cfgStr);
632
633 // Setting number of columns
634 if (!$cols && trim($tLines[0])) { // auto...
635 $cols = count(explode($this->tableParsing_delimiter,$tLines[0]));
636 }
637 $cols=$cols?$cols:4;
638
639 // Traverse the number of table elements:
640 $cfgArr=array();
641 foreach($tLines as $k => $v) {
642
643 // Initialize:
644 $vParts = explode($this->tableParsing_delimiter,$v);
645
646 // Traverse columns:
647 for ($a=0;$a<$cols;$a++) {
648 if ($this->tableParsing_quote && substr($vParts[$a],0,1) == $this->tableParsing_quote && substr($vParts[$a],-1,1) == $this->tableParsing_quote) {
649 $vParts[$a] = substr(trim($vParts[$a]),1,-1);
650 }
651 $cfgArr[$k][$a]=$vParts[$a];
652 }
653 }
654
655 // Return configuration array:
656 return $cfgArr;
657 }
658 }
659
660
661 if (defined('TYPO3_MODE') && isset($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS']['typo3/wizard_table.php'])) {
662 include_once($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS']['typo3/wizard_table.php']);
663 }
664
665
666
667 // Make instance:
668 $SOBE = t3lib_div::makeInstance('SC_wizard_table');
669 $SOBE->init();
670
671 // Include files?
672 foreach($SOBE->include_once as $INC_FILE) include_once($INC_FILE);
673
674 $SOBE->main();
675 $SOBE->printContent();
676
677 ?>