00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 unset($MCONF);
00028 require_once('conf.php');
00029 require_once($BACK_PATH.'init.php');
00030 require_once($BACK_PATH.'template.php');
00031 require_once($BACK_PATH . 'sysext/em/mod1/class.em_unzip.php');
00032
00033 $LANG->includeLLFile('EXT:tsconfig_help/mod1/locallang.xml');
00034 $BE_USER->modAccess($MCONF,1);
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045 class tx_tsconfighelp_module1 extends t3lib_SCbase {
00046 var $pageinfo;
00047 var $objStringsPerExtension = array();
00048 var $allObjStrings = array();
00049
00050
00051
00052
00053
00054 function init() {
00055 global $BE_USER,$LANG,$BACK_PATH,$TCA_DESCR,$TCA,$CLIENT,$TYPO3_CONF_VARS;
00056 parent::init();
00057 }
00058
00059
00060
00061
00062
00063
00064 function menuConfig() {
00065 global $LANG;
00066 $this->MOD_MENU = array(
00067 'function' => array(
00068 '1' => $LANG->getLL('display')
00069 )
00070 );
00071
00072 if($GLOBALS['BE_USER']->user['admin']) {
00073 $this->MOD_MENU['function']['2'] = $LANG->getLL('rebuild');
00074 }
00075
00076 parent::menuConfig();
00077 }
00078
00079
00080
00081
00082
00083
00084 function main() {
00085 global $BE_USER,$LANG,$BACK_PATH,$TCA_DESCR,$TCA,$CLIENT,$TYPO3_CONF_VARS;
00086
00087
00088 $access = $BE_USER->check('modules', 'help_txtsconfighelpM1');
00089
00090
00091 $this->doc = t3lib_div::makeInstance('template');
00092 $this->doc->backPath = $BACK_PATH;
00093 $this->doc->setModuleTemplate('templates/tsconfig_help.html');
00094
00095 if ($access || $BE_USER->user['admin']) {
00096
00097 $this->doc->form = '<form action="" method="post">';
00098
00099
00100 $this->doc->JScode = '
00101 <script language="javascript" type="text/javascript">
00102 script_ended = 0;
00103 function jumpToUrl(URL) {
00104 document.location = URL;
00105 }
00106 </script>
00107 ';
00108 $this->doc->postCode = '
00109 <script language="javascript" type="text/javascript">
00110 script_ended = 1;
00111 if (top.fsMod) top.fsMod.recentIds["web"] = 0;
00112 </script>
00113 ';
00114
00115 $headerSection = $this->doc->getHeader('pages',$this->pageinfo,$this->pageinfo['_thePath']).'<br />'.$LANG->sL('LLL:EXT:lang/locallang_core.xml:labels.path').': '.t3lib_div::fixed_lgd_cs($this->pageinfo['_thePath'],-50);
00116
00117 $this->content .= $this->doc->header($LANG->getLL('title'));
00118 $this->content .= $this->doc->spacer(5);
00119
00120
00121 $this->moduleContent();
00122
00123 $this->content .= $this->doc->spacer(10);
00124
00125 $markers['FUNC_MENU'] = t3lib_BEfunc::getFuncMenu($this->id,'SET[function]',$this->MOD_SETTINGS['function'],$this->MOD_MENU['function']);
00126 } else {
00127 $this->content .= $this->doc->header($LANG->getLL('title'));
00128 $markers['FUNC_MENU'] = '';
00129 }
00130
00131 $docHeaderButtons = $this->getButtons();
00132 $markers['CSH'] = $docHeaderButtons['csh'];
00133 $markers['CONTENT'] = $this->content;
00134
00135
00136 $this->content = $this->doc->startPage($LANG->getLL('title'));
00137 $this->content.= $this->doc->moduleBody($this->pageinfo, $docHeaderButtons, $markers);
00138 $this->content.= $this->doc->endPage();
00139 $this->content = $this->doc->insertStylesAndJS($this->content);
00140 }
00141
00142
00143
00144
00145
00146
00147 function printContent() {
00148 echo $this->content;
00149 }
00150
00151
00152
00153
00154
00155
00156 protected function getButtons() {
00157 global $TCA, $LANG, $BACK_PATH, $BE_USER;
00158
00159 $buttons = array(
00160 'csh' => '',
00161 'shortcut' => '',
00162 );
00163
00164
00165
00166 if (($this->id && is_array($this->pageinfo)) || ($BE_USER->user['admin'] && !$this->id)) {
00167
00168 if ($BE_USER->mayMakeShortcut()) {
00169 $buttons['shortcut'] = $this->doc->makeShortcutIcon('id', implode(',', array_keys($this->MOD_MENU)), $this->MCONF['name']);
00170 }
00171 }
00172 return $buttons;
00173 }
00174
00175
00176
00177
00178
00179
00180 function moduleContent() {
00181 global $BACK_PATH, $TYPO3_LOADED_EXT, $LANG;
00182
00183 switch ((string)$this->MOD_SETTINGS['function']) {
00184 case 1:
00185 $content = '<div align="left"><strong>'.$LANG->getLL('referenceExplanation').'</strong></div>';
00186 $content .= '<p>'.$LANG->getLL('referenceExplanationDetailed').'</p><br />';
00187 $this->content .= $this->doc->section($LANG->getLL('displayReferences'),$content,0,1);
00188 $this->content .= '<a href="#" onclick="vHWin=window.open(\''.$BACK_PATH.'wizard_tsconfig.php?mode=tsref&P[formName]=editForm\',\'popUp\',\'height=500,width=780,status=0,menubar=0,scrollbars=1\');vHWin.focus();return false;" title="TSref reference">'.t3lib_iconWorks::getSpriteIcon('actions-system-typoscript-documentation-open').'TSREF</a><br />';
00189 $this->content .= '<a href="#" onclick="vHWin=window.open(\''.$BACK_PATH.'wizard_tsconfig.php?mode=beuser&P[formName]=editForm\',\'popUp\',\'height=500,width=780,status=0,menubar=0,scrollbars=1\');vHWin.focus();return false;" title="TSref reference">'.t3lib_iconWorks::getSpriteIcon('actions-system-typoscript-documentation-open').'USER TSCONFIG</a><br />';
00190 $this->content .= '<a href="#" onclick="vHWin=window.open(\''.$BACK_PATH.'wizard_tsconfig.php?mode=page&P[formName]=editForm\',\'popUp\',\'height=500,width=780,status=0,menubar=0,scrollbars=1\');vHWin.focus();return false;" title="TSref reference">'.t3lib_iconWorks::getSpriteIcon('actions-system-typoscript-documentation-open').'PAGE TSCONFIG</a><br />';
00191 break;
00192
00193 case 2:
00194 if ($GLOBALS['BE_USER']->user['admin']) {
00195 if (t3lib_div::_GP('_rebuild')) {
00196
00197 $this->purgeSQLContents();
00198
00199
00200 $extArray = $TYPO3_LOADED_EXT;
00201
00202 $content = '<div align="left"><strong>'.$LANG->getLL('loadedTSfrom').'</strong></div><br />';
00203
00204
00205 foreach ($extArray as $extName => $dummy) {
00206
00207 if (t3lib_extMgm::isLoaded($extName)) {
00208
00209 $manual = $this->getZIPFileContents(t3lib_extMgm::extPath($extName).'doc/manual.sxw', 'content.xml');
00210
00211
00212 if ($manual != '') {
00213
00214 $content .= '<p>Extension '.$extName.'...';
00215
00216
00217 $number = $this->loadExtensionManual($extName, $manual);
00218
00219
00220 $content .= $number.' '.$LANG->getLL('sections').' (<a href="'.t3lib_div::getIndpEnv('TYPO3_SITE_URL').TYPO3_mainDir.t3lib_extMgm::extRelPath($extName).'doc/manual.sxw">manual</a>)</p>';
00221 }
00222 } else {
00223
00224 die ("Fatal error : loaded extension not actually loaded? Please file a bug report at http://bugs.typo3.org!");
00225 }
00226 }
00227
00228 $this->content .= $this->doc->section($LANG->getLL('rebuildTS'),$content.'<br />',0,1);
00229
00230
00231
00232
00233 $duplicateWarnings = '';
00234 $emptyWarnings = '';
00235 foreach ($this->objStringsPerExtension as $obj_string => $extensions) {
00236 if (empty($obj_string)) {
00237 $emptyWarnings = '<p class="typo3-red">'.$LANG->getLL('warning_manualsWithoutMarkers');
00238 foreach ($extensions as $extensionKey => $counter) {
00239 $emptyWarnings .= ' '.$extensionKey.' ('.$counter.')<br />';
00240 }
00241 $emptyWarnings .= '</p><br />';
00242 } else {
00243 if (array_sum($extensions) > 1) {
00244 $duplicateWarnings .= $obj_string.':';
00245 foreach ($extensions as $extensionKey => $counter) {
00246 $duplicateWarnings .= ' '.$extensionKey.' ('.$counter.')';
00247 }
00248 $duplicateWarnings .= '<br />';
00249 }
00250 }
00251 }
00252 $warnings = $emptyWarnings;
00253 if (!empty($duplicateWarnings)) {
00254 $warnings .= '<p class="typo3-red">'.$LANG->getLL('warning_duplicateMarkers').'<br />'.$duplicateWarnings.'</p>';
00255 }
00256 if (!empty($warnings)) {
00257 $this->content .= $this->doc->section($LANG->getLL('updateWarnings'),'<div>'.$warnings.'</div>',0,1);
00258 }
00259 }
00260
00261 $content = '<p>'.$LANG->getLL('rebuildExplanation').'</p><br />';
00262 $content .= $LANG->getLL('rebuild').' <input type="submit" name="_rebuild" value="Rebuild" /><br />';
00263 $this->content .= $this->doc->section($LANG->getLL('rebuildTS'),$content,0,1);
00264 } else {
00265 $this->content .= '<p>'.$LANG->getLL('adminAccessOnly').'</p><br />';
00266 }
00267
00268
00269 break;
00270 }
00271 }
00272
00273
00274
00275
00276
00277
00278 function getZIPFileContents($ZIPfile, $filename) {
00279 if (file_exists($ZIPfile)) {
00280
00281 $tempPath = PATH_site.'typo3temp/tx_tsconfighelp_ziptemp/';
00282 t3lib_div::mkdir($tempPath);
00283
00284 $this->unzip($ZIPfile, $tempPath);
00285 $output = t3lib_div::getURL($tempPath.$filename);
00286
00287 $cmd = 'rm -r "'.$tempPath.'"';
00288 exec($cmd);
00289
00290 return $output;
00291 }
00292 }
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303 function unzip($file, $path) {
00304
00305
00306 $unzip = t3lib_div::makeInstance('em_unzip', $file);
00307 $ret = $unzip->extract(array('add_path'=>$path));
00308 return (is_array($ret));
00309 }
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324 function parseStyles($vals) {
00325 $currentStyleName = '';
00326 $style = array ();
00327
00328 foreach ($vals as $node) {
00329 switch ($node['type']) {
00330 case 'open':
00331 switch ($node['tag']) {
00332 case 'STYLE:STYLE':
00333 $currentStyleName = $node['attributes']['STYLE:NAME'];
00334
00335 if (array_key_exists('STYLE:PARENT-STYLE-NAME',$node['attributes'])) {
00336 $parentStyleName = $node['attributes']['STYLE:PARENT-STYLE-NAME'];
00337 $style[$currentStyleName]['parents'][] = $parentStyleName;
00338 } else {
00339 $parentStyleName = '';
00340 }
00341
00342 if (array_key_exists($parentStyleName, $style)) {
00343 $style[$currentStyleName] = $style[$parentStyleName];
00344 }
00345 break;
00346 }
00347 break;
00348
00349 case 'complete':
00350 switch ($node['tag']) {
00351 case 'STYLE:PROPERTIES':
00352 if (is_array($node['attributes']) && array_key_exists('FO:FONT-WEIGHT',$node['attributes'])) {
00353 $style[$currentStyleName]['font-weight'] = $node['attributes']['FO:FONT-WEIGHT'];
00354 }
00355 if (is_array($node['attributes']) && array_key_exists('FO:FONT-STYLE',$node['attributes'])) {
00356 $style[$currentStyleName]['font-style'] = $node['attributes']['FO:FONT-STYLE'];
00357 }
00358 break;
00359 }
00360 break;
00361
00362 case 'close':
00363 switch ($node['tag']) {
00364 case 'STYLE:STYLE':
00365 $currentStyleName = '';
00366 break;
00367 case 'STYLE:PROPERTIES':
00368 break;
00369 }
00370 break;
00371 }
00372 }
00373
00374 return $style;
00375 }
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389 function isStyleChildOf($child, $parent) {
00390 global $Styles;
00391
00392 if (!strcmp($child, $parent)) {
00393 return TRUE;
00394 }
00395
00396 if (is_array($Styles[$child])
00397 && array_key_exists('parents',$Styles[$child])
00398 && (array_search($parent, $Styles[$child]['parents']) !== FALSE)) {
00399 return TRUE;
00400 }
00401 return FALSE;
00402 }
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418
00419
00420
00421 function nextTSDefinitionTable($vals, $index, &$id) {
00422
00423 while ($id < count ($vals)) {
00424 $node = $vals[$id];
00425 if (!strcmp($node['type'], 'close') && !strcmp($node['tag'], 'TABLE:TABLE')) {
00426 $nextNode = $vals[$id+1];
00427 if (!strcmp($nextNode['tag'], 'TEXT:P') && $this->isStyleChildOf($nextNode['attributes']['TEXT:STYLE-NAME'], 'Table Contents')) {
00428
00429 $closeIndex = array_search($id, $index['TABLE:TABLE']);
00430
00431 $tableStart = $index['TABLE:TABLE'][$closeIndex-1];
00432
00433 return array($tableStart, $id++);
00434 }
00435 }
00436 $id = $id+1;
00437 }
00438 return array(FALSE, 0);
00439 }
00440
00441
00442
00443
00444
00445
00446
00447
00448 function styleTags($node) {
00449 global $Styles;
00450
00451 $styleName = $node['attributes']['TEXT:STYLE-NAME'];
00452 switch ($Styles[$styleName]['font-weight']) {
00453 case 'bold':
00454 $styleTags[] = 'b';
00455 break;
00456 }
00457 switch ($Styles[$styleName]['font-style']) {
00458 case 'italic':
00459 $styleTags[] = 'i';
00460 break;
00461 }
00462 if (!strcmp($styleName,'Table Contents/PRE')) {
00463
00464 }
00465 return $styleTags;
00466 }
00467
00468
00469
00470
00471
00472
00473
00474
00475 function styleHTML($style, $char) {
00476 $string = '';
00477 if (count ($style) > 0) {
00478 foreach ($style as $tag) {
00479 $string .= '<'.$char.$tag.'>';
00480 }
00481 }
00482 return $string;
00483 }
00484
00485
00486
00487
00488
00489
00490
00491
00492
00493
00494
00495 function HSCtext($text) {
00496 global $LANG;
00497
00498 if (strcmp($text,'')) {
00499 $cleantext = stripslashes(htmlspecialchars($text, ENT_QUOTES));
00500 return $LANG->csConvObj->utf8_to_entities($cleantext, $LANG->charSet);
00501 } else {
00502 return ' ';
00503 }
00504 }
00505
00506
00507
00508
00509
00510
00511
00512
00513
00514
00515
00516
00517
00518
00519
00520
00521
00522
00523 function parseTable($vals, $start, $end) {
00524 $sectionHeader = 0;
00525 $sectionRow = 0;
00526 $sectionCell = 0;
00527 $sectionP = 0;
00528
00529 $newLineRequired = '';
00530 $textStyle = array ();
00531
00532 $currentRow = 0;
00533 $currentCell = 0;
00534
00535 $rowID = 0;
00536 $cellID = 0;
00537
00538 $table = array();
00539
00540 $id = $start;
00541 while ($id < $end) {
00542 $node = $vals[$id];
00543
00544
00545 if ($sectionHeader < 0) die ('Malformed XML (header-rows)'.LF);
00546 if ($sectionRow < 0) die ('Malformed XML (row)'.LF);
00547 if ($sectionCell < 0) die ('Malformed XML (cell)'.LF);
00548 if ($sectionP < 0) die ('Malformed XML (P)'.LF);
00549
00550 switch ($node['type']) {
00551 case 'open':
00552 switch ($node['tag']) {
00553 case 'TABLE:TABLE-HEADER-ROWS':
00554 $sectionHeader++;
00555 break;
00556
00557 case 'TABLE:TABLE-ROW':
00558 if (!$sectionHeader) {
00559 $sectionRow++;
00560 if ($sectionRow == 1) {
00561 $rowID++;
00562 $cellID = 0;
00563 }
00564 }
00565 break;
00566
00567 case 'TABLE:TABLE-CELL':
00568 if (!$sectionHeader) {
00569 $sectionCell++;
00570 if ($sectionCell == 1) {
00571 $cellID++;
00572 $newLineRequired = '';
00573 }
00574 }
00575 break;
00576
00577 case 'TEXT:P':
00578 if ($sectionCell) {
00579 $sectionP++;
00580 $table[$rowID-1][$cellID-1] .= $this->styleHTML($this->styleTags($node),'') . $newLineRequired.$this->HSCtext($node['value']);
00581 $newLineRequired = '';
00582 $latestTEXTPopen = $node;
00583 }
00584 break;
00585 }
00586 break;
00587
00588 case 'complete':
00589 switch ($node['tag']) {
00590 case 'TEXT:P':
00591 if ($sectionCell) {
00592 $table[$rowID-1][$cellID-1] .= $this->styleHTML($this->styleTags($node),'') . $newLineRequired.$this->HSCtext($node['value']).$this->styleHTML($this->styleTags($node),'/');
00593 $newLineRequired = '<br>';
00594 }
00595 break;
00596
00597 case 'TEXT:SPAN':
00598 if ($sectionCell) {
00599 $table[$rowID-1][$cellID-1] .= $this->styleHTML($this->styleTags($node),'').$newLineRequired.$this->HSCtext($node['value']).$this->styleHTML($this->styleTags($node),'/');
00600 $newLineRequired = '';
00601 }
00602 break;
00603
00604 case 'TEXT:S':
00605 if ($sectionCell) {
00606 for ($i=0; $i<$node['attributes']['TEXT:C']; $i++) {
00607 $table[$rowID-1][$cellID-1] .= ' ';
00608 }
00609 $newLineRequired = '';
00610 }
00611 break;
00612 }
00613 break;
00614
00615 case 'cdata':
00616 switch ($node['tag']) {
00617 case 'TEXT:P':
00618 if ($sectionCell) {
00619 $table[$rowID-1][$cellID-1] .= $this->styleHTML($this->styleTags($node),'') . $newLineRequired.$this->HSCtext($node['value']).$this->styleHTML($this->styleTags($node),'/');
00620 $newLineRequired = '';
00621 }
00622 break;
00623 }
00624 break;
00625
00626 case 'close':
00627 switch ($node['tag']) {
00628 case 'TABLE:TABLE-HEADER-ROWS':
00629 $sectionHeader--;
00630 break;
00631
00632 case 'TABLE:TABLE-ROW':
00633 if (!$sectionHeader) {
00634 $sectionRow--;
00635 }
00636 break;
00637
00638 case 'TABLE:TABLE-CELL':
00639 if (!$sectionHeader) {
00640 $sectionCell--;
00641 }
00642 break;
00643
00644 case 'TEXT:P':
00645 $sectionP--;
00646 $newLineRequired = '<br>';
00647 $table[$rowID-1][$cellID-1] .= $this->styleHTML($this->styleTags($latestTEXTPopen),'/');
00648 break;
00649 }
00650 break;
00651 }
00652 $id = $id+1;
00653 }
00654 return $table;
00655 }
00656
00657
00658
00659
00660
00661
00662
00663
00664
00665 function dumpIntoSQL($extension, $table, $tableName) {
00666 global $uid;
00667
00668 foreach ($table as $row) {
00669 $tempArray = array();
00670 $tempArray['property'] = $row[0];
00671
00672 $tempArray['datatype'] = count($row)==2 ? ' ':$row[1];
00673 $tempArray['description'] = count($row)==2 ? $row[1]:$row[2];
00674 $tempArray['default'] = $row[3];
00675 $tempArray['column_count'] = count($row);
00676 $tempArray['is_propertyTable'] = 1;
00677 $tsHelpArray['rows'][] = $tempArray;
00678 }
00679 $appdata = serialize($tsHelpArray);
00680 $obj_string = trim($tableName, '[]');
00681
00682 if (isset($this->objStringsPerExtension[$obj_string])) {
00683 if (isset($this->objStringsPerExtension[$obj_string][$extension])) {
00684 $this->objStringsPerExtension[$obj_string][$extension]++;
00685 } else {
00686 $this->objStringsPerExtension[$obj_string][$extension] = 1;
00687 }
00688 } else {
00689 $this->objStringsPerExtension[$obj_string] = array();
00690 $this->objStringsPerExtension[$obj_string][$extension] = 1;
00691 }
00692
00693
00694
00695
00696 if (isset($this->allObjStrings[$obj_string])) {
00697 $this->allObjStrings[$obj_string]++;
00698 $obj_string .= ' ('.$this->allObjStrings[$obj_string].')';
00699 } else {
00700 $this->allObjStrings[$obj_string] = 0;
00701 }
00702 $md5hash = md5($obj_string);
00703 $description = '';
00704 $guide = hexdec(substr(md5($extension),6,6));
00705 $title = '';
00706
00707 $insertFields = array(
00708 'guide' => $guide,
00709 'md5hash' => $md5hash,
00710 'description' => $description,
00711 'obj_string' => $obj_string,
00712 'appdata' => $appdata,
00713 'title' => $title
00714 );
00715
00716 return $GLOBALS['TYPO3_DB']->exec_INSERTquery('static_tsconfig_help', $insertFields);
00717 }
00718
00719
00720
00721
00722
00723
00724
00725
00726 function purgeSQLContents($extension='') {
00727 $guide = hexdec(substr(md5($extension), 6, 6));
00728 if ($extension != '') {
00729 $GLOBALS['TYPO3_DB']->exec_DELETEquery('static_tsconfig_help', 'guide='.$guide);
00730 } else {
00731 $GLOBALS['TYPO3_DB']->exec_TRUNCATEquery('static_tsconfig_help');
00732 }
00733 }
00734
00735
00736
00737
00738
00739
00740
00741
00742
00743
00744 function loadExtensionManual($extension, $contents) {
00745 global $Styles;
00746
00747
00748 $parser = xml_parser_create();
00749 xml_parse_into_struct($parser, $contents, $vals, $index);
00750
00751 xml_parser_free($parser);
00752
00753
00754 $Styles = $this->parseStyles($vals);
00755
00756 $id = 0;
00757 $tableNumber = 0;
00758 do {
00759 list($tableStart, $tableEnd) = $this->nextTSDefinitionTable($vals, $index, $id);
00760 if ($tableStart !== FALSE) {
00761
00762 if (!strcmp($vals[$id]['type'], 'complete')) {
00763 $title = $vals[$id]['value'];
00764 } else {
00765 $watchTag = $vals[$id]['tag'];
00766 $title = '';
00767 while (strcmp($vals[$id]['tag'], $watchTag) || strcmp($vals[$id]['type'], 'close')) {
00768 $title .= $vals[$id++]['value'];
00769 }
00770 }
00771 $tableContents = $this->parseTable($vals, $tableStart, $tableEnd);
00772 $this->dumpIntoSQL($extension, $tableContents, $title);
00773 $tableNumber++;
00774 }
00775 } while ($tableStart !== FALSE);
00776 return $tableNumber;
00777 }
00778 }
00779
00780
00781 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/tsconfig_help/mod1/index.php']) {
00782 include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/tsconfig_help/mod1/index.php']);
00783 }
00784
00785
00786
00787
00788
00789 $SOBE = t3lib_div::makeInstance('tx_tsconfighelp_module1');
00790 $SOBE->init();
00791
00792
00793 foreach ($SOBE->include_once as $INC_FILE) include_once($INC_FILE);
00794
00795 $SOBE->main();
00796 $SOBE->printContent();
00797
00798 ?>