Documentation TYPO3 par Ameos |
00001 <?php 00002 /*************************************************************** 00003 * Copyright notice 00004 * 00005 * (c) 1999-2005 Kasper Skaarhoj (kasperYYYY@typo3.com) 00006 * All rights reserved 00007 * 00008 * This script is part of the TYPO3 project. The TYPO3 project is 00009 * free software; you can redistribute it and/or modify 00010 * it under the terms of the GNU General Public License as published by 00011 * the Free Software Foundation; either version 2 of the License, or 00012 * (at your option) any later version. 00013 * 00014 * The GNU General Public License can be found at 00015 * http://www.gnu.org/copyleft/gpl.html. 00016 * A copy is found in the textfile GPL.txt and important notices to the license 00017 * from the author is found in LICENSE.txt distributed with these scripts. 00018 * 00019 * 00020 * This script is distributed in the hope that it will be useful, 00021 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00022 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00023 * GNU General Public License for more details. 00024 * 00025 * This copyright notice MUST APPEAR in all copies of the script! 00026 ***************************************************************/ 00121 class tslib_pibase { 00122 00123 // Reserved variables: 00124 var $cObj; // The backReference to the mother cObj object set at call time 00125 var $prefixId; // Should be same as classname of the plugin, used for CSS classes, variables 00126 var $scriptRelPath; // Path to the plugin class script relative to extension directory, eg. 'pi1/class.tx_newfaq_pi1.php' 00127 var $extKey; // Extension key. 00128 var $piVars = Array ( // This is the incoming array by name $this->prefixId merged between POST and GET, POST taking precedence. Eg. if the class name is 'tx_myext' then the content of this array will be whatever comes into &tx_myext[...]=... 00129 'pointer' => '', // Used as a pointer for lists 00130 'mode' => '', // List mode 00131 'sword' => '', // Search word 00132 'sort' => '', // [Sorting column]:[ASC=0/DESC=1] 00133 ); 00134 var $internal = Array( // Used internally for general storage of values between methods 00135 'res_count' => 0, // Total query count 00136 'results_at_a_time' => 20, // pi_list_browseresults(): Show number of results at a time 00137 'maxPages' => 10, // pi_list_browseresults(): Max number of 'Page 1 - Page 2 - ...' in the list browser 00138 'currentRow' => Array(), // Current result row 00139 'currentTable' => '', // Current table 00140 ); 00141 00142 var $LOCAL_LANG = Array(); // Local Language content 00143 var $LOCAL_LANG_charset = Array(); // Local Language content charset for individual labels (overriding) 00144 var $LOCAL_LANG_loaded = 0; // Flag that tells if the locallang file has been fetch (or tried to be fetched) already. 00145 var $LLkey='default'; // Pointer to the language to use. 00146 var $altLLkey=''; // Pointer to alternative fall-back language to use. 00147 var $LLtestPrefix=''; // You can set this during development to some value that makes it easy for you to spot all labels that ARe delivered by the getLL function. 00148 var $LLtestPrefixAlt=''; // Save as LLtestPrefix, but additional prefix for the alternative value in getLL() function calls 00149 00150 var $pi_isOnlyFields = 'mode,pointer'; 00151 var $pi_alwaysPrev = 0; 00152 var $pi_lowerThan = 5; 00153 var $pi_moreParams=''; 00154 var $pi_listFields='*'; 00155 00156 var $pi_autoCacheFields=array(); 00157 var $pi_autoCacheEn=0; 00158 00159 var $pi_USER_INT_obj = FALSE; // If set, then links are 1) not using cHash and 2) not allowing pages to be cached. (Set this for all USER_INT plugins!) 00160 var $pi_checkCHash = FALSE; // If set, then caching is disabled if piVars are incoming while no cHash was set (Set this for all USER plugins!) 00161 00168 var $conf = Array(); 00169 00170 // internal, don't mess with... 00171 var $pi_EPtemp_cObj; 00172 var $pi_tmpPageId=0; 00173 00174 00175 00176 00177 00178 00179 00180 00181 00182 00183 00184 00185 00186 00187 00188 00189 00190 /*************************** 00191 * 00192 * Init functions 00193 * 00194 **************************/ 00195 00203 function tslib_pibase() { 00204 00205 // Setting piVars: 00206 if ($this->prefixId) { 00207 $this->piVars = t3lib_div::GParrayMerged($this->prefixId); 00208 00209 // cHash mode check 00210 // IMPORTANT FOR CACHED PLUGINS (USER cObject): As soon as you generate cached plugin output which depends on parameters (eg. seeing the details of a news item) you MUST check if a cHash value is set. 00211 // Background: The function call will check if a cHash parameter was sent with the URL because only if it was the page may be cached. If no cHash was found the function will simply disable caching to avoid unpredictable caching behaviour. In any case your plugin can generate the expected output and the only risk is that the content may not be cached. A missing cHash value is considered a mistake in the URL resulting from either URL manipulation, "realurl" "grayzones" etc. The problem is rare (more frequent with "realurl") but when it occurs it is very puzzling! 00212 if ($this->pi_checkCHash && count($this->piVars)) { 00213 $GLOBALS['TSFE']->reqCHash(); 00214 } 00215 } 00216 if ($GLOBALS['TSFE']->config['config']['language']) { 00217 $this->LLkey = $GLOBALS['TSFE']->config['config']['language']; 00218 if ($GLOBALS['TSFE']->config['config']['language_alt']) { 00219 $this->altLLkey = $GLOBALS['TSFE']->config['config']['language_alt']; 00220 } 00221 } 00222 } 00223 00229 function pi_setPiVarDefaults() { 00230 if (is_array($this->conf['_DEFAULT_PI_VARS.'])) { 00231 $this->piVars = t3lib_div::array_merge_recursive_overrule($this->conf['_DEFAULT_PI_VARS.'],is_array($this->piVars)?$this->piVars:array()); 00232 } 00233 } 00234 00235 00236 00237 00238 00239 00240 00241 00242 00243 00244 00245 00246 00247 /*************************** 00248 * 00249 * Link functions 00250 * 00251 **************************/ 00252 00266 function pi_getPageLink($id,$target='',$urlParameters=array()) { 00267 return $this->cObj->getTypoLink_URL($id,$urlParameters,$target); // ?$target:$GLOBALS['TSFE']->sPre 00268 } 00269 00282 function pi_linkToPage($str,$id,$target='',$urlParameters=array()) { 00283 return $this->cObj->getTypoLink($str,$id,$urlParameters,$target); // ?$target:$GLOBALS['TSFE']->sPre 00284 } 00285 00297 function pi_linkTP($str,$urlParameters=array(),$cache=0,$altPageId=0) { 00298 $conf=array(); 00299 $conf['useCacheHash'] = $this->pi_USER_INT_obj ? 0 : $cache; 00300 $conf['no_cache'] = $this->pi_USER_INT_obj ? 0 : !$cache; 00301 $conf['parameter'] = $altPageId ? $altPageId : ($this->pi_tmpPageId ? $this->pi_tmpPageId : $GLOBALS['TSFE']->id); 00302 $conf['additionalParams'] = $this->conf['parent.']['addParams'].t3lib_div::implodeArrayForUrl('',$urlParameters,'',1).$this->pi_moreParams; 00303 00304 return $this->cObj->typoLink($str, $conf); 00305 } 00306 00320 function pi_linkTP_keepPIvars($str,$overrulePIvars=array(),$cache=0,$clearAnyway=0,$altPageId=0) { 00321 if (is_array($this->piVars) && is_array($overrulePIvars) && !$clearAnyway) { 00322 $piVars = $this->piVars; 00323 unset($piVars['DATA']); 00324 $overrulePIvars = t3lib_div::array_merge_recursive_overrule($piVars,$overrulePIvars); 00325 if ($this->pi_autoCacheEn) { 00326 $cache = $this->pi_autoCache($overrulePIvars); 00327 } 00328 } 00329 $res = $this->pi_linkTP($str,Array($this->prefixId=>$overrulePIvars),$cache,$altPageId); 00330 return $res; 00331 } 00332 00344 function pi_linkTP_keepPIvars_url($overrulePIvars=array(),$cache=0,$clearAnyway=0,$altPageId=0) { 00345 $this->pi_linkTP_keepPIvars('|',$overrulePIvars,$cache,$clearAnyway,$altPageId); 00346 return $this->cObj->lastTypoLinkUrl; 00347 } 00348 00362 function pi_list_linkSingle($str,$uid,$cache=FALSE,$mergeArr=array(),$urlOnly=FALSE,$altPageId=0) { 00363 if ($this->prefixId) { 00364 if ($cache) { 00365 $overrulePIvars=$uid?array('showUid'=>$uid):Array(); 00366 $overrulePIvars=array_merge($overrulePIvars,(array)$mergeArr); 00367 $str = $this->pi_linkTP($str,Array($this->prefixId=>$overrulePIvars),$cache,$altPageId); 00368 } else { 00369 $overrulePIvars=array('showUid'=>$uid?$uid:''); 00370 $overrulePIvars=array_merge($overrulePIvars,(array)$mergeArr); 00371 $str = $this->pi_linkTP_keepPIvars($str,$overrulePIvars,$cache,0,$altPageId); 00372 } 00373 00374 // If urlOnly flag, return only URL as it has recently be generated. 00375 if ($urlOnly) { 00376 $str = $this->cObj->lastTypoLinkUrl; 00377 } 00378 } 00379 return $str; 00380 } 00381 00390 function pi_openAtagHrefInJSwindow($str,$winName='',$winParams='width=670,height=500,status=0,menubar=0,scrollbars=1,resizable=1') { 00391 if (eregi('(.*)(<a[^>]*>)(.*)',$str,$match)) { 00392 $aTagContent = t3lib_div::get_tag_attributes($match[2]); 00393 $match[2]='<a href="#" onclick="'. 00394 htmlspecialchars('vHWin=window.open(\''.$GLOBALS['TSFE']->baseUrlWrap($aTagContent['href']).'\',\''.($winName?$winName:md5($aTagContent['href'])).'\',\''.$winParams.'\');vHWin.focus();return false;'). 00395 '">'; 00396 $str=$match[1].$match[2].$match[3]; 00397 } 00398 return $str; 00399 } 00400 00401 00402 00403 00404 00405 00406 00407 00408 00409 00410 00411 00412 00413 00414 /*************************** 00415 * 00416 * Functions for listing, browsing, searching etc. 00417 * 00418 **************************/ 00419 00443 function pi_list_browseresults($showResultCount=1, $tableParams='', $wrapArr=array(), $pointerName='pointer', $hscText=TRUE) { 00444 00445 // example $wrapArr-array how it could be traversed from an extension 00446 /* $wrapArr = array( 00447 'browseBoxWrap' => '<div class="browseBoxWrap">|</div>', 00448 'showResultsWrap' => '<div class="showResultsWrap">|</div>', 00449 'browseLinksWrap' => '<div class="browseLinksWrap">|</div>', 00450 'showResultsNumbersWrap' => '<span class="showResultsNumbersWrap">|</span>', 00451 'disabledLinkWrap' => '<span class="disabledLinkWrap">|</span>', 00452 'inactiveLinkWrap' => '<span class="inactiveLinkWrap">|</span>', 00453 'activeLinkWrap' => '<span class="activeLinkWrap">|</span>' 00454 ); */ 00455 00456 // Initializing variables: 00457 $pointer = intval($this->piVars[$pointerName]); 00458 $count = intval($this->internal['res_count']); 00459 $results_at_a_time = t3lib_div::intInRange($this->internal['results_at_a_time'],1,1000); 00460 $totalPages = ceil($count/$results_at_a_time); 00461 $maxPages = t3lib_div::intInRange($this->internal['maxPages'],1,100); 00462 $pi_isOnlyFields = $this->pi_isOnlyFields($this->pi_isOnlyFields); 00463 00464 // $showResultCount determines how the results of the pagerowser will be shown. 00465 // If set to 0: only the result-browser will be shown 00466 // 1: (default) the text "Displaying results..." and the result-browser will be shown. 00467 // 2: only the text "Displaying results..." will be shown 00468 $showResultCount = intval($showResultCount); 00469 00470 // if this is set, two links named "<< First" and "LAST >>" will be shown and point to the very first or last page. 00471 $showFirstLast = $this->internal['showFirstLast']; 00472 00473 // if this has a value the "previous" button is always visible (will be forced if "showFirstLast" is set) 00474 $alwaysPrev = $showFirstLast?1:$this->pi_alwaysPrev; 00475 00476 if (isset($this->internal['pagefloat'])) { 00477 if (strtoupper($this->internal['pagefloat']) == 'CENTER') { 00478 $pagefloat = ceil(($maxPages - 1)/2); 00479 } else { 00480 // pagefloat set as integer. 0 = left, value >= $this->internal['maxPages'] = right 00481 $pagefloat = t3lib_div::intInRange($this->internal['pagefloat'],-1,$maxPages-1); 00482 } 00483 } else { 00484 $pagefloat = -1; // pagefloat disabled 00485 } 00486 00487 // default values for "traditional" wrapping with a table. Can be overwritten by vars from $wrapArr 00488 $wrapper['disabledLinkWrap'] = '<td nowrap="nowrap"><p>|</p></td>'; 00489 $wrapper['inactiveLinkWrap'] = '<td nowrap="nowrap"><p>|</p></td>'; 00490 $wrapper['activeLinkWrap'] = '<td'.$this->pi_classParam('browsebox-SCell').' nowrap="nowrap"><p>|</p></td>'; 00491 $wrapper['browseLinksWrap'] = trim('<table '.$tableParams).'><tr>|</tr></table>'; 00492 $wrapper['showResultsWrap'] = '<p>|</p>'; 00493 $wrapper['browseBoxWrap'] = ' 00494 <!-- 00495 List browsing box: 00496 --> 00497 <div '.$this->pi_classParam('browsebox').'> 00498 | 00499 </div>'; 00500 00501 // now overwrite all entries in $wrapper which are also in $wrapArr 00502 $wrapper = array_merge($wrapper,$wrapArr); 00503 00504 if ($showResultCount != 2) { //show pagebrowser 00505 if ($pagefloat > -1) { 00506 $lastPage = min($totalPages,max($pointer+1 + $pagefloat,$maxPages)); 00507 $firstPage = max(0,$lastPage-$maxPages); 00508 } else { 00509 $firstPage = 0; 00510 $lastPage = t3lib_div::intInRange($totalPages,1,$maxPages); 00511 } 00512 $links=array(); 00513 00514 // Make browse-table/links: 00515 if ($showFirstLast) { // Link to first page 00516 if ($pointer>0) { 00517 $links[]=$this->cObj->wrap($this->pi_linkTP_keepPIvars($this->pi_getLL('pi_list_browseresults_first','<< First',$hscText),array($pointerName => null),$pi_isOnlyFields),$wrapper['inactiveLinkWrap']); 00518 } else { 00519 $links[]=$this->cObj->wrap($this->pi_getLL('pi_list_browseresults_first','<< First',$hscText),$wrapper['disabledLinkWrap']); 00520 } 00521 } 00522 if ($alwaysPrev>=0) { // Link to previous page 00523 if ($pointer>0) { 00524 $links[]=$this->cObj->wrap($this->pi_linkTP_keepPIvars($this->pi_getLL('pi_list_browseresults_prev','< Previous',$hscText),array($pointerName => ($pointer-1?$pointer-1:'')),$pi_isOnlyFields),$wrapper['inactiveLinkWrap']); 00525 } elseif ($alwaysPrev) { 00526 $links[]=$this->cObj->wrap($this->pi_getLL('pi_list_browseresults_prev','< Previous',$hscText),$wrapper['disabledLinkWrap']); 00527 } 00528 } 00529 for($a=$firstPage;$a<$lastPage;$a++) { // Links to pages 00530 if ($this->internal['showRange']) { 00531 $pageText = (($a*$results_at_a_time)+1).'-'.min($count,(($a+1)*$results_at_a_time)); 00532 } else { 00533 $pageText = trim($this->pi_getLL('pi_list_browseresults_page','Page',$hscText).' '.($a+1)); 00534 } 00535 if ($pointer == $a) { // current page 00536 if ($this->internal['dontLinkActivePage']) { 00537 $links[] = $this->cObj->wrap($pageText,$wrapper['activeLinkWrap']); 00538 } else { 00539 $links[] = $this->cObj->wrap($this->pi_linkTP_keepPIvars($pageText,array($pointerName => ($a?$a:'')),$pi_isOnlyFields),$wrapper['activeLinkWrap']); 00540 } 00541 } else { 00542 $links[] = $this->cObj->wrap($this->pi_linkTP_keepPIvars($pageText,array($pointerName => ($a?$a:'')),$pi_isOnlyFields),$wrapper['inactiveLinkWrap']); 00543 } 00544 } 00545 if ($pointer<$totalPages-1 || $showFirstLast) { 00546 if ($pointer==$totalPages-1) { // Link to next page 00547 $links[]=$this->cObj->wrap($this->pi_getLL('pi_list_browseresults_next','Next >',$hscText),$wrapper['disabledLinkWrap']); 00548 } else { 00549 $links[]=$this->cObj->wrap($this->pi_linkTP_keepPIvars($this->pi_getLL('pi_list_browseresults_next','Next >',$hscText),array($pointerName => $pointer+1),$pi_isOnlyFields),$wrapper['inactiveLinkWrap']); 00550 } 00551 } 00552 if ($showFirstLast) { // Link to last page 00553 if ($pointer<$totalPages-1) { 00554 $links[]=$this->cObj->wrap($this->pi_linkTP_keepPIvars($this->pi_getLL('pi_list_browseresults_last','Last >>',$hscText),array($pointerName => $totalPages-1),$pi_isOnlyFields),$wrapper['inactiveLinkWrap']); 00555 } else { 00556 $links[]=$this->cObj->wrap($this->pi_getLL('pi_list_browseresults_last','Last >>',$hscText),$wrapper['disabledLinkWrap']); 00557 } 00558 } 00559 $theLinks = $this->cObj->wrap(implode(chr(10),$links),$wrapper['browseLinksWrap']); 00560 } else { 00561 $theLinks = ''; 00562 } 00563 00564 $pR1 = $pointer*$results_at_a_time+1; 00565 $pR2 = $pointer*$results_at_a_time+$results_at_a_time; 00566 00567 if ($showResultCount) { 00568 if ($wrapper['showResultsNumbersWrap']) { 00569 // this will render the resultcount in a more flexible way using markers (new in TYPO3 3.8.0). 00570 // the formatting string is expected to hold template markers (see function header). Example: 'Displaying results ###FROM### to ###TO### out of ###OUT_OF###' 00571 00572 $markerArray['###FROM###'] = $this->cObj->wrap($this->internal['res_count'] > 0 ? $pR1 : 0,$wrapper['showResultsNumbersWrap']); 00573 $markerArray['###TO###'] = $this->cObj->wrap(min($this->internal['res_count'],$pR2),$wrapper['showResultsNumbersWrap']); 00574 $markerArray['###OUT_OF###'] = $this->cObj->wrap($this->internal['res_count'],$wrapper['showResultsNumbersWrap']); 00575 $markerArray['###FROM_TO###'] = $this->cObj->wrap(($this->internal['res_count'] > 0 ? $pR1 : 0).' '.$this->pi_getLL('pi_list_browseresults_to','to').' '.min($this->internal['res_count'],$pR2),$wrapper['showResultsNumbersWrap']); 00576 $markerArray['###CURRENT_PAGE###'] = $this->cObj->wrap($pointer+1,$wrapper['showResultsNumbersWrap']); 00577 $markerArray['###TOTAL_PAGES###'] = $this->cObj->wrap($totalPages,$wrapper['showResultsNumbersWrap']); 00578 // substitute markers 00579 $resultCountMsg = $this->cObj->substituteMarkerArray($this->pi_getLL('pi_list_browseresults_displays','Displaying results ###FROM### to ###TO### out of ###OUT_OF###'),$markerArray); 00580 } else { 00581 // render the resultcount in the "traditional" way using sprintf 00582 $resultCountMsg = sprintf( 00583 str_replace('###SPAN_BEGIN###','<span'.$this->pi_classParam('browsebox-strong').'>',$this->pi_getLL('pi_list_browseresults_displays','Displaying results ###SPAN_BEGIN###%s to %s</span> out of ###SPAN_BEGIN###%s</span>')), 00584 $count > 0 ? $pR1 : 0, 00585 min($count,$pR2), 00586 $count); 00587 } 00588 $resultCountMsg = $this->cObj->wrap($resultCountMsg,$wrapper['showResultsWrap']); 00589 } else { 00590 $resultCountMsg = ''; 00591 } 00592 00593 $sTables = $this->cObj->wrap($resultCountMsg.$theLinks,$wrapper['browseBoxWrap']); 00594 00595 return $sTables; 00596 } 00597 00605 function pi_list_searchBox($tableParams='') { 00606 // Search box design: 00607 $sTables = ' 00608 00609 <!-- 00610 List search box: 00611 --> 00612 <div'.$this->pi_classParam('searchbox').'> 00613 <form action="'.htmlspecialchars(t3lib_div::getIndpEnv('REQUEST_URI')).'" method="post" style="margin: 0 0 0 0;"> 00614 <'.trim('table '.$tableParams).'> 00615 <tr> 00616 <td><input type="text" name="'.$this->prefixId.'[sword]" value="'.htmlspecialchars($this->piVars['sword']).'"'.$this->pi_classParam('searchbox-sword').' /></td> 00617 <td><input type="submit" value="'.$this->pi_getLL('pi_list_searchBox_search','Search',TRUE).'"'.$this->pi_classParam('searchbox-button').' />'. 00618 '<input type="hidden" name="no_cache" value="1" />'. 00619 '<input type="hidden" name="'.$this->prefixId.'[pointer]" value="" />'. 00620 '</td> 00621 </tr> 00622 </table> 00623 </form> 00624 </div>'; 00625 00626 return $sTables; 00627 } 00628 00636 function pi_list_modeSelector($items=array(),$tableParams='') { 00637 $cells=array(); 00638 reset($items); 00639 while(list($k,$v)=each($items)) { 00640 $cells[]=' 00641 <td'.($this->piVars['mode']==$k?$this->pi_classParam('modeSelector-SCell'):'').'><p>'. 00642 $this->pi_linkTP_keepPIvars(htmlspecialchars($v),array('mode'=>$k),$this->pi_isOnlyFields($this->pi_isOnlyFields)). 00643 '</p></td>'; 00644 } 00645 00646 $sTables = ' 00647 00648 <!-- 00649 Mode selector (menu for list): 00650 --> 00651 <div'.$this->pi_classParam('modeSelector').'> 00652 <'.trim('table '.$tableParams).'> 00653 <tr> 00654 '.implode('',$cells).' 00655 </tr> 00656 </table> 00657 </div>'; 00658 00659 return $sTables; 00660 } 00661 00674 function pi_list_makelist($res,$tableParams='') { 00675 // Make list table header: 00676 $tRows=array(); 00677 $this->internal['currentRow']=''; 00678 $tRows[] = $this->pi_list_header(); 00679 00680 // Make list table rows 00681 $c=0; 00682 while($this->internal['currentRow'] = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) { 00683 $tRows[] = $this->pi_list_row($c); 00684 $c++; 00685 } 00686 00687 $out = ' 00688 00689 <!-- 00690 Record list: 00691 --> 00692 <div'.$this->pi_classParam('listrow').'> 00693 <'.trim('table '.$tableParams).'> 00694 '.implode('',$tRows).' 00695 </table> 00696 </div>'; 00697 00698 return $out; 00699 } 00700 00709 function pi_list_row($c) { 00710 // Dummy 00711 return '<tr'.($c%2 ? $this->pi_classParam('listrow-odd') : '').'><td><p>[dummy row]</p></td></tr>'; 00712 } 00713 00721 function pi_list_header() { 00722 return '<tr'.$this->pi_classParam('listrow-header').'><td><p>[dummy header row]</p></td></tr>'; 00723 } 00724 00725 00726 00727 00728 00729 00730 00731 00732 00733 00734 00735 00736 00737 00738 00739 /*************************** 00740 * 00741 * Stylesheet, CSS 00742 * 00743 **************************/ 00744 00745 00752 function pi_getClassName($class) { 00753 return str_replace('_','-',$this->prefixId).($this->prefixId?'-':'').$class; 00754 } 00755 00765 function pi_classParam($class, $addClasses='') { 00766 $output = ''; 00767 foreach (t3lib_div::trimExplode(',',$class) as $v) { 00768 $output.= ' '.$this->pi_getClassName($v); 00769 } 00770 foreach (t3lib_div::trimExplode(',',$addClasses) as $v) { 00771 $output.= ' '.$v; 00772 } 00773 return ' class="'.trim($output).'"'; 00774 } 00775 00786 function pi_setClassStyle($class,$data,$selector='') { 00787 $GLOBALS['TSFE']->setCSS($this->pi_getClassName($class).($selector?' '.$selector:''),'.'.$this->pi_getClassName($class).($selector?' '.$selector:'').' {'.$data.'}'); 00788 } 00789 00797 function pi_wrapInBaseClass($str) { 00798 $content = '<div class="'.str_replace('_','-',$this->prefixId).'"> 00799 '.$str.' 00800 </div> 00801 '; 00802 00803 if(!$GLOBALS['TSFE']->config['config']['disablePrefixComment']) { 00804 $content = ' 00805 00806 00807 <!-- 00808 00809 BEGIN: Content of extension "'.$this->extKey.'", plugin "'.$this->prefixId.'" 00810 00811 --> 00812 '.$content.' 00813 <!-- END: Content of extension "'.$this->extKey.'", plugin "'.$this->prefixId.'" --> 00814 00815 '; 00816 } 00817 00818 return $content; 00819 } 00820 00821 00822 00823 00824 00825 00826 00827 00828 00829 00830 00831 00832 00833 00834 00835 00836 00837 /*************************** 00838 * 00839 * Frontend editing: Edit panel, edit icons 00840 * 00841 **************************/ 00842 00853 function pi_getEditPanel($row='',$tablename='',$label='',$conf=Array()) { 00854 $panel=''; 00855 if (!$row || !$tablename) { 00856 $row = $this->internal['currentRow']; 00857 $tablename = $this->internal['currentTable']; 00858 } 00859 00860 if ($GLOBALS['TSFE']->beUserLogin) { 00861 // Create local cObj if not set: 00862 if (!is_object($this->pi_EPtemp_cObj)) { 00863 $this->pi_EPtemp_cObj = t3lib_div::makeInstance('tslib_cObj'); 00864 $this->pi_EPtemp_cObj->setParent($this->cObj->data,$this->cObj->currentRecord); 00865 } 00866 00867 // Initialize the cObj object with current row 00868 $this->pi_EPtemp_cObj->start($row,$tablename); 00869 00870 // Setting TypoScript values in the $conf array. See documentation in TSref for the EDITPANEL cObject. 00871 $conf['allow'] = 'edit,new,delete,move,hide'; 00872 $panel = $this->pi_EPtemp_cObj->cObjGetSingle('EDITPANEL',$conf,'editpanel'); 00873 } 00874 00875 if ($panel) { 00876 if ($label) { 00877 return '<!-- BEGIN: EDIT PANEL --><table border="0" cellpadding="0" cellspacing="0" width="100%"><tr><td valign="top">'.$label.'</td><td valign="top" align="right">'.$panel.'</td></tr></table><!-- END: EDIT PANEL -->'; 00878 } else return '<!-- BEGIN: EDIT PANEL -->'.$panel.'<!-- END: EDIT PANEL -->'; 00879 } else return $label; 00880 } 00881 00895 function pi_getEditIcon($content,$fields,$title='',$row='',$tablename='',$oConf=array()) { 00896 if ($GLOBALS['TSFE']->beUserLogin){ 00897 if (!$row || !$tablename) { 00898 $row = $this->internal['currentRow']; 00899 $tablename = $this->internal['currentTable']; 00900 } 00901 $conf=array_merge(array( 00902 'beforeLastTag'=>1, 00903 'iconTitle' => $title 00904 ),$oConf); 00905 $content=$this->cObj->editIcons($content,$tablename.':'.$fields,$conf,$tablename.':'.$row['uid'],$row,'&viewUrl='.rawurlencode(t3lib_div::getIndpEnv('REQUEST_URI'))); 00906 } 00907 return $content; 00908 } 00909 00910 00911 00912 00913 00914 00915 00916 00917 00918 00919 00920 00921 00922 00923 00924 00925 00926 /*************************** 00927 * 00928 * Localization, locallang functions 00929 * 00930 **************************/ 00931 00932 00942 function pi_getLL($key,$alt='',$hsc=FALSE) { 00943 if (isset($this->LOCAL_LANG[$this->LLkey][$key])) { 00944 $word = $GLOBALS['TSFE']->csConv($this->LOCAL_LANG[$this->LLkey][$key], $this->LOCAL_LANG_charset[$this->LLkey][$key]); // The "from" charset is normally empty and thus it will convert from the charset of the system language, but if it is set (see ->pi_loadLL()) it will be used. 00945 } elseif ($this->altLLkey && isset($this->LOCAL_LANG[$this->altLLkey][$key])) { 00946 $word = $GLOBALS['TSFE']->csConv($this->LOCAL_LANG[$this->altLLkey][$key], $this->LOCAL_LANG_charset[$this->altLLkey][$key]); // The "from" charset is normally empty and thus it will convert from the charset of the system language, but if it is set (see ->pi_loadLL()) it will be used. 00947 } elseif (isset($this->LOCAL_LANG['default'][$key])) { 00948 $word = $this->LOCAL_LANG['default'][$key]; // No charset conversion because default is english and thereby ASCII 00949 } else { 00950 $word = $this->LLtestPrefixAlt.$alt; 00951 } 00952 00953 $output = $this->LLtestPrefix.$word; 00954 if ($hsc) $output = htmlspecialchars($output); 00955 00956 return $output; 00957 } 00958 00965 function pi_loadLL() { 00966 if (!$this->LOCAL_LANG_loaded && $this->scriptRelPath) { 00967 $basePath = t3lib_extMgm::extPath($this->extKey).dirname($this->scriptRelPath).'/locallang.php'; 00968 00969 // php or xml as source: In any case the charset will be that of the system language. 00970 // However, this function guarantees only return output for default language plus the specified language (which is different from how 3.7.0 dealt with it) 00971 $this->LOCAL_LANG = t3lib_div::readLLfile($basePath,$this->LLkey); 00972 if ($this->altLLkey) { 00973 $tempLOCAL_LANG = t3lib_div::readLLfile($basePath,$this->altLLkey); 00974 $this->LOCAL_LANG = array_merge(is_array($this->LOCAL_LANG) ? $this->LOCAL_LANG : array(),$tempLOCAL_LANG); 00975 } 00976 00977 // Overlaying labels from TypoScript (including fictitious language keys for non-system languages!): 00978 if (is_array($this->conf['_LOCAL_LANG.'])) { 00979 reset($this->conf['_LOCAL_LANG.']); 00980 while(list($k,$lA)=each($this->conf['_LOCAL_LANG.'])) { 00981 if (is_array($lA)) { 00982 $k = substr($k,0,-1); 00983 foreach($lA as $llK => $llV) { 00984 if (!is_array($llV)) { 00985 $this->LOCAL_LANG[$k][$llK] = $llV; 00986 if ($k != 'default') { 00987 $this->LOCAL_LANG_charset[$k][$llK] = $GLOBALS['TYPO3_CONF_VARS']['BE']['forceCharset']; // For labels coming from the TypoScript (database) the charset is assumed to be "forceCharset" and if that is not set, assumed to be that of the individual system languages (thus no conversion) 00988 } 00989 } 00990 } 00991 } 00992 } 00993 } 00994 } 00995 $this->LOCAL_LANG_loaded = 1; 00996 } 00997 00998 00999 01000 01001 01002 01003 01004 01005 01006 01007 01008 01009 01010 01011 01012 01013 01014 01015 01016 01017 01018 01019 01020 /*************************** 01021 * 01022 * Database, queries 01023 * 01024 **************************/ 01025 01043 function pi_list_query($table,$count=0,$addWhere='',$mm_cat='',$groupBy='',$orderBy='',$query='',$returnQueryArray=FALSE) { 01044 01045 // Begin Query: 01046 if (!$query) { 01047 // Fetches the list of PIDs to select from. 01048 // TypoScript property .pidList is a comma list of pids. If blank, current page id is used. 01049 // TypoScript property .recursive is a int+ which determines how many levels down from the pids in the pid-list subpages should be included in the select. 01050 $pidList = $this->pi_getPidList($this->conf['pidList'],$this->conf['recursive']); 01051 if (is_array($mm_cat)) { 01052 $query='FROM '.$table.','.$mm_cat['table'].','.$mm_cat['mmtable'].chr(10). 01053 ' WHERE '.$table.'.uid='.$mm_cat['mmtable'].'.uid_local AND '.$mm_cat['table'].'.uid='.$mm_cat['mmtable'].'.uid_foreign '.chr(10). 01054 (strcmp($mm_cat['catUidList'],'')?' AND '.$mm_cat['table'].'.uid IN ('.$mm_cat['catUidList'].')':'').chr(10). 01055 ' AND '.$table.'.pid IN ('.$pidList.')'.chr(10). 01056 $this->cObj->enableFields($table).chr(10); // This adds WHERE-clauses that ensures deleted, hidden, starttime/endtime/access records are NOT selected, if they should not! Almost ALWAYS add this to your queries! 01057 } else { 01058 $query='FROM '.$table.' WHERE pid IN ('.$pidList.')'.chr(10). 01059 $this->cObj->enableFields($table).chr(10); // This adds WHERE-clauses that ensures deleted, hidden, starttime/endtime/access records are NOT selected, if they should not! Almost ALWAYS add this to your queries! 01060 } 01061 } 01062 01063 // Split the "FROM ... WHERE" string so we get the WHERE part and TABLE names separated...: 01064 list($TABLENAMES,$WHERE) = spliti('WHERE', trim($query), 2); 01065 $TABLENAMES = trim(substr(trim($TABLENAMES),5)); 01066 $WHERE = trim($WHERE); 01067 01068 // Add '$addWhere' 01069 if ($addWhere) {$WHERE.=' '.$addWhere.chr(10);} 01070 01071 // Search word: 01072 if ($this->piVars['sword'] && $this->internal['searchFieldList']) { 01073 $WHERE.=$this->cObj->searchWhere($this->piVars['sword'],$this->internal['searchFieldList'],$table).chr(10); 01074 } 01075 01076 if ($count) { 01077 $queryParts = array( 01078 'SELECT' => 'count(*)', 01079 'FROM' => $TABLENAMES, 01080 'WHERE' => $WHERE, 01081 'GROUPBY' => '', 01082 'ORDERBY' => '', 01083 'LIMIT' => '' 01084 ); 01085 } else { 01086 // Order by data: 01087 if (!$orderBy && $this->internal['orderBy']) { 01088 if (t3lib_div::inList($this->internal['orderByList'],$this->internal['orderBy'])) { 01089 $orderBy = 'ORDER BY '.$table.'.'.$this->internal['orderBy'].($this->internal['descFlag']?' DESC':''); 01090 } 01091 } 01092 01093 // Limit data: 01094 $pointer = $this->piVars['pointer']; 01095 $pointer = intval($pointer); 01096 $results_at_a_time = t3lib_div::intInRange($this->internal['results_at_a_time'],1,1000); 01097 $LIMIT = ($pointer*$results_at_a_time).','.$results_at_a_time; 01098 01099 // Add 'SELECT' 01100 $queryParts = array( 01101 'SELECT' => $this->pi_prependFieldsWithTable($table,$this->pi_listFields), 01102 'FROM' => $TABLENAMES, 01103 'WHERE' => $WHERE, 01104 'GROUPBY' => $GLOBALS['TYPO3_DB']->stripGroupBy($groupBy), 01105 'ORDERBY' => $GLOBALS['TYPO3_DB']->stripOrderBy($orderBy), 01106 'LIMIT' => $LIMIT 01107 ); 01108 } 01109 01110 $query = $GLOBALS['TYPO3_DB']->SELECTquery ( 01111 $queryParts['SELECT'], 01112 $queryParts['FROM'], 01113 $queryParts['WHERE'], 01114 $queryParts['GROUPBY'], 01115 $queryParts['ORDERBY'], 01116 $queryParts['LIMIT'] 01117 ); 01118 return $returnQueryArray ? $queryParts : $query; 01119 } 01120 01135 function pi_exec_query($table,$count=0,$addWhere='',$mm_cat='',$groupBy='',$orderBy='',$query='') { 01136 $queryParts = $this->pi_list_query($table,$count,$addWhere,$mm_cat,$groupBy,$orderBy,$query, TRUE); 01137 01138 return $GLOBALS['TYPO3_DB']->exec_SELECT_queryArray($queryParts); 01139 } 01140 01150 function pi_getRecord($table,$uid,$checkPage=0) { 01151 return $GLOBALS['TSFE']->sys_page->checkRecord($table,$uid,$checkPage); 01152 } 01153 01161 function pi_getPidList($pid_list,$recursive=0) { 01162 if (!strcmp($pid_list,'')) $pid_list = $GLOBALS['TSFE']->id; 01163 $recursive = t3lib_div::intInRange($recursive,0); 01164 01165 $pid_list_arr = array_unique(t3lib_div::trimExplode(',',$pid_list,1)); 01166 $pid_list = array(); 01167 01168 foreach($pid_list_arr as $val) { 01169 $val = t3lib_div::intInRange($val,0); 01170 if ($val) { 01171 $_list = $this->cObj->getTreeList(-1*$val, $recursive); 01172 if ($_list) $pid_list[] = $_list; 01173 } 01174 } 01175 01176 return implode(',', $pid_list); 01177 } 01178 01186 function pi_prependFieldsWithTable($table,$fieldList) { 01187 $list=t3lib_div::trimExplode(',',$fieldList,1); 01188 $return=array(); 01189 while(list(,$listItem)=each($list)) { 01190 $return[]=$table.'.'.$listItem; 01191 } 01192 return implode(',',$return); 01193 } 01194 01206 function pi_getCategoryTableContents($table,$pid,$whereClause='',$groupBy='',$orderBy='',$limit='') { 01207 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery( 01208 '*', 01209 $table, 01210 'pid='.intval($pid). 01211 $this->cObj->enableFields($table).' '. 01212 $whereClause, // whereClauseMightContainGroupOrderBy 01213 $groupBy, 01214 $orderBy, 01215 $limit 01216 ); 01217 $outArr = array(); 01218 while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) { 01219 $outArr[$row['uid']] = $row; 01220 } 01221 $GLOBALS['TYPO3_DB']->sql_free_result($res); 01222 return $outArr; 01223 } 01224 01225 01226 01227 01228 01229 01230 01231 01232 01233 01234 01235 01236 /*************************** 01237 * 01238 * Various 01239 * 01240 **************************/ 01241 01250 function pi_isOnlyFields($fList,$lowerThan=-1) { 01251 $lowerThan = $lowerThan==-1 ? $this->pi_lowerThan : $lowerThan; 01252 01253 $fList = t3lib_div::trimExplode(',',$fList,1); 01254 $tempPiVars = $this->piVars; 01255 while(list(,$k)=each($fList)) { 01256 if (!t3lib_div::testInt($tempPiVars[$k]) || $tempPiVars[$k]<$lowerThan) unset($tempPiVars[$k]); 01257 } 01258 if (!count($tempPiVars)) return 1; 01259 } 01260 01270 function pi_autoCache($inArray) { 01271 if (is_array($inArray)) { 01272 reset($inArray); 01273 while(list($fN,$fV)=each($inArray)) { 01274 if (!strcmp($inArray[$fN],'')) { 01275 unset($inArray[$fN]); 01276 } elseif (is_array($this->pi_autoCacheFields[$fN])) { 01277 if (is_array($this->pi_autoCacheFields[$fN]['range']) 01278 && intval($inArray[$fN])>=intval($this->pi_autoCacheFields[$fN]['range'][0]) 01279 && intval($inArray[$fN])<=intval($this->pi_autoCacheFields[$fN]['range'][1])) { 01280 unset($inArray[$fN]); 01281 } 01282 if (is_array($this->pi_autoCacheFields[$fN]['list']) 01283 && in_array($inArray[$fN],$this->pi_autoCacheFields[$fN]['list'])) { 01284 unset($inArray[$fN]); 01285 } 01286 } 01287 } 01288 } 01289 if (!count($inArray)) return 1; 01290 } 01291 01301 function pi_RTEcssText($str) { 01302 $parseFunc = $GLOBALS['TSFE']->tmpl->setup['lib.']['parseFunc_RTE.']; 01303 if (is_array($parseFunc)) $str = $this->cObj->parseFunc($str, $parseFunc); 01304 return $str; 01305 } 01306 01307 01308 01309 01310 01311 /******************************* 01312 * 01313 * FlexForms related functions 01314 * 01315 *******************************/ 01316 01323 function pi_initPIflexForm($field='pi_flexform') { 01324 // Converting flexform data into array: 01325 if (!is_array($this->cObj->data[$field]) && $this->cObj->data[$field]) { 01326 $this->cObj->data[$field] = t3lib_div::xml2array($this->cObj->data[$field]); 01327 if (!is_array($this->cObj->data[$field])) $this->cObj->data[$field]=array(); 01328 } 01329 } 01330 01341 function pi_getFFvalue($T3FlexForm_array,$fieldName,$sheet='sDEF',$lang='lDEF',$value='vDEF') { 01342 $sheetArray = is_array($T3FlexForm_array) ? $T3FlexForm_array['data'][$sheet][$lang] : ''; 01343 if (is_array($sheetArray)) { 01344 return $this->pi_getFFvalueFromSheetArray($sheetArray,explode('/',$fieldName),$value); 01345 } 01346 } 01347 01358 function pi_getFFvalueFromSheetArray($sheetArray,$fieldNameArr,$value) { 01359 01360 $tempArr=$sheetArray; 01361 foreach($fieldNameArr as $k => $v) { 01362 if (t3lib_div::testInt($v)) { 01363 if (is_array($tempArr)) { 01364 $c=0; 01365 foreach($tempArr as $values) { 01366 if ($c==$v) { 01367 #debug($values); 01368 $tempArr=$values; 01369 break; 01370 } 01371 $c++; 01372 } 01373 } 01374 } else { 01375 $tempArr = $tempArr[$v]; 01376 } 01377 } 01378 return $tempArr[$value]; 01379 } 01380 } 01381 01382 // NO extension of class - does not make sense here. 01383 ?>