2 /***************************************************************
5 * (c) 1999-2005 Kasper Skaarhoj (kasperYYYY@typo3.com)
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.
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.
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.
25 * This copyright notice MUST APPEAR in all copies of the script!
26 ***************************************************************/
28 * Wizard for inserting TSconfig in form fields. (page,user or TS)
31 * Revised for TYPO3 3.6 November/2003 by Kasper Skaarhoj
34 * @author Kasper Skaarhoj <kasperYYYY@typo3.com>
37 * [CLASS/FUNCTION INDEX of SCRIPT]
41 * 98: class ext_TSparser extends t3lib_tsparser_ext
42 * 106: function makeHtmlspecialchars($P)
45 * 127: class SC_wizard_tsconfig
46 * 149: function init()
47 * 202: function setValue(field,value)
48 * 232: function mixerField(cmd,objString)
49 * 258: function str_replace(match,replace,string)
50 * 280: function jump(show,objString)
51 * 295: function main()
52 * 320: function printContent()
53 * 333: function browseTSprop($mode,$show)
55 * SECTION: Module functions
56 * 419: function getObjTree()
57 * 449: function setObj(&$objTree,$strArr,$params)
58 * 469: function revertFromSpecialChars($str)
59 * 482: function doLink($params)
60 * 495: function removePointerObjects($objArray)
61 * 514: function linkToObj($str,$uid,$objString='')
62 * 527: function printTable($table,$objString,$objTree)
63 * 608: function linkProperty($str,$propertyName,$prefix,$datatype)
66 * (This index is automatically created/updated by the extension "extdeveval")
74 require ('template.php');
75 $LANG->includeLLFile('EXT:lang/locallang_wizards.xml');
76 require_once (PATH_t3lib
.'class.t3lib_parsehtml.php');
77 require_once (PATH_t3lib
.'class.t3lib_tstemplate.php');
78 require_once (PATH_t3lib
.'class.t3lib_tsparser_ext.php');
92 * TypoScript parser extension class.
94 * @author Kasper Skaarhoj <kasperYYYY@typo3.com>
98 class ext_TSparser
extends t3lib_tsparser_ext
{
101 * Pass through of incoming value for link.
103 * @param array P array
104 * @return string The "_LINK" key value, straight away.
106 function makeHtmlspecialchars($P) {
121 * Script Class for rendering the TSconfig/TypoScript property browser.
123 * @author Kasper Skaarhoj <kasperYYYY@typo3.com>
127 class SC_wizard_tsconfig
{
129 // Internal, dynamic:
130 var $doc; // Document template object
131 var $content; // Content accumulation for the module.
133 // Internal, static: GPvars
134 var $P; // Wizard parameters, coming from TCEforms linking to the wizard.
135 var $mode; // "page", "tsref" or "beuser"
136 var $show; // Pointing to an entry in static_tsconfig_help to show.
137 var $objString; // Object path - for display.
138 var $onlyProperty; // If set, the "mixed-field" is not shown and you can select only one property at a time.
145 * Initialization of the class
150 global $LANG,$BACK_PATH;
152 // Check if the tsconfig_help extension is loaded - which is mandatory for this wizard to work.
153 t3lib_extMgm
::isLoaded('tsconfig_help',1);
156 $this->P
= t3lib_div
::_GP('P');
157 $this->mode
= t3lib_div
::_GP('mode');
158 $this->show
= t3lib_div
::_GP('show');
159 $this->objString
= t3lib_div
::_GP('objString');
160 $this->onlyProperty
= t3lib_div
::_GP('onlyProperty');
161 // Preparing some JavaScript code:
162 if (!is_array($this->P
['fieldChangeFunc'])) $this->P
['fieldChangeFunc']=array();
163 unset($this->P
['fieldChangeFunc']['alert']);
165 foreach($this->P
['fieldChangeFunc'] as $k=>$v) {
170 // Init the document table object:
171 $this->doc
= t3lib_div
::makeInstance('mediumDoc');
172 $this->doc
->docType
= 'xhtml_trans';
173 $this->doc
->backPath
= $BACK_PATH;
174 $this->doc
->form
='<form action="" name="editform">';
176 // Adding Styles (should go into stylesheet?)
177 $this->doc
->inDocStylesArray
[] = '
178 A:link {text-decoration: bold; color: '.$this->doc
->hoverColor
.';}
179 A:visited {text-decoration: bold; color: '.$this->doc
->hoverColor
.';}
180 A:active {text-decoration: bold; color: '.$this->doc
->hoverColor
.';}
181 A:hover {color: '.$this->doc
->bgColor2
.'}
184 $this->doc
->JScode
.=$this->doc
->wrapScriptTags('
185 function checkReference_name() { // Checks if the input field containing the name exists in the document
186 if (window.opener && window.opener.document && window.opener.document.'.$this->P
['formName'].' && window.opener.document.'.$this->P
['formName'].'["'.$this->P
['itemName'].'"] ) {
187 return window.opener.document.'.$this->P
['formName'].'["'.$this->P
['itemName'].'"];
190 function checkReference_value() { // Checks if the input field containing the value exists in the document
191 if (window.opener && window.opener.document && window.opener.document.'.$this->P
['formName'].' && window.opener.document.'.$this->P
['formName'].'["'.$this->P
['itemValue'].'"] ) {
192 return window.opener.document.'.$this->P
['formName'].'["'.$this->P
['itemValue'].'"];
197 * [Describe function...]
199 * @param [type] $field,value: ...
202 function setValue(field,value) {
203 var nameField = checkReference_name();
204 var valueField = checkReference_value();
206 if (valueField) { // This applies to the TS Object Browser module
207 nameField.value=field;
208 valueField.value=value;
209 } else { // This applies to the Info/Modify module and the Page TSconfig field
211 nameField.value=field+"="+value+"\n"+nameField.value;
213 nameField.value=field+"\n"+nameField.value;
217 window.opener.focus();
221 function getValue() { // This is never used. Remove it?
222 var field = checkReference_name();
231 * [Describe function...]
233 * @param [type] $cmd,objString: ...
236 function mixerField(cmd,objString) {
240 temp = str_replace("\n","\n ","\n"+document.editform.mixer.value);
241 document.editform.mixer.value = temp.substr(1);
244 temp = str_replace("\n ","\n","\n"+document.editform.mixer.value);
245 document.editform.mixer.value = temp.substr(1);
248 setValue(document.editform.mixer.value);
251 document.editform.mixer.value=objString+" {\n"+document.editform.mixer.value+"\n}";
257 * [Describe function...]
259 * @param [type] $match,replace,string: ...
262 function str_replace(match,replace,string) {
263 var input = ""+string;
264 var matchStr = ""+match;
265 if (!matchStr) {return string;}
268 var pos = input.indexOf(matchStr);
270 output+=""+input.substr(pointer, pos-pointer)+replace;
271 pointer=pos+matchStr.length;
272 pos = input.indexOf(match,pos+1);
274 output+=""+input.substr(pointer);
279 * [Describe function...]
281 * @param [type] $show,objString: ...
284 function jump(show,objString) {
285 window.location.href = "'.t3lib_div
::linkThisScript(array('show'=>'','objString'=>'')).'&show="+show+"&objString="+objString;
291 $this->content
.=$this->doc
->startPage($LANG->getLL('tsprop'));
295 * Main function, rendering the content of the TypoScript property browser, including links to online resources
302 // Adding module content:
303 $this->content
.=$this->doc
->section($LANG->getLL('tsprop'),$this->browseTSprop($this->mode
,$this->show
),0,1);
305 // Adding link to TSref:
306 if ($this->mode
=='tsref') {
307 $this->content
.=$this->doc
->section($LANG->getLL('tsprop_TSref'),'
308 <a href="'.htmlspecialchars('http://typo3.org/documentation/document-library/references/doc_core_tsref/current/view/').'" target="_blank">'.$LANG->getLL('tsprop_TSref',1).'</a>
311 // Adding link to admin guides etc:
312 if ($this->mode
=='page' ||
$this->mode
=='beuser') {
313 $this->content
.=$this->doc
->section($LANG->getLL('tsprop_tsconfig'),'
314 <a href="'.htmlspecialchars('http://typo3.org/documentation/document-library/references/doc_core_tsconfig/current/view/').'" target="_blank">'.$LANG->getLL('tsprop_tsconfig',1).'</a>
320 * Outputting the accumulated content to screen
324 function printContent() {
325 $this->content
.= $this->doc
->endPage();
326 $this->content
= $this->doc
->insertStylesAndJS($this->content
);
331 * Create the content of the module:
333 * @param string Object string
334 * @param integer Pointing to an entry in static_tsconfig_help to show.
335 * @return string HTML
337 function browseTSprop($mode,$show) {
341 $objTree = $this->getObjTree();
343 // Show single element, if show is set.
346 // Get the entry data:
347 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*', 'static_tsconfig_help', 'uid='.intval($show));
348 $rec = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res);
349 $table = unserialize($rec['appdata']);
350 $obj_string = strtr($this->objString
,'()','[]'); // Title:
352 // Title and description:
353 $out.='<a href="'.htmlspecialchars(t3lib_div
::linkThisScript(array('show'=>''))).'" class="typo3-goBack">'.
354 '<img'.t3lib_iconWorks
::skinImg($this->doc
->backPath
,'gfx/goback.gif','width="14" height="14"').' alt="" />'.
355 htmlspecialchars($obj_string).
357 if ($rec['title']) $out.= '<strong>'.htmlspecialchars($rec['title']).': </strong>';
358 if ($rec['description']) $out.= nl2br(htmlspecialchars(trim($rec['description']))).'<br />';
360 // Printing the content:
361 $out.= '<br />'.$this->printTable($table, $obj_string, $objTree[$mode.'.']);
364 // Printing the "mixer-field":
365 if (!$this->onlyProperty
) {
367 $links[]='<a href="#" onclick="mixerField(\'Indent\');return false;">'.$LANG->getLL('tsprop_mixer_indent',1).'</a>';
368 $links[]='<a href="#" onclick="mixerField(\'Outdent\');return false;">'.$LANG->getLL('tsprop_mixer_outdent',1).'</a>';
369 $links[]='<a href="#" onclick="mixerField(\'Wrap\',unescape(\''.rawurlencode($obj_string).'\'));return false;">'.$LANG->getLL('tsprop_mixer_wrap',1).'</a>';
370 $links[]='<a href="#" onclick="mixerField(\'Transfer\');return false;">'.$LANG->getLL('tsprop_mixer_transfer',1).'</a>';
371 $out.='<textarea rows="5" name="mixer" wrap="off"'.$this->doc
->formWidthText(48,'','off').' class="fixed-font enable-tab"></textarea>';
372 $out.='<br /><strong>'.implode(' | ',$links).'</strong>';
378 // SECTION: Showing property tree:
379 $tmpl = t3lib_div
::makeInstance('ext_TSparser');
380 $tmpl->tt_track
= 0; // Do not log time-performance information
382 $tmpl->linkObjects
=0;
384 $tmpl->ext_expandAllNotes
=1;
385 $tmpl->ext_noPMicons
=1;
386 $tmpl->ext_noSpecialCharsOnLabels
=1;
388 if (is_array($objTree[$mode.'.'])) {
393 TSconfig, object tree:
395 <table border="0" cellpadding="0" cellspacing="0" id="typo3-objtree">
397 <td nowrap="nowrap">'.$tmpl->ext_getObjTree($this->removePointerObjects($objTree[$mode.'.']),'','','','','1').'</td>
411 /***************************
415 ***************************/
418 * Create object tree from static_tsconfig_help table
420 * @return array Object tree.
423 function getObjTree() {
426 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('uid,obj_string,title', 'static_tsconfig_help', '');
427 while($rec = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
428 $rec['obj_string'] = $this->revertFromSpecialChars($rec['obj_string']);
429 $p = explode(';',$rec['obj_string']);
430 while(list(,$v)=each($p)) {
431 $p2 = t3lib_div
::trimExplode(':',$v,1);
432 $subp=t3lib_div
::trimExplode('/',$p2[1],1);
433 while(list(,$v2)=each($subp)) {
434 $this->setObj($objTree,explode('.',$p2[0].'.'.$v2),array($rec,$v2));
442 * Sets the information from a static_tsconfig_help record in the object array.
443 * Makes recursive calls.
445 * @param array Object tree array, passed by value!
446 * @param array Array of elements from object path (?)
447 * @param array Array with record and something else (?)
452 function setObj(&$objTree,$strArr,$params) {
453 $key = current($strArr);
455 if (count($strArr)>1) {
456 array_shift($strArr);
457 if (!isset($objTree[$key.'.'])) $objTree[$key.'.']=array();
458 $this->setObj($objTree[$key.'.'],$strArr,$params);
460 $objTree[$key]=$params;
461 $objTree[$key]['_LINK']=$this->doLink($params);
466 * Converts > and < to > and <
468 * @param string Input string
469 * @return string Output string
472 function revertFromSpecialChars($str) {
473 $str = str_replace('>','>',$str);
474 $str = str_replace('<','<',$str);
479 * Creates a link based on input params array:
481 * @param array Parameters
482 * @return string The link.
485 function doLink($params) {
486 $title = trim($params[0]['title'])?
trim($params[0]['title']):'[GO]';
487 $str = $this->linkToObj($title,$params[0]['uid'],$params[1]);
492 * Remove pointer strings from an array
494 * @param array Input array
495 * @return array Modified input array
498 function removePointerObjects($objArray) {
500 while(list($k)=each($objArray)) {
501 if (substr(trim($k),0,2)=="->" && trim($k)!='->.') {
502 $objArray['->.'][substr(trim($k),2)]=$objArray[$k];
503 unset($objArray[$k]);
510 * Linking string to object by UID
512 * @param string String to link
513 * @param integer UID of a static_tsconfig_help record.
514 * @param string Title string for that record!
515 * @return string Linked string
517 function linkToObj($str,$uid,$objString='') {
518 $aOnClick='jump(\''.rawurlencode($uid).'\',\''.rawurlencode($objString).'\');return false;';
519 return '<a href="#" onclick="'.htmlspecialchars($aOnClick).'">'.htmlspecialchars($str).'</a>';
523 * Creates a table of properties:
525 * @param array Array with properties for the current object path
526 * @param string Object path
527 * @param array Object tree
528 * @return string HTML content.
530 function printTable($table,$objString,$objTree) {
531 if (is_array($table['rows'])) {
539 <td><img src="clear.gif" width="175" height="1" alt="" /></td>
540 <td><img src="clear.gif" width="100" height="1" alt="" /></td>
541 <td><img src="clear.gif" width="400" height="1" alt="" /></td>
542 <td><img src="clear.gif" width="70" height="1" alt="" /></td>
545 <tr class="bgColor5">
546 <td><strong>Property:</strong></td>
547 <td><strong>Data type:</strong></td>
548 <td><strong>Description:</strong></td>
549 <td><strong>Default:</strong></td>
552 // Traverse the content of "rows":
553 foreach($table['rows'] as $row) {
556 $lP=t3lib_div
::trimExplode(chr(10),$row['property'],1);
558 while(list($k,$lStr)=each($lP)) {
559 $lP2[$k] = $this->linkProperty($lStr,$lStr,$objString,$row['datatype']);
561 $linkedProperties=implode('<hr />',$lP2);
564 $dataType = $row['datatype'];
566 // Generally "->[something]"
568 ereg('->[[:alnum:]_]*',$dataType,$reg);
569 if ($reg[0] && is_array($objTree[$reg[0]])) {
570 $dataType = str_replace($reg[0],'<a href="'.htmlspecialchars(t3lib_div
::linkThisScript(array('show'=>$objTree[$reg[0]][0]['uid'],'objString'=>$objString.'.'.$lP[0]))).'">'.htmlspecialchars($reg[0]).'</a>',$dataType);
574 if (!strstr($dataType,'->stdWrap') && strstr(strip_tags($dataType),'stdWrap')) {
575 // Potential problem can be that "stdWrap" is substituted inside another A-tag. So maybe we should even check if there is already a <A>-tag present and if so, not make a substitution?
576 $dataType = str_replace('stdWrap','<a href="'.htmlspecialchars(t3lib_div
::linkThisScript(array('show'=>$objTree['->stdWrap'][0]['uid'],'objString'=>$objString.'.'.$lP[0]))).'">stdWrap</a>',$dataType);
581 <tr class="bgColor4">
582 <td valign="top" class="bgColor4-20"><strong>'.$linkedProperties.'</strong></td>
583 <td valign="top">'.nl2br($dataType.' ').'</td>
584 <td valign="top">'.nl2br($row['description']).'</td>
585 <td valign="top">'.nl2br($row['default']).'</td>
594 TSconfig, attribute selector:
596 <table border="0" cellpadding="0" cellspacing="1" width="500" id="typo3-attributes">
597 '.implode('',$lines).'
603 * Creates a link on a property.
605 * @param string String to link
606 * @param string Property value.
607 * @param string Object path prefix to value
608 * @param string Data type
609 * @return string Linked $str
611 function linkProperty($str,$propertyName,$prefix,$datatype) {
614 // Setting preset value:
615 if (strstr($datatype,'boolean')) {
616 $propertyVal='1'; // preset "1" to boolean values.
619 // Adding mixer features; The plus icon:
620 if(!$this->onlyProperty
) {
621 $aOnClick = 'document.editform.mixer.value=unescape(\' '.rawurlencode($propertyName.'='.$propertyVal).'\')+\'\n\'+document.editform.mixer.value; return false;';
622 $out.= '<a href="#" onclick="'.htmlspecialchars($aOnClick).'">'.
623 '<img'.t3lib_iconWorks
::skinImg($this->doc
->backPath
,'gfx/plusbullet2.gif','width="18" height="16"').' title="'.$GLOBALS['LANG']->getLL('tsprop_addToList',1).'" align="top" alt="" />'.
625 $propertyName = $prefix.'.'.$propertyName;
629 $aOnClick = 'setValue(unescape(\''.rawurlencode($propertyName).'\'),unescape(\''.rawurlencode($propertyVal).'\')); return false;';
630 $out.= '<a href="#" onclick="'.htmlspecialchars($aOnClick).'">'.$str.'</a>';
637 // Include extension?
638 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE
]['XCLASS']['typo3/wizard_tsconfig.php']) {
639 include_once($TYPO3_CONF_VARS[TYPO3_MODE
]['XCLASS']['typo3/wizard_tsconfig.php']);
654 $SOBE = t3lib_div
::makeInstance('SC_wizard_tsconfig');
657 $SOBE->printContent();