*** empty log message ***
[Packages/TYPO3.CMS.git] / typo3 / view_help.php
1 <?php
2 /***************************************************************
3 * Copyright notice
4 *
5 * (c) 1999-2004 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 * Document for viewing the online help texts, also known as TCA_DESCR.
29 * See Inside TYPO3 for details.
30 *
31 * $Id$
32 * Revised for TYPO3 3.7 5/2004 by Kasper Skaarhoj
33 * XHTML-trans compliant
34 *
35 * @author Kasper Skaarhoj <kasperYYYY@typo3.com>
36 */
37 /**
38 * [CLASS/FUNCTION INDEX of SCRIPT]
39 *
40 *
41 *
42 * 88: class SC_view_help
43 * 111: function init()
44 * 131: function main()
45 * 160: function printContent()
46 *
47 * SECTION: Rendering main modes
48 * 183: function render_TOC()
49 * 292: function render_TOC_el($table, $tocCat, &$outputSections, &$tocArray, &$CSHkeys)
50 * 324: function render_TOC_makeTocList($tocArray)
51 * 363: function render_Table($table)
52 * 420: function render_Single($table,$field)
53 *
54 * SECTION: Rendering CSH items
55 * 463: function make_seeAlso($value,$anchorTable='')
56 * 512: function printImage($images,$descr)
57 * 547: function headerLine($str,$type=0)
58 * 568: function prepareContent($str)
59 * 583: function printItem($table,$field,$anchors=0)
60 * 616: function getTableFieldNames($table,$field)
61 * 639: function getTableFieldLabel($table,$field='',$mergeToken=': ')
62 *
63 * TOTAL FUNCTIONS: 15
64 * (This index is automatically created/updated by the extension "extdeveval")
65 *
66 */
67
68 require('init.php');
69 require('template.php');
70 $LANG->includeLLFile('EXT:lang/locallang_view_help.xml');
71 require_once(PATH_t3lib.'class.t3lib_loadmodules.php');
72
73
74
75
76
77
78
79
80
81 /**
82 * Script Class for rendering the Context Sensitive Help documents, either the single display in the small pop-up window or the full-table view in the larger window.
83 *
84 * @author Kasper Skaarhoj <kasperYYYY@typo3.com>
85 * @package TYPO3
86 * @subpackage core
87 */
88 class SC_view_help {
89 var $allowedHTML = '<strong><em><b><i>';
90
91 // For these vars, see init()
92 var $limitAccess; // If set access to fields and tables is checked. Should be done for true database tables.
93 var $table; // The "table" key
94 var $field; // The "field" key
95
96 // Internal, static: GPvar:
97 var $tfID; // Table/FIeld id.
98 var $back; // Back (previous tfID)
99 var $renderALL; // If set, then in TOC mode the FULL manual will be printed as well!
100
101 // Internal, dynamic:
102 var $content; // Content accumulation.
103
104
105
106 /**
107 * Initialize the class for various input etc.
108 *
109 * @return void
110 */
111 function init() {
112 global $LANG, $TCA;
113
114 // Setting GPvars:
115 $this->tfID = t3lib_div::_GP('tfID');
116 $this->back = t3lib_div::_GP('back');
117 $this->renderALL = t3lib_div::_GP('renderALL');
118
119 // Set internal table/field to the parts of "tfID" incoming var.
120 list($this->table,$this->field) = explode('.',$this->tfID);
121
122 // limitAccess is checked if the $this->table really IS a table.
123 $this->limitAccess = isset($TCA[$this->table]) ? TRUE : FALSE;
124 }
125
126 /**
127 * Main function, rendering the display
128 *
129 * @return void
130 */
131 function main() {
132 global $BE_USER,$LANG,$TCA_DESCR,$TCA,$TBE_TEMPLATE;
133
134 // Start HTML output accumulation:
135 $TBE_TEMPLATE->docType = 'xhtml_trans';
136 $TBE_TEMPLATE->divClass = 'typo3-view-help';
137 $this->content.= $TBE_TEMPLATE->startPage($LANG->getLL('title'));
138
139 if ($this->field=='*') { // If ALL fields is supposed to be shown:
140 $this->content.= $this->render_Table($this->table);
141 } elseif ($this->tfID) { // ... otherwise show only single field:
142 $this->content.= $this->render_Single($this->table,$this->field);
143 } else { // Render Table Of Contents if nothing else:
144 $this->content.= $this->render_TOC();
145 }
146
147 // Print close-button:
148 # $this->content.='<br /><form action=""><input type="submit" value="'.htmlspecialchars($LANG->getLL('close')).'" onclick="self.close(); return false;" /></form><br/>';
149
150 // End page:
151 $this->content.= '<br/>';
152 $this->content.= $TBE_TEMPLATE->endPage();
153 }
154
155 /**
156 * Outputting the accumulated content to screen
157 *
158 * @return void
159 */
160 function printContent() {
161 echo $this->content;
162 }
163
164
165
166
167
168
169
170
171
172 /************************************
173 *
174 * Rendering main modes
175 *
176 ************************************/
177
178 /**
179 * Creates Table Of Contents and possibly "Full Manual" mode if selected.
180 *
181 * @return string HTML content
182 */
183 function render_TOC() {
184 global $TCA_DESCR,$TCA,$LANG,$BE_USER,$TBE_MODULES;
185
186 // Initialize:
187 $CSHkeys = array_flip(array_keys($TCA_DESCR));
188 $TCAkeys = array_keys($TCA);
189
190 $outputSections = array();
191 $tocArray = array();
192
193
194 // TYPO3 Core Features:
195 $LANG->loadSingleTableDescription('xMOD_csh_corebe');
196 $this->render_TOC_el('xMOD_csh_corebe', 'core', $outputSections, $tocArray, $CSHkeys);
197
198 // Backend Modules:
199 $loadModules = t3lib_div::makeInstance('t3lib_loadModules');
200 $loadModules->load($TBE_MODULES);
201 foreach($loadModules->modules as $mainMod => $info) {
202 $cshKey = '_MOD_'.$mainMod;
203 if ($CSHkeys[$cshKey]) {
204 $LANG->loadSingleTableDescription($cshKey);
205 $this->render_TOC_el($cshKey, 'modules', $outputSections, $tocArray, $CSHkeys);
206 }
207
208 if (is_array($info['sub'])) {
209 foreach($info['sub'] as $subMod => $subInfo) {
210 $cshKey = '_MOD_'.$mainMod.'_'.$subMod;
211 if ($CSHkeys[$cshKey]) {
212 $LANG->loadSingleTableDescription($cshKey);
213 $this->render_TOC_el($cshKey, 'modules', $outputSections, $tocArray, $CSHkeys);
214 }
215 }
216 }
217 }
218
219 // Database Tables:
220 foreach($TCAkeys as $table) {
221 // Load descriptions for table $table
222 $LANG->loadSingleTableDescription($table);
223 if (is_array($TCA_DESCR[$table]['columns']) && $BE_USER->check('tables_select',$table)) {
224 $this->render_TOC_el($table, 'tables', $outputSections, $tocArray, $CSHkeys);
225 }
226 }
227
228 // Extensions
229 foreach($CSHkeys as $cshKey => $value) {
230 if (t3lib_div::isFirstPartOfStr($cshKey, 'xEXT_') && !isset($TCA[$cshKey])) {
231 $LANG->loadSingleTableDescription($cshKey);
232 $this->render_TOC_el($cshKey, 'extensions', $outputSections, $tocArray, $CSHkeys);
233 }
234 }
235
236 // Other:
237 foreach($CSHkeys as $cshKey => $value) {
238 if (!t3lib_div::isFirstPartOfStr($cshKey, '_MOD_') && !isset($TCA[$cshKey])) {
239 $LANG->loadSingleTableDescription($cshKey);
240 $this->render_TOC_el($cshKey, 'other', $outputSections, $tocArray, $CSHkeys);
241 }
242 }
243
244
245 // COMPILE output:
246 $output = '';
247 $output.= '
248
249 <h1>'.$LANG->getLL('manual_title',1).'</h1>
250 <p>'.t3lib_BEfunc::TYPO3_copyRightNotice().'</p>';
251
252 $output.= '
253
254 <h1>'.$LANG->getLL('introduction',1).'</h1>
255 <p>'.$LANG->getLL('description',1).'</p>';
256
257 $output.= '
258
259 <h1>'.$LANG->getLL('TOC',1).'</h1>'.
260 $this->render_TOC_makeTocList($tocArray);
261
262 if (!$this->renderALL) {
263 $output.= '
264 <br/>
265 <p class="c-nav"><a href="view_help.php?renderALL=1">'.$LANG->getLL('full_manual',1).'</a></p>';
266 }
267
268 if ($this->renderALL) {
269 $output.= '
270
271 <h1>'.$LANG->getLL('full_manual_chapters',1).'</h1>'.
272 implode('
273
274
275 <!-- NEW SECTION: -->
276 ',$outputSections);
277 }
278
279 return $output;
280 }
281
282 /**
283 * Creates a TOC list element and renders corresponding HELP content if "renderALL" mode is set.
284 *
285 * @param string CSH key / Table name
286 * @param string TOC category keyword: "core", "modules", "tables", "other"
287 * @param array Array for accumulation of rendered HELP Content (in "renderALL" mode). Passed by reference!
288 * @param array TOC array; Here TOC index elements are created. Passed by reference!
289 * @param array CSH keys array. Every item rendered will be unset in this array so finally we can see what CSH keys are not processed yet. Passed by reference!
290 * @return void
291 */
292 function render_TOC_el($table, $tocCat, &$outputSections, &$tocArray, &$CSHkeys) {
293 global $LANG;
294
295 if ($this->renderALL) { // Render full manual right here!
296 $outputSections[$table] = $this->render_Table($table);
297
298 if ($outputSections[$table]) {
299 $outputSections[$table] = '
300
301 <!-- New CSHkey/Table: '.$table.' -->
302 <p class="c-nav"><a name="ANCHOR_'.$table.'" href="#">'.$LANG->getLL('to_top',1).'</a></p>
303 <h2>'.$this->getTableFieldLabel($table).'</h2>
304
305 '.$outputSections[$table];
306 $tocArray[$tocCat][$table] = '<a href="#ANCHOR_'.$table.'">'.$this->getTableFieldLabel($table).'</a>';
307 } else {
308 unset($outputSections[$table]);
309 }
310 } else { // Only TOC:
311 $tocArray[$tocCat][$table] = '<p><a href="view_help.php?tfID='.rawurlencode($table.'.*').'">'.$this->getTableFieldLabel($table).'</a></p>';
312 }
313
314 // Unset CSH key:
315 unset($CSHkeys[$table]);
316 }
317
318 /**
319 * Renders the TOC index as a HTML bullet list from TOC array
320 *
321 * @param array ToC Array.
322 * @return string HTML bullet list for index.
323 */
324 function render_TOC_makeTocList($tocArray) {
325 global $LANG;
326
327 // The Various manual sections:
328 $keys = explode(',', 'core,modules,tables,extensions,other');
329
330 // Create TOC bullet list:
331 $output = '';
332 foreach($keys as $tocKey) {
333 if (is_array($tocArray[$tocKey])) {
334 $output.='
335 <li>'.$LANG->getLL('TOC_'.$tocKey,1).'
336 <ul>
337 <li>'.implode('</li>
338 <li>',$tocArray[$tocKey]).'</li>
339 </ul>
340 </li>';
341 }
342 }
343
344 // Compile TOC:
345 $output = '
346
347 <!-- TOC: -->
348 <div class="c-toc">
349 <ul>
350 '.$output.'
351 </ul>
352 </div>';
353
354 return $output;
355 }
356
357 /**
358 * Render CSH for a full cshKey/table
359 *
360 * @param string CSH key / table name
361 * @return string HTML output
362 */
363 function render_Table($table) {
364 global $BE_USER,$TCA_DESCR,$TCA,$LANG;
365
366 $output = '';
367
368 // Load table TCA
369 t3lib_div::loadTCA($table);
370
371 // Load descriptions for table $table
372 $LANG->loadSingleTableDescription($table);
373
374 if (is_array($TCA_DESCR[$table]['columns']) && (!$this->limitAccess || $BE_USER->check('tables_select',$table))) {
375 // Initialize variables:
376 $parts = array();
377 $parts[0] = ''; // Reserved for header of table
378
379 // Traverse table columns as listed in TCA_DESCR
380 reset($TCA_DESCR[$table]['columns']);
381 while(list($field) = each($TCA_DESCR[$table]['columns'])) {
382
383 $fieldValue = isset($TCA[$table]) && strcmp($field,'') ? $TCA[$table]['columns'][$field] : array();
384
385 if (is_array($fieldValue) && (!$this->limitAccess || !$fieldValue['exclude'] || $BE_USER->check('non_exclude_fields',$table.':'.$field))) {
386 if (!$field) {
387 $parts[0] = $this->printItem($table,'',1); // Header
388 } else {
389 $parts[] = $this->printItem($table,$field,1); // Field
390 }
391 }
392 }
393
394 if (!strcmp($parts,'')) unset($parts[0]);
395 $output.= implode('<br />',$parts);
396 }
397
398 // TOC link:
399 if (!$this->renderALL) {
400 $tocLink = '<p class="c-nav"><a href="view_help.php">'.$LANG->getLL('goToToc',1).'</a></p>';
401
402 $output =
403 $tocLink.'
404 <br/>'.
405 $output.'
406 <br />'.
407 $tocLink;
408 }
409
410 return $output;
411 }
412
413 /**
414 * Renders CSH for a single field.
415 *
416 * @param string CSH key / table name
417 * @param string Sub key / field name
418 * @return string HTML output
419 */
420 function render_Single($table,$field) {
421 global $LANG, $TCA;
422
423 $output = '';
424
425 // Load descriptions for table $table
426 $LANG->loadSingleTableDescription($table);
427
428 // Render single item:
429 $output.= $this->printItem($table,$field);
430
431 // Link to Full table description and TOC:
432 $getLLKey = $this->limitAccess ? 'fullDescription' : 'fullDescription_module';
433 $output.= '<br />
434 <p class="c-nav"><a href="view_help.php?tfID='.rawurlencode($table.'.*').'">'.$LANG->getLL($getLLKey,1).'</a></p>
435 <p class="c-nav"><a href="view_help.php">'.$LANG->getLL('goToToc',1).'</a></p>';
436
437 return $output;
438 }
439
440
441
442
443
444
445
446
447
448
449
450 /************************************
451 *
452 * Rendering CSH items
453 *
454 ************************************/
455
456 /**
457 * Make seeAlso links from $value
458 *
459 * @param string See-also input codes
460 * @param string If $anchorTable is set to a tablename, then references to this table will be made as anchors, not URLs.
461 * @return string See-also links HTML
462 */
463 function make_seeAlso($value,$anchorTable='') {
464 global $TCA,$BE_USER,$TCA_DESCR;
465
466 // Split references by comma, vert.line or linebreak
467 $items = split(',|'.chr(10),$value);
468 $lines = array();
469
470 foreach($items as $val) {
471 $val = trim($val);
472 if ($val) {
473 $iP = explode(':',$val);
474 $iPUrl = t3lib_div::trimExplode('|',$val);
475 // URL reference:
476 if (substr($iPUrl[1],0,4)=='http') {
477 $lines[] = '<a href="'.htmlspecialchars($iPUrl[1]).'" target="_blank"><em>'.htmlspecialchars($iPUrl[0]).'</em></a>';
478 } elseif (substr($iPUrl[1],0,5)=='FILE:') {
479 $fileName = t3lib_div::getFileAbsFileName(substr($iPUrl[1],5),1,1);
480 if ($fileName && @is_file($fileName)) {
481 $fileName = '../'.substr($fileName,strlen(PATH_site));
482 $lines[] = '<a href="'.htmlspecialchars($fileName).'" target="_blank"><em>'.htmlspecialchars($iPUrl[0]).'</em></a>';
483 }
484 } else {
485 // "table" reference
486 t3lib_div::loadTCA($iP[0]);
487
488 if (!isset($TCA[$iP[0]]) || ((!$iP[1] || is_array($TCA[$iP[0]]['columns'][$iP[1]])) && (!$this->limitAccess || ($BE_USER->check('tables_select',$iP[0]) && (!$iP[1] || !$TCA[$iP[0]]['columns'][$iP[1]]['exclude'] || $BE_USER->check('non_exclude_fields',$iP[0].':'.$iP[1])))))) { // Checking read access:
489
490 // Load table descriptions:
491 #$LANG->loadSingleTableDescription($iP[0]);
492 if (isset($TCA_DESCR[$iP[0]])) {
493 // Make see-also link:
494 $href = ($this->renderALL || ($anchorTable && $iP[0]==$anchorTable) ? '#'.implode('.',$iP) : 'view_help.php?tfID='.rawurlencode(implode('.',$iP)).'&back='.$this->tfID);
495 $label = $this->getTableFieldLabel($iP[0],$iP[1],' / ');
496 $lines[] = '<a href="'.htmlspecialchars($href).'">'.htmlspecialchars($label).'</a>';
497 }
498 }
499 }
500 }
501 }
502 return implode('<br />',$lines);
503 }
504
505 /**
506 * Will return an image tag with description in italics.
507 *
508 * @param string Image file reference (list of)
509 * @param string Description string (divided for each image by line break)
510 * @return string Image HTML codes
511 */
512 function printImage($images,$descr) {
513 $code = '';
514 // Splitting:
515 $imgArray = t3lib_div::trimExplode(',', $images, 1);
516 if (count($imgArray)) {
517 $descrArray = explode(chr(10),$descr,count($imgArray));
518 #debug($descrArray);
519 foreach($imgArray as $k => $image) {
520 $descr = $descrArray[$k];
521
522 $absImagePath = t3lib_div::getFileAbsFileName($image,1,1);
523 if ($absImagePath && @is_file($absImagePath)) {
524 $imgFile = substr($absImagePath,strlen(PATH_site));
525 $imgInfo = @getimagesize($absImagePath);
526 if (is_array($imgInfo)) {
527 $imgFile = '../'.$imgFile;
528 $code.= '<br /><img src="'.$imgFile.'" '.$imgInfo[3].' class="c-inlineimg" alt="" /><br />
529 ';
530 $code.= '<p><em>'.$GLOBALS['LANG']->hscAndCharConv($descr,1).'</em></p>
531 ';
532 } else $code.= '<div style="background-color: red; border: 1px solid black; color: white;">NOT AN IMAGE: '.$imgFile.'</div>';
533 } else $code.= '<div style="background-color: red; border: 1px solid black; color: white;">IMAGE FILE NOT FOUND: '.$image.'</div>';
534 }
535 }
536
537 return $code;
538 }
539
540 /**
541 * Returns header HTML content
542 *
543 * @param string Header text
544 * @param string Header type (1, 0)
545 * @return string The HTML for the header.
546 */
547 function headerLine($str,$type=0) {
548 switch($type) {
549 case 1:
550 $str='<h3>'.htmlspecialchars($str).'</h3>
551 ';
552 break;
553 case 0:
554 $str='<h4 class="uppercase">'.htmlspecialchars($str).'</h4>
555 ';
556 break;
557 }
558
559 return $str;
560 }
561
562 /**
563 * Returns prepared content
564 *
565 * @param string Content to format.
566 * @return string Formatted content.
567 */
568 function prepareContent($str) {
569 $str = $GLOBALS['LANG']->hscAndCharConv($str,0);
570 return '<p>'.nl2br(trim(strip_tags($str,$this->allowedHTML))).'</p>
571 ';
572 }
573
574 /**
575 * Prints a single $table/$field information piece
576 * If $anchors is set, then seeAlso references to the same table will be page-anchors, not links.
577 *
578 * @param string Table name
579 * @param string Field name
580 * @param boolean If anchors is to be shown.
581 * @return string HTML content
582 */
583 function printItem($table,$field,$anchors=0) {
584 global $TCA_DESCR, $LANG, $TCA, $BE_USER;
585
586 // Load full table definition in $TCA
587 t3lib_div::loadTCA($table);
588
589 if ($table && (!$field || is_array($TCA_DESCR[$table]['columns'][$field]))) {
590 // Make seeAlso references.
591 $seeAlsoRes = $this->make_seeAlso($TCA_DESCR[$table]['columns'][$field]['seeAlso'],$anchors?$table:'');
592
593 // Making item:
594 $out= '<a name="'.$table.'.'.$field.'"></a>
595 '.
596 $this->headerLine($this->getTableFieldLabel($table,$field),1).
597 $this->prepareContent($TCA_DESCR[$table]['columns'][$field]['description']).
598 ($TCA_DESCR[$table]['columns'][$field]['details'] ? $this->headerLine($LANG->getLL('details').':').$this->prepareContent($TCA_DESCR[$table]['columns'][$field]['details']) : '').
599 ($TCA_DESCR[$table]['columns'][$field]['syntax'] ? $this->headerLine($LANG->getLL('syntax').':').$this->prepareContent($TCA_DESCR[$table]['columns'][$field]['syntax']) : '').
600 ($TCA_DESCR[$table]['columns'][$field]['image'] ? $this->printImage($TCA_DESCR[$table]['columns'][$field]['image'],$TCA_DESCR[$table]['columns'][$field]['image_descr']) : '').
601 ($TCA_DESCR[$table]['columns'][$field]['seeAlso'] && $seeAlsoRes ? $this->headerLine($LANG->getLL('seeAlso').':').'<p>'.$seeAlsoRes.'</p>' : '').
602 ($this->back ? '<br /><p><a href="'.htmlspecialchars('view_help.php?tfID='.rawurlencode($this->back)).'" class="typo3-goBack">'.htmlspecialchars($LANG->getLL('goBack')).'</a></p>' : '').
603 '<br />';
604 }
605 return $out;
606 }
607
608 /**
609 * Returns labels for $table and $field.
610 * If $table is "_MOD_" prefixed, the part after "_MOD_" is returned (non-tables, fx. modules)
611 *
612 * @param string Table name
613 * @param string Field name
614 * @return array Table and field labels in a numeric array
615 */
616 function getTableFieldNames($table,$field) {
617 global $TCA, $TCA_DESCR, $LANG;
618
619 $LANG->loadSingleTableDescription($table);
620
621 $tableName = is_array($TCA_DESCR[$table]['columns']['']) && $TCA_DESCR[$table]['columns']['']['alttitle'] ?
622 $TCA_DESCR[$table]['columns']['']['alttitle'] :
623 (isset($TCA[$table]) ? $TCA[$table]['ctrl']['title'] : ereg_replace('^_MOD_','',$table));
624 $fieldName = is_array($TCA_DESCR[$table]['columns'][$field]) && $TCA_DESCR[$table]['columns'][$field]['alttitle'] ?
625 $TCA_DESCR[$table]['columns'][$field]['alttitle'] :
626 (isset($TCA[$table])&&isset($TCA[$table]['columns'][$field]) ? $TCA[$table]['columns'][$field]['label'] : $field);
627 return array($tableName,$fieldName);
628 }
629
630 /**
631 * Returns composite label for table/field
632 *
633 * @param string Table name
634 * @param string Field name
635 * @param string Token to merge the two strings with.
636 * @return array Table and field labels in a numeric array
637 * @see getTableFieldNames()
638 */
639 function getTableFieldLabel($table,$field='',$mergeToken=': ') {
640 global $LANG;
641
642 // Get table / field parts:
643 list($tableName,$fieldName) = $this->getTableFieldNames($table,$field);
644
645 // Create label:
646 $labelStr = $LANG->sL($tableName).
647 ($field ? $mergeToken.ereg_replace(':$','', trim($LANG->sL($fieldName))):'');
648
649 return $labelStr;
650 }
651 }
652
653
654 // Include extension?
655 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['typo3/view_help.php']) {
656 include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['typo3/view_help.php']);
657 }
658
659
660
661
662
663
664 // Make instance:
665 $SOBE = t3lib_div::makeInstance('SC_view_help');
666 $SOBE->init();
667 $SOBE->main();
668 $SOBE->printContent();
669 ?>