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
00077 require('init.php');
00078 require('template.php');
00079 $LANG->includeLLFile('EXT:lang/locallang_view_help.xml');
00080 require_once(PATH_t3lib.'class.t3lib_loadmodules.php');
00081 require_once(PATH_t3lib.'class.t3lib_parsehtml.php');
00082
00083
00091 class local_t3lib_parsehtml extends t3lib_parsehtml {
00092
00102 function processContent($value,$dir,$conf) {
00103 $value = $this->pObj->substituteGlossaryWords_htmlcleaner_callback($value);
00104
00105 return $value;
00106 }
00107 }
00108
00109
00110
00111
00112
00113
00114
00122 class SC_view_help {
00123 var $allowedHTML = '<strong><em><b><i>';
00124
00125
00126 var $limitAccess;
00127 var $table;
00128 var $field;
00129
00130
00131 var $tfID;
00132 var $back;
00133 var $renderALL;
00134
00135
00136 var $content;
00137 var $glossaryWords;
00138
00139
00140
00146 function init() {
00147 global $LANG, $TCA;
00148
00149
00150 $this->tfID = t3lib_div::_GP('tfID');
00151 $this->back = t3lib_div::_GP('back');
00152 $this->renderALL = t3lib_div::_GP('renderALL');
00153
00154
00155 list($this->table,$this->field) = explode('.',$this->tfID);
00156
00157
00158 $showAllToUser = t3lib_BEfunc::isModuleSetInTBE_MODULES('txllxmltranslateM1') && $GLOBALS['BE_USER']->check('modules','txllxmltranslateM1');
00159 $this->limitAccess = isset($TCA[$this->table]) ? !$showAllToUser : FALSE;
00160 }
00161
00167 function main() {
00168 global $BE_USER,$LANG,$TCA_DESCR,$TCA,$TBE_TEMPLATE;
00169
00170
00171 $TBE_TEMPLATE->docType = 'xhtml_trans';
00172 $TBE_TEMPLATE->divClass = 'typo3-view-help';
00173 $this->content.= $TBE_TEMPLATE->startPage($LANG->getLL('title'));
00174
00175 if ($this->field=='*') {
00176 $this->createGlossaryIndex();
00177 $this->content.= $this->render_Table($this->table);
00178 } elseif ($this->tfID) {
00179 $this->createGlossaryIndex();
00180 $this->content.= $this->render_Single($this->table,$this->field);
00181 } else {
00182 $this->content.= $this->render_TOC();
00183 }
00184
00185
00186 # $this->content.='<br /><form action=""><input type="submit" value="'.htmlspecialchars($LANG->getLL('close')).'" onclick="self.close(); return false;" /></form><br/>';
00187
00188
00189 $this->content.= '<br/>';
00190 $this->content.= $TBE_TEMPLATE->endPage();
00191 }
00192
00198 function printContent() {
00199 echo $this->content;
00200 }
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00221 function render_TOC() {
00222 global $TCA_DESCR,$TCA,$LANG,$BE_USER,$TBE_MODULES;
00223
00224
00225 $CSHkeys = array_flip(array_keys($TCA_DESCR));
00226 $TCAkeys = array_keys($TCA);
00227
00228 $outputSections = array();
00229 $tocArray = array();
00230
00231
00232
00233 $LANG->loadSingleTableDescription('xMOD_csh_corebe');
00234 $this->render_TOC_el('xMOD_csh_corebe', 'core', $outputSections, $tocArray, $CSHkeys);
00235
00236
00237 $loadModules = t3lib_div::makeInstance('t3lib_loadModules');
00238 $loadModules->load($TBE_MODULES);
00239 foreach($loadModules->modules as $mainMod => $info) {
00240 $cshKey = '_MOD_'.$mainMod;
00241 if ($CSHkeys[$cshKey]) {
00242 $LANG->loadSingleTableDescription($cshKey);
00243 $this->render_TOC_el($cshKey, 'modules', $outputSections, $tocArray, $CSHkeys);
00244 }
00245
00246 if (is_array($info['sub'])) {
00247 foreach($info['sub'] as $subMod => $subInfo) {
00248 $cshKey = '_MOD_'.$mainMod.'_'.$subMod;
00249 if ($CSHkeys[$cshKey]) {
00250 $LANG->loadSingleTableDescription($cshKey);
00251 $this->render_TOC_el($cshKey, 'modules', $outputSections, $tocArray, $CSHkeys);
00252 }
00253 }
00254 }
00255 }
00256
00257
00258 foreach($TCAkeys as $table) {
00259
00260 $LANG->loadSingleTableDescription($table);
00261 if (is_array($TCA_DESCR[$table]['columns']) && $BE_USER->check('tables_select',$table)) {
00262 $this->render_TOC_el($table, 'tables', $outputSections, $tocArray, $CSHkeys);
00263 }
00264 }
00265
00266
00267 foreach($CSHkeys as $cshKey => $value) {
00268 if (t3lib_div::isFirstPartOfStr($cshKey, 'xEXT_') && !isset($TCA[$cshKey])) {
00269 $LANG->loadSingleTableDescription($cshKey);
00270 $this->render_TOC_el($cshKey, 'extensions', $outputSections, $tocArray, $CSHkeys);
00271 }
00272 }
00273
00274
00275 foreach($CSHkeys as $cshKey => $value) {
00276 if (t3lib_div::isFirstPartOfStr($cshKey, 'xGLOSSARY_') && !isset($TCA[$cshKey])) {
00277 $LANG->loadSingleTableDescription($cshKey);
00278 $this->render_TOC_el($cshKey, 'glossary', $outputSections, $tocArray, $CSHkeys);
00279 }
00280 }
00281
00282
00283 foreach($CSHkeys as $cshKey => $value) {
00284 if (!t3lib_div::isFirstPartOfStr($cshKey, '_MOD_') && !isset($TCA[$cshKey])) {
00285 $LANG->loadSingleTableDescription($cshKey);
00286 $this->render_TOC_el($cshKey, 'other', $outputSections, $tocArray, $CSHkeys);
00287 }
00288 }
00289
00290
00291
00292 $output = '';
00293 $output.= '
00294
00295 <h1>'.$LANG->getLL('manual_title',1).'</h1>
00296 <p>'.t3lib_BEfunc::TYPO3_copyRightNotice().'</p>';
00297
00298 $output.= '
00299
00300 <h1>'.$LANG->getLL('introduction',1).'</h1>
00301 <p>'.$LANG->getLL('description',1).'</p>';
00302
00303 $output.= '
00304
00305 <h1>'.$LANG->getLL('TOC',1).'</h1>'.
00306 $this->render_TOC_makeTocList($tocArray);
00307
00308 if (!$this->renderALL) {
00309 $output.= '
00310 <br/>
00311 <p class="c-nav"><a href="view_help.php?renderALL=1">'.$LANG->getLL('full_manual',1).'</a></p>';
00312 }
00313
00314 if ($this->renderALL) {
00315 $output.= '
00316
00317 <h1>'.$LANG->getLL('full_manual_chapters',1).'</h1>'.
00318 implode('
00319
00320
00321 <!-- NEW SECTION: -->
00322 ',$outputSections);
00323 }
00324
00325 return $output;
00326 }
00327
00338 function render_TOC_el($table, $tocCat, &$outputSections, &$tocArray, &$CSHkeys) {
00339 global $LANG;
00340
00341 if ($this->renderALL) {
00342 $outputSections[$table] = $this->render_Table($table);
00343
00344 if ($outputSections[$table]) {
00345 $outputSections[$table] = '
00346
00347 <!-- New CSHkey/Table: '.$table.' -->
00348 <p class="c-nav"><a name="ANCHOR_'.$table.'" href="#">'.$LANG->getLL('to_top',1).'</a></p>
00349 <h2>'.$this->getTableFieldLabel($table).'</h2>
00350
00351 '.$outputSections[$table];
00352 $tocArray[$tocCat][$table] = '<a href="#ANCHOR_'.$table.'">'.$this->getTableFieldLabel($table).'</a>';
00353 } else {
00354 unset($outputSections[$table]);
00355 }
00356 } else {
00357 $tocArray[$tocCat][$table] = '<p><a href="view_help.php?tfID='.rawurlencode($table.'.*').'">'.$this->getTableFieldLabel($table).'</a></p>';
00358 }
00359
00360
00361 unset($CSHkeys[$table]);
00362 }
00363
00370 function render_TOC_makeTocList($tocArray) {
00371 global $LANG;
00372
00373
00374 $keys = explode(',', 'core,modules,tables,extensions,glossary,other');
00375
00376
00377 $output = '';
00378 foreach($keys as $tocKey) {
00379 if (is_array($tocArray[$tocKey])) {
00380 $output.='
00381 <li>'.$LANG->getLL('TOC_'.$tocKey,1).'
00382 <ul>
00383 <li>'.implode('</li>
00384 <li>',$tocArray[$tocKey]).'</li>
00385 </ul>
00386 </li>';
00387 }
00388 }
00389
00390
00391 $output = '
00392
00393 <!-- TOC: -->
00394 <div class="c-toc">
00395 <ul>
00396 '.$output.'
00397 </ul>
00398 </div>';
00399
00400 return $output;
00401 }
00402
00409 function render_Table($table) {
00410 global $BE_USER,$TCA_DESCR,$TCA,$LANG;
00411
00412 $output = '';
00413
00414
00415 t3lib_div::loadTCA($table);
00416
00417
00418 $LANG->loadSingleTableDescription($table);
00419
00420 if (is_array($TCA_DESCR[$table]['columns']) && (!$this->limitAccess || $BE_USER->check('tables_select',$table))) {
00421
00422 $parts = array();
00423 $parts[0] = '';
00424
00425
00426 reset($TCA_DESCR[$table]['columns']);
00427 while(list($field) = each($TCA_DESCR[$table]['columns'])) {
00428
00429 $fieldValue = isset($TCA[$table]) && strcmp($field,'') ? $TCA[$table]['columns'][$field] : array();
00430
00431 if (is_array($fieldValue) && (!$this->limitAccess || !$fieldValue['exclude'] || $BE_USER->check('non_exclude_fields',$table.':'.$field))) {
00432 if (!$field) {
00433 $parts[0] = $this->printItem($table,'',1);
00434 } else {
00435 $parts[] = $this->printItem($table,$field,1);
00436 }
00437 }
00438 }
00439
00440 if (!strcmp($parts,'')) unset($parts[0]);
00441 $output.= implode('<br />',$parts);
00442 }
00443
00444
00445 $output = $this->substituteGlossaryWords($output);
00446
00447
00448 if (!$this->renderALL) {
00449 $tocLink = '<p class="c-nav"><a href="view_help.php">'.$LANG->getLL('goToToc',1).'</a></p>';
00450
00451 $output =
00452 $tocLink.'
00453 <br/>'.
00454 $output.'
00455 <br />'.
00456 $tocLink;
00457 }
00458
00459 return $output;
00460 }
00461
00469 function render_Single($table,$field) {
00470 global $LANG, $TCA;
00471
00472 $output = '';
00473
00474
00475 $LANG->loadSingleTableDescription($table);
00476
00477
00478 $output.= $this->printItem($table,$field);
00479
00480
00481 $output = $this->substituteGlossaryWords($output);
00482
00483
00484 $getLLKey = $this->limitAccess ? 'fullDescription' : 'fullDescription_module';
00485 $output.= '<br />
00486 <p class="c-nav"><a href="view_help.php?tfID='.rawurlencode($table.'.*').'">'.$LANG->getLL($getLLKey,1).'</a></p>
00487 <p class="c-nav"><a href="view_help.php">'.$LANG->getLL('goToToc',1).'</a></p>';
00488
00489 return $output;
00490 }
00491
00492
00493
00494
00495
00496
00497
00498
00499
00500
00501
00502
00503
00504
00505
00506
00507
00515 function make_seeAlso($value,$anchorTable='') {
00516 global $TCA,$BE_USER,$TCA_DESCR;
00517
00518
00519 $items = split(',|'.chr(10),$value);
00520 $lines = array();
00521
00522 foreach($items as $val) {
00523 $val = trim($val);
00524 if ($val) {
00525 $iP = explode(':',$val);
00526 $iPUrl = t3lib_div::trimExplode('|',$val);
00527
00528 if (substr($iPUrl[1],0,4)=='http') {
00529 $lines[] = '<a href="'.htmlspecialchars($iPUrl[1]).'" target="_blank"><em>'.htmlspecialchars($iPUrl[0]).'</em></a>';
00530 } elseif (substr($iPUrl[1],0,5)=='FILE:') {
00531 $fileName = t3lib_div::getFileAbsFileName(substr($iPUrl[1],5),1,1);
00532 if ($fileName && @is_file($fileName)) {
00533 $fileName = '../'.substr($fileName,strlen(PATH_site));
00534 $lines[] = '<a href="'.htmlspecialchars($fileName).'" target="_blank"><em>'.htmlspecialchars($iPUrl[0]).'</em></a>';
00535 }
00536 } else {
00537
00538 t3lib_div::loadTCA($iP[0]);
00539
00540 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])))))) {
00541
00542
00543 #$LANG->loadSingleTableDescription($iP[0]);
00544 if (isset($TCA_DESCR[$iP[0]])) {
00545
00546 $href = ($this->renderALL || ($anchorTable && $iP[0]==$anchorTable) ? '#'.implode('.',$iP) : 'view_help.php?tfID='.rawurlencode(implode('.',$iP)).'&back='.$this->tfID);
00547 $label = $this->getTableFieldLabel($iP[0],$iP[1],' / ');
00548 $lines[] = '<a href="'.htmlspecialchars($href).'">'.htmlspecialchars($label).'</a>';
00549 }
00550 }
00551 }
00552 }
00553 }
00554 return implode('<br />',$lines);
00555 }
00556
00564 function printImage($images,$descr) {
00565 $code = '';
00566
00567 $imgArray = t3lib_div::trimExplode(',', $images, 1);
00568 if (count($imgArray)) {
00569 $descrArray = explode(chr(10),$descr,count($imgArray));
00570 #debug($descrArray);
00571 foreach($imgArray as $k => $image) {
00572 $descr = $descrArray[$k];
00573
00574 $absImagePath = t3lib_div::getFileAbsFileName($image,1,1);
00575 if ($absImagePath && @is_file($absImagePath)) {
00576 $imgFile = substr($absImagePath,strlen(PATH_site));
00577 $imgInfo = @getimagesize($absImagePath);
00578 if (is_array($imgInfo)) {
00579 $imgFile = '../'.$imgFile;
00580 $code.= '<br /><img src="'.$imgFile.'" '.$imgInfo[3].' class="c-inlineimg" alt="" /><br />
00581 ';
00582 $code.= '<p><em>'.$GLOBALS['LANG']->hscAndCharConv($descr,1).'</em></p>
00583 ';
00584 } else $code.= '<div style="background-color: red; border: 1px solid black; color: white;">NOT AN IMAGE: '.$imgFile.'</div>';
00585 } else $code.= '<div style="background-color: red; border: 1px solid black; color: white;">IMAGE FILE NOT FOUND: '.$image.'</div>';
00586 }
00587 }
00588
00589 return $code;
00590 }
00591
00599 function headerLine($str,$type=0) {
00600 switch($type) {
00601 case 1:
00602 $str='<h3>'.htmlspecialchars($str).'</h3>
00603 ';
00604 break;
00605 case 0:
00606 $str='<h4 class="uppercase">'.htmlspecialchars($str).'</h4>
00607 ';
00608 break;
00609 }
00610
00611 return $str;
00612 }
00613
00620 function prepareContent($str) {
00621 $str = $GLOBALS['LANG']->hscAndCharConv($str,0);
00622 return '<p>'.nl2br(trim(strip_tags($str,$this->allowedHTML))).'</p>
00623 ';
00624 }
00625
00635 function printItem($table,$field,$anchors=0) {
00636 global $TCA_DESCR, $LANG, $TCA, $BE_USER;
00637
00638
00639 t3lib_div::loadTCA($table);
00640
00641 if ($table && (!$field || is_array($TCA_DESCR[$table]['columns'][$field]))) {
00642
00643 $seeAlsoRes = $this->make_seeAlso($TCA_DESCR[$table]['columns'][$field]['seeAlso'],$anchors?$table:'');
00644
00645
00646 $out= '<a name="'.$table.'.'.$field.'"></a>
00647 '.
00648 $this->headerLine($this->getTableFieldLabel($table,$field),1).
00649 $this->prepareContent($TCA_DESCR[$table]['columns'][$field]['description']).
00650 ($TCA_DESCR[$table]['columns'][$field]['details'] ? $this->headerLine($LANG->getLL('details').':').$this->prepareContent($TCA_DESCR[$table]['columns'][$field]['details']) : '').
00651 ($TCA_DESCR[$table]['columns'][$field]['syntax'] ? $this->headerLine($LANG->getLL('syntax').':').$this->prepareContent($TCA_DESCR[$table]['columns'][$field]['syntax']) : '').
00652 ($TCA_DESCR[$table]['columns'][$field]['image'] ? $this->printImage($TCA_DESCR[$table]['columns'][$field]['image'],$TCA_DESCR[$table]['columns'][$field]['image_descr']) : '').
00653 ($TCA_DESCR[$table]['columns'][$field]['seeAlso'] && $seeAlsoRes ? $this->headerLine($LANG->getLL('seeAlso').':').'<p>'.$seeAlsoRes.'</p>' : '').
00654 ($this->back ? '<br /><p><a href="'.htmlspecialchars('view_help.php?tfID='.rawurlencode($this->back)).'" class="typo3-goBack">'.htmlspecialchars($LANG->getLL('goBack')).'</a></p>' : '').
00655 '<br />';
00656 }
00657 return $out;
00658 }
00659
00668 function getTableFieldNames($table,$field) {
00669 global $TCA, $TCA_DESCR, $LANG;
00670
00671 $LANG->loadSingleTableDescription($table);
00672
00673 $tableName = is_array($TCA_DESCR[$table]['columns']['']) && $TCA_DESCR[$table]['columns']['']['alttitle'] ?
00674 $TCA_DESCR[$table]['columns']['']['alttitle'] :
00675 (isset($TCA[$table]) ? $TCA[$table]['ctrl']['title'] : ereg_replace('^_MOD_','',$table));
00676 $fieldName = is_array($TCA_DESCR[$table]['columns'][$field]) && $TCA_DESCR[$table]['columns'][$field]['alttitle'] ?
00677 $TCA_DESCR[$table]['columns'][$field]['alttitle'] :
00678 (isset($TCA[$table])&&isset($TCA[$table]['columns'][$field]) ? $TCA[$table]['columns'][$field]['label'] : $field);
00679 return array($tableName,$fieldName);
00680 }
00681
00691 function getTableFieldLabel($table,$field='',$mergeToken=': ') {
00692 global $LANG;
00693
00694
00695 list($tableName,$fieldName) = $this->getTableFieldNames($table,$field);
00696
00697
00698 $labelStr = $LANG->sL($tableName).
00699 ($field ? $mergeToken.ereg_replace(':$','', trim($LANG->sL($fieldName))):'');
00700
00701 return $labelStr;
00702 }
00703
00704
00705
00706
00707
00708
00709
00710
00711
00712
00713
00714
00715
00716
00717
00718
00719
00726 function createGlossaryIndex() {
00727 global $TCA_DESCR,$TCA,$LANG;
00728
00729
00730 $hash = md5('typo3/view_help.php:glossary');
00731 list($this->glossaryWords,$this->substWords) = unserialize(t3lib_BEfunc::getHash($hash));
00732
00733
00734 if (!is_array($this->glossaryWords)) {
00735
00736
00737 $this->glossaryWords = array();
00738 $this->substWords = array();
00739 $CSHkeys = array_flip(array_keys($TCA_DESCR));
00740
00741
00742 foreach($CSHkeys as $cshKey => $value) {
00743 if (t3lib_div::isFirstPartOfStr($cshKey, 'xGLOSSARY_') && !isset($TCA[$cshKey])) {
00744 $LANG->loadSingleTableDescription($cshKey);
00745
00746 if (is_array($TCA_DESCR[$cshKey]['columns'])) {
00747
00748
00749 reset($TCA_DESCR[$cshKey]['columns']);
00750 while(list($field,$data) = each($TCA_DESCR[$cshKey]['columns'])) {
00751 if ($field) {
00752 $this->glossaryWords[$cshKey.'.'.$field] = array(
00753 'title' => trim($data['alttitle'] ? $data['alttitle'] : $cshKey),
00754 'description' => str_replace('%22','%23%23%23', rawurlencode($data['description'])),
00755 );
00756 }
00757 }
00758 }
00759 }
00760 }
00761
00762
00763 foreach($this->glossaryWords as $key => $value) {
00764 $word = strtolower($value['title']);
00765
00766 if ($word!=='') {
00767 $this->substWords[$word] = $value;
00768 $this->substWords[$word]['key'] = $key;
00769 }
00770 }
00771
00772 krsort($this->substWords);
00773
00774 t3lib_BEfunc::storeHash($hash,serialize(array($this->glossaryWords,$this->substWords)),'Glossary');
00775 }
00776 }
00777
00785 function substituteGlossaryWords($code) {
00786 $htmlParser = t3lib_div::makeInstance('local_t3lib_parsehtml');
00787 $htmlParser->pObj = &$this;
00788 $code = $htmlParser->HTMLcleaner($code, array(), 1);
00789
00790 return $code;
00791 }
00792
00801 function substituteGlossaryWords_htmlcleaner_callback($code) {
00802 if (is_array($this->substWords) && count($this->substWords) && strlen(trim($code))) {
00803
00804
00805 foreach($this->substWords as $wordKey => $wordSet) {
00806
00807 $parts = preg_split('/( |[\(])('.quoteMeta($wordSet['title']).')([\.\!\)\?\:\,]+| )/i', ' '.$code.' ', 2, PREG_SPLIT_DELIM_CAPTURE);
00808 if (count($parts) == 5) {
00809 $parts[2] = '<a class="glossary-term" href="'.htmlspecialchars('view_help.php?tfID='.rawurlencode($wordSet['key']).'&back='.$this->tfID).'" title="'.rawurlencode(htmlspecialchars(t3lib_div::fixed_lgd_cs(rawurldecode($wordSet['description']),80))).'">'.
00810 htmlspecialchars($parts[2]).
00811 '</a>';
00812 $code = substr(implode('',$parts),1,-1);
00813
00814
00815 unset($this->substWords[$wordKey]);
00816 }
00817 }
00818 $code = str_replace('###', '"',rawurldecode($code));
00819 }
00820
00821 return $code;
00822 }
00823
00824 }
00825
00826
00827
00828 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['typo3/view_help.php']) {
00829 include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['typo3/view_help.php']);
00830 }
00831
00832
00833
00834
00835
00836
00837
00838 $SOBE = t3lib_div::makeInstance('SC_view_help');
00839 $SOBE->init();
00840 $SOBE->main();
00841 $SOBE->printContent();
00842 ?>