Main Page | Directories | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members | Related Pages | Examples

class.t3lib_befunc.php

Go to the documentation of this file.
00001 <?php
00002 /***************************************************************
00003 *  Copyright notice
00004 *
00005 *  (c) 1999-2004 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 ***************************************************************/
00168 class t3lib_BEfunc   {
00169 
00170 
00171 
00172    /*******************************************
00173     *
00174     * SQL-related, selecting records, searching
00175     *
00176     *******************************************/
00177 
00178 
00188    function deleteClause($table) {
00189       global $TCA;
00190       if ($TCA[$table]['ctrl']['delete']) {
00191          return ' AND NOT '.$table.'.'.$TCA[$table]['ctrl']['delete'];
00192       } else {
00193          return '';
00194       }
00195    }
00196 
00211    function getRecord($table,$uid,$fields='*',$where='') {
00212       if ($GLOBALS['TCA'][$table])  {
00213          $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery($fields, $table, 'uid='.intval($uid).t3lib_BEfunc::deleteClause($table).$where);
00214          if ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))  {
00215             return $row;
00216          }
00217       }
00218    }
00219 
00233    function getRecordRaw($table,$where='',$fields='*')   {
00234       $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery($fields, $table, $where);
00235       if ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))  {
00236          return $row;
00237       }
00238    }
00239 
00255    function getRecordsByField($theTable,$theField,$theValue,$whereClause='',$groupBy='',$orderBy='',$limit='') {
00256       global $TCA;
00257       if (is_array($TCA[$theTable])) {
00258          $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
00259                   '*',
00260                   $theTable,
00261                   $theField.'="'.$GLOBALS['TYPO3_DB']->quoteStr($theValue, $theTable).'"'.
00262                      t3lib_BEfunc::deleteClause($theTable).' '.
00263                      $whereClause,  // whereClauseMightContainGroupOrderBy
00264                   $groupBy,
00265                   $orderBy,
00266                   $limit
00267                );
00268          $rows = array();
00269          while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))   {
00270             $rows[] = $row;
00271          }
00272          $GLOBALS['TYPO3_DB']->sql_free_result($res);
00273          if (count($rows)) return $rows;
00274       }
00275    }
00276 
00286    function fixVersioningPid($table,&$rr) {
00287       global $TCA;
00288 
00289       if ($rr['pid']==-1 && $TCA[$table]['ctrl']['versioning'])   {
00290          if ($rr['t3ver_oid']>0) {  // If "t3ver_oid" is already a field, just set this:
00291             $oid = $rr['t3ver_oid'];
00292          } else { // Otherwise we have to expect "uid" to be in the record and look up based on this:
00293             $newPidRec = t3lib_BEfunc::getRecord($table,$rr['uid'],'t3ver_oid');
00294             if (is_array($newPidRec))  {
00295                $oid = $newPidRec['t3ver_oid'];
00296             }
00297          }
00298 
00299             // If ID of current online version is found, look up the PID value of that:
00300          if ($oid)   {
00301             $oidRec = t3lib_BEfunc::getRecord($table,$oid,'pid');
00302             if (is_array($oidRec))  {
00303                $rr['_ORIG_pid'] = $rr['pid'];
00304                $rr['pid'] = $oidRec['pid'];
00305             }
00306          }
00307       }
00308    }
00309 
00320    function searchQuery($searchWords,$fields,$table='')  {
00321       return $GLOBALS['TYPO3_DB']->searchQuery($searchWords,$fields,$table);
00322    }
00323 
00335    function listQuery($field,$value)   {
00336       return $GLOBALS['TYPO3_DB']->listQuery($field,$value,'');
00337    }
00338 
00347    function splitTable_Uid($str) {
00348       list($uid,$table) = explode('_',strrev($str),2);
00349       return array(strrev($table),strrev($uid));
00350    }
00351 
00362    function getSQLselectableList($in_list,$tablename,$default_tablename)   {
00363       $list = Array();
00364       if ((string)trim($in_list)!='')  {
00365          $tempItemArray = explode(',',trim($in_list));
00366          while(list($key,$val)=each($tempItemArray))  {
00367             $val = strrev($val);
00368             $parts = explode('_',$val,2);
00369             if ((string)trim($parts[0])!='') {
00370                $theID = intval(strrev($parts[0]));
00371                $theTable = trim($parts[1]) ? strrev(trim($parts[1])) : $default_tablename;
00372                if ($theTable==$tablename) {$list[]=$theID;}
00373             }
00374          }
00375       }
00376       return implode(',',$list);
00377    }
00378 
00390    function BEenableFields($table,$inv=0) {
00391       $ctrl = $GLOBALS['TCA'][$table]['ctrl'];
00392       $query=array();
00393       $invQuery=array();
00394       if (is_array($ctrl)) {
00395          if (is_array($ctrl['enablecolumns']))  {
00396             if ($ctrl['enablecolumns']['disabled'])   {
00397                $field = $table.'.'.$ctrl['enablecolumns']['disabled'];
00398                $query[]='NOT '.$field;
00399                $invQuery[]=$field;
00400             }
00401             if ($ctrl['enablecolumns']['starttime'])  {
00402                $field = $table.'.'.$ctrl['enablecolumns']['starttime'];
00403                $query[]='('.$field.'<='.$GLOBALS['SIM_EXEC_TIME'].')';
00404                $invQuery[]='('.$field.'!=0 AND '.$field.'>'.$GLOBALS['SIM_EXEC_TIME'].')';
00405             }
00406             if ($ctrl['enablecolumns']['endtime']) {
00407                $field = $table.'.'.$ctrl['enablecolumns']['endtime'];
00408                $query[]='('.$field.'=0 OR '.$field.'>'.$GLOBALS['SIM_EXEC_TIME'].')';
00409                $invQuery[]='('.$field.'!=0 AND '.$field.'<='.$GLOBALS['SIM_EXEC_TIME'].')';
00410             }
00411          }
00412       }
00413       $outQ = ' AND '.($inv ? '('.implode(' OR ',$invQuery).')' : implode(' AND ',$query));
00414 
00415       return $outQ;
00416    }
00417 
00418 
00419 
00420 
00421 
00422 
00423 
00424 
00425 
00426 
00427    /*******************************************
00428     *
00429     * SQL-related, DEPRECIATED functions
00430     * (use t3lib_DB functions instead)
00431     *
00432     *******************************************/
00433 
00434 
00454    function mm_query($select,$local_table,$mm_table,$foreign_table,$whereClause='',$groupBy='',$orderBy='',$limit='')   {
00455       $query = $GLOBALS['TYPO3_DB']->SELECTquery(
00456                $select,
00457                $local_table.','.$mm_table.($foreign_table?','.$foreign_table:''),
00458                $local_table.'.uid='.$mm_table.'.uid_local'.($foreign_table?' AND '.$foreign_table.'.uid='.$mm_table.'.uid_foreign':'').' '.
00459                   $whereClause,  // whereClauseMightContainGroupOrderBy
00460                $groupBy,
00461                $orderBy,
00462                $limit
00463             );
00464       return $query;
00465    }
00466 
00476    function DBcompileInsert($table,$fields_values) {
00477       return $GLOBALS['TYPO3_DB']->INSERTquery($table, $fields_values);
00478    }
00479 
00490    function DBcompileUpdate($table,$where,$fields_values)   {
00491       return $GLOBALS['TYPO3_DB']->UPDATEquery($table, $where, $fields_values);
00492    }
00493 
00494 
00495 
00496 
00497 
00498 
00499 
00500 
00501 
00502 
00503    /*******************************************
00504     *
00505     * Page tree, TCA related
00506     *
00507     *******************************************/
00508 
00519    function BEgetRootLine($uid,$clause='')   {
00520       $loopCheck = 100;
00521       $theRowArray = Array();
00522       $output=Array();
00523       while ($uid!=0 && $loopCheck>0)  {
00524          $loopCheck--;
00525          $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
00526                      'pid,uid,title,TSconfig,is_siteroot,storage_pid',
00527                      'pages',
00528                      'uid='.intval($uid).' '.
00529                         t3lib_BEfunc::deleteClause('pages').' '.
00530                         $clause     // whereClauseMightContainGroupOrderBy
00531                   );
00532          if ($GLOBALS['TYPO3_DB']->sql_error()) {
00533             debug($GLOBALS['TYPO3_DB']->sql_error(),1);
00534          }
00535          if ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))  {
00536             t3lib_BEfunc::fixVersioningPid('pages',$row);
00537             $uid = $row['pid'];
00538             $theRowArray[]=$row;
00539          } else {
00540             break;
00541          }
00542       }
00543       if ($uid==0) {$theRowArray[]=Array('uid'=>0,'title'=>'');}
00544       if (is_array($theRowArray))   {
00545          reset($theRowArray);
00546          $c=count($theRowArray);
00547          while(list($key,$val)=each($theRowArray)) {
00548             $c--;
00549             $output[$c]['uid'] = $val['uid'];
00550             $output[$c]['pid'] = $val['pid'];
00551             if (isset($val['_ORIG_pid'])) $output[$c]['_ORIG_pid'] = $val['_ORIG_pid'];
00552             $output[$c]['title'] = $val['title'];
00553             $output[$c]['TSconfig'] = $val['TSconfig'];
00554             $output[$c]['is_siteroot'] = $val['is_siteroot'];
00555             $output[$c]['storage_pid'] = $val['storage_pid'];
00556          }
00557       }
00558       return $output;
00559    }
00560 
00568    function openPageTree($pid,$clearExpansion)  {
00569       global $BE_USER;
00570 
00571          // Get current expansion data:
00572       if ($clearExpansion) {
00573          $expandedPages = array();
00574       } else {
00575          $expandedPages = unserialize($BE_USER->uc['browseTrees']['browsePages']);
00576       }
00577 
00578          // Get rootline:
00579       $rL = t3lib_BEfunc::BEgetRootLine($pid);
00580 
00581          // First, find out what mount index to use (if more than one DB mount exists):
00582       $mountIndex = 0;
00583       $mountKeys = array_flip($BE_USER->returnWebmounts());
00584       foreach($rL as $rLDat)  {
00585          if (isset($mountKeys[$rLDat['uid']]))  {
00586             $mountIndex = $mountKeys[$rLDat['uid']];
00587             break;
00588          }
00589       }
00590 
00591          // Traverse rootline and open paths:
00592       foreach($rL as $rLDat)  {
00593          $expandedPages[$mountIndex][$rLDat['uid']] = 1;
00594       }
00595 
00596          // Write back:
00597       $BE_USER->uc['browseTrees']['browsePages'] = serialize($expandedPages);
00598       $BE_USER->writeUC();
00599    }
00600 
00613    function getRecordPath($uid, $clause, $titleLimit, $fullTitleLimit=0)   {
00614       if (!$titleLimit) { $titleLimit=1000; }
00615 
00616       $loopCheck = 100;
00617       $output = $fullOutput = '/';
00618       while ($uid!=0 && $loopCheck>0)  {
00619          $loopCheck--;
00620          $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
00621                   'uid,pid,title',
00622                   'pages',
00623                   'uid='.intval($uid).
00624                      t3lib_BEfunc::deleteClause('pages').
00625                      (strlen(trim($clause)) ? ' AND '.$clause : '')
00626                );
00627          if ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))  {
00628             t3lib_BEfunc::fixVersioningPid('pages',$row);
00629 
00630             if ($row['_ORIG_pid'])  {
00631                $output = ' [#VEP#]'.$output;    // Adding visual token - Versioning Entry Point - that tells that THIS position was where the versionized branch got connected to the main tree. I will have to find a better name or something...
00632             }
00633             $uid = $row['pid'];
00634             $output = '/'.t3lib_div::fixed_lgd_cs(strip_tags($row['title']),$titleLimit).$output;
00635             if ($fullTitleLimit) $fullOutput = '/'.t3lib_div::fixed_lgd_cs(strip_tags($row['title']),$fullTitleLimit).$fullOutput;
00636          } else {
00637             break;
00638          }
00639       }
00640 
00641       if ($fullTitleLimit) {
00642          return array($output, $fullOutput);
00643       } else {
00644          return $output;
00645       }
00646    }
00647 
00655    function getExcludeFields()   {
00656       global $TCA;
00657          // All TCA keys:
00658       $theExcludeArray = Array();
00659       $tc_keys = array_keys($TCA);
00660       foreach($tc_keys as $table)   {
00661             // Load table
00662          t3lib_div::loadTCA($table);
00663             // All field names configured:
00664          if (is_array($TCA[$table]['columns'])) {
00665             $f_keys = array_keys($TCA[$table]['columns']);
00666             foreach($f_keys as $field) {
00667                if ($TCA[$table]['columns'][$field]['exclude']) {
00668                      // Get Human Readable names of fields and table:
00669                   $Fname=$GLOBALS['LANG']->sl($TCA[$table]['ctrl']['title']).': '.$GLOBALS['LANG']->sl($TCA[$table]['columns'][$field]['label']);
00670                      // add entry:
00671                   $theExcludeArray[] = Array($Fname , $table.':'.$field);
00672                }
00673             }
00674          }
00675       }
00676       return $theExcludeArray;
00677    }
00678 
00685    function getExplicitAuthFieldValues()  {
00686       global $TCA;
00687 
00688          // Initialize:
00689       $adLabel = array(
00690          'ALLOW' => $GLOBALS['LANG']->sl('LLL:EXT:lang/locallang_core.xml:labels.allow'),
00691          'DENY' => $GLOBALS['LANG']->sl('LLL:EXT:lang/locallang_core.xml:labels.deny'),
00692       );
00693 
00694          // All TCA keys:
00695       $allowDenyOptions = Array();
00696       $tc_keys = array_keys($TCA);
00697       foreach($tc_keys as $table)   {
00698 
00699             // Load table
00700          t3lib_div::loadTCA($table);
00701 
00702             // All field names configured:
00703          if (is_array($TCA[$table]['columns'])) {
00704             $f_keys = array_keys($TCA[$table]['columns']);
00705             foreach($f_keys as $field) {
00706                $fCfg = $TCA[$table]['columns'][$field]['config'];
00707                if ($fCfg['type']=='select' && $fCfg['authMode'])  {
00708 
00709                      // Check for items:
00710                   if (is_array($fCfg['items'])) {
00711                         // Get Human Readable names of fields and table:
00712                      $allowDenyOptions[$table.':'.$field]['tableFieldLabel'] = $GLOBALS['LANG']->sl($TCA[$table]['ctrl']['title']).': '.$GLOBALS['LANG']->sl($TCA[$table]['columns'][$field]['label']);
00713 
00714                         // Check for items:
00715                      foreach($fCfg['items'] as $iVal) {
00716                         if (strcmp($iVal[1],''))   {  // Values '' is not controlled by this setting.
00717 
00718                               // Find iMode:
00719                            $iMode = '';
00720                            switch((string)$fCfg['authMode'])   {
00721                               case 'explicitAllow':
00722                                  $iMode = 'ALLOW';
00723                               break;
00724                               case 'explicitDeny':
00725                                  $iMode = 'DENY';
00726                               break;
00727                               case 'individual':
00728                                  if (!strcmp($iVal[4],'EXPL_ALLOW')) {
00729                                     $iMode = 'ALLOW';
00730                                  } elseif (!strcmp($iVal[4],'EXPL_DENY'))  {
00731                                     $iMode = 'DENY';
00732                                  }
00733                               break;
00734                            }
00735 
00736                               // Set iMode:
00737                            if ($iMode) {
00738                               $allowDenyOptions[$table.':'.$field]['items'][$iVal[1]] = array($iMode, $GLOBALS['LANG']->sl($iVal[0]), $adLabel[$iMode]);
00739                            }
00740                         }
00741                      }
00742                   }
00743                }
00744             }
00745          }
00746       }
00747 
00748       return $allowDenyOptions;
00749    }
00750 
00756    function getSystemLanguages() {
00757 
00758          // Initialize, add default language:
00759       $sysLanguages = array();
00760       $sysLanguages[] = array('Default language', 0);
00761 
00762          // Traverse languages
00763       $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('uid,title,flag','sys_language','pid=0'.t3lib_BEfunc::deleteClause('sys_language'));
00764       while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))   {
00765          $sysLanguages[] = array($row['title'].' ['.$row['uid'].']', $row['uid'], ($row['flag'] ? '../t3lib/gfx/flags/'.$row['flag'] : ''));
00766       }
00767 
00768       return $sysLanguages;
00769    }
00770 
00781    function readPageAccess($id,$perms_clause)   {
00782       if ((string)$id!='') {
00783          $id = intval($id);
00784          if (!$id)   {
00785             if ($GLOBALS['BE_USER']->isAdmin()) {
00786                $path = '/';
00787                $pageinfo['_thePath'] = $path;
00788                return $pageinfo;
00789             }
00790          } else {
00791             $pageinfo = t3lib_BEfunc::getRecord('pages',$id,'*',($perms_clause ? ' AND '.$perms_clause : ''));
00792             if ($pageinfo['uid'] && $GLOBALS['BE_USER']->isInWebMount($id,$perms_clause)) {
00793                list($pageinfo['_thePath'],$pageinfo['_thePathFull']) = t3lib_BEfunc::getRecordPath(intval($pageinfo['uid']), $perms_clause, 15, 1000);
00794                return $pageinfo;
00795             }
00796          }
00797       }
00798       return false;
00799    }
00800 
00810    function getTCAtypes($table,$rec,$useFieldNameAsKey=0)   {
00811       global $TCA;
00812 
00813       t3lib_div::loadTCA($table);
00814       if ($TCA[$table]) {
00815 
00816             // Get type value:
00817          $fieldValue = t3lib_BEfunc::getTCAtypeValue($table,$rec);
00818 
00819             // Get typesConf
00820          $typesConf = $TCA[$table]['types'][$fieldValue];
00821 
00822             // Get fields list and traverse it
00823          $fieldList = explode(',', $typesConf['showitem']);
00824          $altFieldList = array();
00825 
00826             // Traverse fields in types config and parse the configuration into a nice array:
00827          foreach($fieldList as $k => $v)  {
00828             list($pFieldName, $pAltTitle, $pPalette, $pSpec) = t3lib_div::trimExplode(';', $v);
00829             $defaultExtras = is_array($TCA[$table]['columns'][$pFieldName]) ? $TCA[$table]['columns'][$pFieldName]['defaultExtras'] : '';
00830             $specConfParts = t3lib_BEfunc::getSpecConfParts($pSpec, $defaultExtras);
00831 
00832             $fieldList[$k]=array(
00833                'field' => $pFieldName,
00834                'title' => $pAltTitle,
00835                'palette' => $pPalette,
00836                'spec' => $specConfParts,
00837                'origString' => $v
00838             );
00839             if ($useFieldNameAsKey) {
00840                $altFieldList[$fieldList[$k]['field']] = $fieldList[$k];
00841             }
00842          }
00843          if ($useFieldNameAsKey) {
00844             $fieldList = $altFieldList;
00845          }
00846 
00847             // Return array:
00848          return $fieldList;
00849       }
00850    }
00851 
00863    function getTCAtypeValue($table,$rec)  {
00864       global $TCA;
00865 
00866          // If no field-value, set it to zero. If there is no type matching the field-value (which now may be zero...) test field-value '1' as default.
00867       t3lib_div::loadTCA($table);
00868       if ($TCA[$table]) {
00869          $field = $TCA[$table]['ctrl']['type'];
00870          $fieldValue = $field ? ($rec[$field] ? $rec[$field] : 0) : 0;
00871          if (!is_array($TCA[$table]['types'][$fieldValue])) $fieldValue = 1;
00872          return $fieldValue;
00873       }
00874    }
00875 
00886    function getSpecConfParts($str, $defaultExtras) {
00887 
00888          // Add defaultExtras:
00889       $specConfParts = t3lib_div::trimExplode(':', $defaultExtras.':'.$str, 1);
00890 
00891       if (count($specConfParts)) {
00892          foreach($specConfParts as $k2 => $v2)  {
00893             unset($specConfParts[$k2]);
00894             if (ereg('(.*)\[(.*)\]',$v2,$reg))  {
00895                $specConfParts[trim($reg[1])] = array(
00896                   'parameters' => t3lib_div::trimExplode('|', $reg[2], 1)
00897                );
00898             } else {
00899                $specConfParts[trim($v2)] = 1;
00900             }
00901          }
00902       } else {
00903          $specConfParts = array();
00904       }
00905       return $specConfParts;
00906    }
00907 
00916    function getSpecConfParametersFromArray($pArr)  {
00917       $out=array();
00918       if (is_array($pArr)) {
00919          reset($pArr);
00920          while(list($k,$v)=each($pArr))   {
00921             $parts=explode('=',$v,2);
00922             if (count($parts)==2)   {
00923                $out[trim($parts[0])]=trim($parts[1]);
00924             } else {
00925                $out[$k]=$v;
00926             }
00927          }
00928       }
00929       return $out;
00930    }
00931 
00942    function getFlexFormDS($conf,$row,$table) {
00943 
00944          // Get pointer field etc from TCA-config:
00945       $ds_pointerField =   $conf['ds_pointerField'];
00946       $ds_array =       $conf['ds'];
00947       $ds_tableField =  $conf['ds_tableField'];
00948       $ds_searchParentField =    $conf['ds_pointerField_searchParent'];
00949 
00950          // Find source value:
00951       $dataStructArray='';
00952       if (is_array($ds_array))   {  // If there is a data source array, that takes precedence
00953             // If a pointer field is set, take the value from that field in the $row array and use as key.
00954          if ($ds_pointerField)   {
00955             $srcPointer = $row[$ds_pointerField];
00956             $srcPointer = isset($ds_array[$srcPointer]) ? $srcPointer : 'default';
00957          } else $srcPointer='default';
00958 
00959             // Get Data Source: Detect if it's a file reference and in that case read the file and parse as XML. Otherwise the value is expected to be XML.
00960          if (substr($ds_array[$srcPointer],0,5)=='FILE:')   {
00961             $file = t3lib_div::getFileAbsFileName(substr($ds_array[$srcPointer],5));
00962             if ($file && @is_file($file)) {
00963                $dataStructArray = t3lib_div::xml2array(t3lib_div::getUrl($file));
00964             } else $dataStructArray = 'The file "'.substr($dsSrc,5).'" in ds-array key "'.$srcPointer.'" was not found ("'.$file.'")'; // Error message.
00965          } else {
00966             $dataStructArray = t3lib_div::xml2array($ds_array[$srcPointer]);
00967          }
00968 
00969       } elseif ($ds_pointerField) { // If pointer field AND possibly a table/field is set:
00970             // Value of field pointed to:
00971          $srcPointer = $row[$ds_pointerField];
00972 
00973             // Searching recursively back if 'ds_pointerField_searchParent' is defined (typ. a page rootline, or maybe a tree-table):
00974          if ($ds_searchParentField && !$srcPointer)   {
00975             $rr = t3lib_BEfunc::getRecord($table,$row['uid'],'uid,'.$ds_searchParentField);  // Get the "pid" field - we cannot know that it is in the input record!
00976             t3lib_BEfunc::fixVersioningPid($table,$rr);
00977             $uidAcc=array();  // Used to avoid looping, if any should happen.
00978             $subFieldPointer = $conf['ds_pointerField_searchParent_subField'];
00979             while(!$srcPointer)     {
00980                $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
00981                            'uid,'.$ds_pointerField.','.$ds_searchParentField.($subFieldPointer?','.$subFieldPointer:''),
00982                            $table,
00983                            'uid='.intval($rr[$ds_searchParentField]).t3lib_BEfunc::deleteClause($table)
00984                         );
00985                $rr = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res);
00986 
00987                   // break if no result from SQL db or if looping...
00988                if (!is_array($rr) || isset($uidAcc[$rr['uid']]))  break;
00989                $uidAcc[$rr['uid']]=1;
00990 
00991                t3lib_BEfunc::fixVersioningPid($table,$rr);
00992                $srcPointer = ($subFieldPointer && $rr[$subFieldPointer]) ? $rr[$subFieldPointer] : $rr[$ds_pointerField];
00993             }
00994          }
00995 
00996             // If there is a srcPointer value:
00997          if ($srcPointer)  {
00998             if (t3lib_div::testInt($srcPointer))   {  // If integer, then its a record we will look up:
00999                list($tName,$fName) = explode(':',$ds_tableField,2);
01000                if ($tName && $fName && is_array($GLOBALS['TCA'][$tName]))  {
01001                   $dataStructRec = t3lib_BEfunc::getRecord($tName, $srcPointer);
01002                   $dataStructArray = t3lib_div::xml2array($dataStructRec[$fName]);
01003                } else $dataStructArray = 'No tablename ('.$tName.') or fieldname ('.$fName.') was found an valid!';
01004             } else { // Otherwise expect it to be a file:
01005                $file = t3lib_div::getFileAbsFileName($srcPointer);
01006                if ($file && @is_file($file)) {
01007                   $dataStructArray = t3lib_div::xml2array(t3lib_div::getUrl($file));
01008                } else $dataStructArray='The file "'.$srcPointer.'" was not found ("'.$file.'")';   // Error message.
01009             }
01010          } else $dataStructArray='No source value in fieldname "'.$ds_pointerField.'"';   // Error message.
01011       } else $dataStructArray='No proper configuration!';
01012       return $dataStructArray;
01013    }
01014 
01015 
01016 
01017 
01018 
01019 
01020 
01021 
01022 
01023 
01024 
01025 
01026 
01027 
01028 
01029 
01030 
01031 
01032    /*******************************************
01033     *
01034     * Caching related
01035     *
01036     *******************************************/
01037 
01048    function storeHash($hash,$data,$ident) {
01049       $insertFields = array(
01050          'hash' => $hash,
01051          'content' => $data,
01052          'ident' => $ident,
01053          'tstamp' => time()
01054       );
01055       $GLOBALS['TYPO3_DB']->exec_DELETEquery('cache_hash', 'hash="'.$GLOBALS['TYPO3_DB']->quoteStr($hash, 'cache_hash').'"');
01056       $GLOBALS['TYPO3_DB']->exec_INSERTquery('cache_hash', $insertFields);
01057    }
01058 
01068    function getHash($hash,$expTime) {
01069          // if expTime is not set, the hash will never expire
01070       $expTime = intval($expTime);
01071       if ($expTime)  {
01072          $whereAdd = ' AND tstamp > '.(time()-$expTime);
01073       }
01074       $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('content', 'cache_hash', 'hash="'.$GLOBALS['TYPO3_DB']->quoteStr($hash, 'cache_hash').'"'.$whereAdd);
01075       if ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))  {
01076          return $row['content'];
01077       }
01078    }
01079 
01080 
01081 
01082 
01083 
01084 
01085 
01086 
01087    /*******************************************
01088     *
01089     * TypoScript related
01090     *
01091     *******************************************/
01092 
01104    function getPagesTSconfig($id,$rootLine='',$returnPartArray=0) {
01105       $id=intval($id);
01106       if (!is_array($rootLine))  {
01107          $rootLine = t3lib_BEfunc::BEgetRootLine($id,'');
01108       }
01109       ksort($rootLine); // Order correctly, changed 030102
01110       reset($rootLine);
01111       $TSdataArray = array();
01112       $TSdataArray['defaultPageTSconfig']=$GLOBALS['TYPO3_CONF_VARS']['BE']['defaultPageTSconfig'];   // Setting default configuration:
01113       while(list($k,$v)=each($rootLine))  {
01114          $TSdataArray['uid_'.$v['uid']]=$v['TSconfig'];
01115       }
01116       $TSdataArray = t3lib_TSparser::checkIncludeLines_array($TSdataArray);
01117       if ($returnPartArray)   {
01118          return $TSdataArray;
01119       }
01120 
01121          // Parsing the user TS (or getting from cache)
01122       $userTS = implode($TSdataArray,chr(10).'[GLOBAL]'.chr(10));
01123       $hash = md5('pageTS:'.$userTS);
01124       $cachedContent = t3lib_BEfunc::getHash($hash,0);
01125       $TSconfig = array();
01126       if (isset($cachedContent)) {
01127          $TSconfig = unserialize($cachedContent);
01128       } else {
01129          $parseObj = t3lib_div::makeInstance('t3lib_TSparser');
01130          $parseObj->parse($userTS);
01131          $TSconfig = $parseObj->setup;
01132          t3lib_BEfunc::storeHash($hash,serialize($TSconfig),'PAGES_TSconfig');
01133       }
01134       return $TSconfig;
01135    }
01136 
01155    function updatePagesTSconfig($id,$pageTS,$TSconfPrefix,$impParams='')   {
01156       $id=intval($id);
01157       if (is_array($pageTS) && $id>0)  {
01158          if (!is_array($impParams)) {
01159             $impParams =t3lib_BEfunc::implodeTSParams(t3lib_BEfunc::getPagesTSconfig($id));
01160          }
01161          reset($pageTS);
01162          $set=array();
01163          while(list($f,$v)=each($pageTS)) {
01164             $f = $TSconfPrefix.$f;
01165             if ((!isset($impParams[$f])&&trim($v)) || strcmp(trim($impParams[$f]),trim($v))) {
01166                $set[$f]=trim($v);
01167             }
01168          }
01169          if (count($set))  {
01170                // Get page record and TS config lines
01171             $pRec = t3lib_befunc::getRecord('pages',$id);
01172             $TSlines = explode(chr(10),$pRec['TSconfig']);
01173             $TSlines = array_reverse($TSlines);
01174                // Reset the set of changes.
01175             reset($set);
01176             while(list($f,$v)=each($set)) {
01177                reset($TSlines);
01178                $inserted=0;
01179                while(list($ki,$kv)=each($TSlines)) {
01180                   if (substr($kv,0,strlen($f)+1)==$f.'=')   {
01181                      $TSlines[$ki]=$f.'='.$v;
01182                      $inserted=1;
01183                      break;
01184                   }
01185                }
01186                if (!$inserted)   {
01187                   $TSlines = array_reverse($TSlines);
01188                   $TSlines[]=$f.'='.$v;
01189                   $TSlines = array_reverse($TSlines);
01190                }
01191             }
01192             $TSlines = array_reverse($TSlines);
01193 
01194                // store those changes
01195             $TSconf = implode(chr(10),$TSlines);
01196 
01197             $GLOBALS['TYPO3_DB']->exec_UPDATEquery('pages', 'uid='.intval($id), array('TSconfig' => $TSconf));
01198          }
01199       }
01200    }
01201 
01210    function implodeTSParams($p,$k='')  {
01211       $implodeParams=array();
01212       if (is_array($p)) {
01213          reset($p);
01214          while(list($kb,$val)=each($p))   {
01215             if (is_array($val))  {
01216                $implodeParams = array_merge($implodeParams,t3lib_BEfunc::implodeTSParams($val,$k.$kb));
01217             } else {
01218                $implodeParams[$k.$kb]=$val;
01219             }
01220          }
01221       }
01222       return $implodeParams;
01223    }
01224 
01225 
01226 
01227 
01228 
01229 
01230 
01231 
01232    /*******************************************
01233     *
01234     * Users / Groups related
01235     *
01236     *******************************************/
01237 
01247    function getUserNames($fields='username,usergroup,usergroup_cached_list,uid',$where='')   {
01248       $be_user_Array=Array();
01249 
01250       $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery($fields, 'be_users', 'pid=0 '.$where.t3lib_BEfunc::deleteClause('be_users'), '', 'username');
01251       while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))   {
01252          $be_user_Array[$row['uid']]=$row;
01253       }
01254       return $be_user_Array;
01255    }
01256 
01265    function getGroupNames($fields='title,uid', $where='')   {
01266       $be_group_Array = Array();
01267       $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery($fields, 'be_groups', 'pid=0 '.$where.t3lib_BEfunc::deleteClause('be_groups'), '', 'title');
01268       while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))   {
01269          $be_group_Array[$row['uid']] = $row;
01270       }
01271       return $be_group_Array;
01272    }
01273 
01282    function getListGroupNames($fields='title,uid') {
01283       $exQ=' AND hide_in_lists=0';
01284       if (!$GLOBALS['BE_USER']->isAdmin())   {
01285          $exQ.=' AND uid IN ('.($GLOBALS['BE_USER']->user['usergroup_cached_list']?$GLOBALS['BE_USER']->user['usergroup_cached_list']:0).')';
01286       }
01287       return t3lib_BEfunc::getGroupNames($fields,$exQ);
01288    }
01289 
01301    function blindUserNames($usernames,$groupArray,$excludeBlindedFlag=0)   {
01302       if (is_array($usernames) && is_array($groupArray)) {
01303          while(list($uid,$row)=each($usernames))   {
01304             $userN=$uid;
01305             $set=0;
01306             if ($row['uid']!=$GLOBALS['BE_USER']->user['uid']) {
01307                reset($groupArray);
01308                while(list(,$v)=each($groupArray))  {
01309                   if ($v && t3lib_div::inList($row['usergroup_cached_list'],$v)) {
01310                      $userN = $row['username'];
01311                      $set=1;
01312                   }
01313                }
01314             } else {
01315                $userN = $row['username'];
01316                $set=1;
01317             }
01318             $usernames[$uid]['username']=$userN;
01319             if ($excludeBlindedFlag && !$set) {unset($usernames[$uid]);}
01320          }
01321       }
01322       return $usernames;
01323    }
01324 
01334    function blindGroupNames($groups,$groupArray,$excludeBlindedFlag=0)  {
01335       if (is_array($groups) && is_array($groupArray)) {
01336          while(list($uid,$row)=each($groups))   {
01337             $groupN=$uid;
01338             $set=0;
01339             if (t3lib_div::inArray($groupArray,$uid)) {
01340                $groupN=$row['title'];
01341                $set=1;
01342             }
01343             $groups[$uid]['title']=$groupN;
01344             if ($excludeBlindedFlag && !$set) {unset($groups[$uid]);}
01345          }
01346       }
01347       return $groups;
01348    }
01349 
01350 
01351 
01352 
01353 
01354 
01355 
01356 
01357 
01358 
01359 
01360 
01361 
01362    /*******************************************
01363     *
01364     * Output related
01365     *
01366     *******************************************/
01367 
01368 
01369 
01377    function daysUntil($tstamp)   {
01378       $delta_t = $tstamp-$GLOBALS['EXEC_TIME'];
01379       return ceil($delta_t/(3600*24));
01380    }
01381 
01389    function date($tstamp)  {
01390       return Date($GLOBALS['TYPO3_CONF_VARS']['SYS']['ddmmyy'],$tstamp);
01391    }
01392 
01400    function datetime($value)  {
01401       return Date($GLOBALS['TYPO3_CONF_VARS']['SYS']['ddmmyy'].' '.$GLOBALS['TYPO3_CONF_VARS']['SYS']['hhmm'],$value);
01402    }
01403 
01412    function time($value)   {
01413       $hh = floor($value/3600);
01414       $min = floor(($value-$hh*3600)/60);
01415       $sec = $value-$hh*3600-$min*60;
01416       $l = sprintf('%02d',$hh).':'.sprintf('%02d',$min).':'.sprintf('%02d',$sec);
01417       return $l;
01418    }
01419 
01428    function calcAge($seconds,$labels = 'min|hrs|days|yrs')  {
01429       $labelArr = explode('|',$labels);
01430       $prefix='';
01431       if ($seconds<0)   {$prefix='-'; $seconds=abs($seconds);}
01432       if ($seconds<3600)   {
01433          $seconds = round ($seconds/60).' '.trim($labelArr[0]);
01434       } elseif ($seconds<24*3600)   {
01435          $seconds = round ($seconds/3600).' '.trim($labelArr[1]);
01436       } elseif ($seconds<365*24*3600)  {
01437          $seconds = round ($seconds/(24*3600)).' '.trim($labelArr[2]);
01438       } else {
01439          $seconds = round ($seconds/(365*24*3600)).' '.trim($labelArr[3]);
01440       }
01441       return $prefix.$seconds;
01442    }
01443 
01454    function dateTimeAge($tstamp,$prefix=1,$date='')   {
01455       return $tstamp ?
01456             ($date=='date' ? t3lib_BEfunc::date($tstamp) : t3lib_BEfunc::datetime($tstamp)).
01457             ' ('.t3lib_BEfunc::calcAge($prefix*(time()-$tstamp),$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:labels.minutesHoursDaysYears')).')' : '';
01458    }
01459 
01472    function titleAttrib($content='',$hsc=0)  {
01473       global $CLIENT;
01474       $attrib= ($CLIENT['BROWSER']=='net'&&$CLIENT['VERSION']<5)||$CLIENT['BROWSER']=='konqu' ? 'alt' : 'title';
01475       return strcmp($content,'')?' '.$attrib.'="'.($hsc?htmlspecialchars($content):$content).'"' : $attrib;
01476    }
01477 
01485    function titleAltAttrib($content)   {
01486       $out='';
01487       $out.=' alt="'.htmlspecialchars($content).'"';
01488       $out.=' title="'.htmlspecialchars($content).'"';
01489       return $out;
01490    }
01491 
01509    function thumbCode($row,$table,$field,$backPath,$thumbScript='',$uploaddir=NULL,$abs=0,$tparams='',$size='')   {
01510       global $TCA;
01511          // Load table.
01512       t3lib_div::loadTCA($table);
01513 
01514          // Find uploaddir automatically
01515       $uploaddir = (is_null($uploaddir)) ? $TCA[$table]['columns'][$field]['config']['uploadfolder'] : $uploaddir;
01516       $uploaddir = preg_replace('#/$#','',$uploaddir);
01517 
01518          // Set thumbs-script:
01519       if (!$GLOBALS['TYPO3_CONF_VARS']['GFX']['thumbnails'])   {
01520          $thumbScript='gfx/notfound_thumb.gif';
01521       } elseif(!$thumbScript) {
01522          $thumbScript='thumbs.php';
01523       }
01524          // Check and parse the size parameter
01525       $sizeParts=array();
01526       if ($size = trim($size)) {
01527          $sizeParts = explode('x', $size.'x'.$size);
01528          if(!intval($sizeParts[0])) $size='';
01529       }
01530 
01531          // Traverse files:
01532       $thumbs = explode(',', $row[$field]);
01533       $thumbData='';
01534       while(list(,$theFile)=each($thumbs))   {
01535          if (trim($theFile))  {
01536             $fI = t3lib_div::split_fileref($theFile);
01537             $ext = $fI['fileext'];
01538                   // New 190201 start
01539             $max=0;
01540             if (t3lib_div::inList('gif,jpg,png',$ext)) {
01541                $imgInfo=@getimagesize(PATH_site.$uploaddir.'/'.$theFile);
01542                if (is_array($imgInfo)) {$max = max($imgInfo[0],$imgInfo[1]);}
01543             }
01544                // use the original image if it's size fits to the thumbnail size
01545             if ($max && $max<=(count($sizeParts)&&max($sizeParts)?max($sizeParts):56)) {
01546                $url = $uploaddir.'/'.trim($theFile);
01547                $theFile = '../'.$url;
01548                $onClick='top.launchView(\''.$theFile.'\',\'\',\''.$backPath.'\');return false;';
01549                $thumbData.='<a href="#" onclick="'.htmlspecialchars($onClick).'"><img src="../'.$backPath.$url.'" '.$imgInfo[3].' hspace="2" border="0" title="'.trim($url).'"'.$tparams.' alt="" /></a> ';
01550                   // New 190201 stop
01551             } elseif ($ext=='ttf' || t3lib_div::inList($GLOBALS['TYPO3_CONF_VARS']['GFX']['imagefile_ext'],$ext)) {
01552                $theFile = ($abs?'':'../').($uploaddir?$uploaddir.'/':'').trim($theFile);
01553                $params = '&file='.rawurlencode($theFile);
01554                $params .= $size?'&size='.$size:'';
01555                $url = $thumbScript.'?&dummy='.$GLOBALS['EXEC_TIME'].$params;
01556                $onClick='top.launchView(\''.$theFile.'\',\'\',\''.$backPath.'\');return false;';
01557                $thumbData.='<a href="#" onclick="'.htmlspecialchars($onClick).'"><img src="'.htmlspecialchars($backPath.$url).'" hspace="2" border="0" title="'.trim($theFile).'"'.$tparams.' alt="" /></a> ';
01558             } else {
01559                $icon = t3lib_BEfunc::getFileIcon($ext);
01560                $url = 'gfx/fileicons/'.$icon;
01561                $thumbData.='<img src="'.$backPath.$url.'" hspace="2" border="0" title="'.trim($theFile).'"'.$tparams.' alt="" /> ';
01562             }
01563          }
01564       }
01565       return $thumbData;
01566    }
01567 
01578    function getThumbNail($thumbScript,$theFile,$tparams='',$size='') {
01579       $params = '&file='.rawurlencode($theFile);
01580       $params .= trim($size)?'&size='.trim($size):'';
01581       $url = $thumbScript.'?&dummy='.$GLOBALS['EXEC_TIME'].$params;
01582       $th='<img src="'.htmlspecialchars($url).'" title="'.trim(basename($theFile)).'"'.($tparams?" ".$tparams:"").' alt="" />';
01583       return $th;
01584    }
01585 
01595    function titleAttribForPages($row,$perms_clause='',$includeAttrib=1) {
01596       global $TCA,$LANG;
01597       $parts=array();
01598       $parts[] = 'id='.$row['uid'];
01599       if ($row['alias'])   $parts[]=$LANG->sL($TCA['pages']['columns']['alias']['label']).' '.$row['alias'];
01600       if ($row['t3ver_id'])   $parts[] = 'v#'.$row['t3ver_id'];
01601       if ($row['doktype']=='3')  {
01602          $parts[]=$LANG->sL($TCA['pages']['columns']['url']['label']).' '.$row['url'];
01603       } elseif ($row['doktype']=='4')  {
01604          if ($perms_clause)   {
01605             $label = t3lib_BEfunc::getRecordPath(intval($row['shortcut']),$perms_clause,20);
01606          } else {
01607             $lRec = t3lib_BEfunc::getRecord('pages',intval($row['shortcut']),'title');
01608             $label = $lRec['title'];
01609          }
01610          if ($row['shortcut_mode']>0)  {
01611             $label.=', '.$LANG->sL($TCA['pages']['columns']['shortcut_mode']['label']).' '.
01612                      $LANG->sL(t3lib_BEfunc::getLabelFromItemlist('pages','shortcut_mode',$row['shortcut_mode']));
01613          }
01614          $parts[]=$LANG->sL($TCA['pages']['columns']['shortcut']['label']).' '.$label;
01615       } elseif ($row['doktype']=='7')  {
01616          if ($perms_clause)   {
01617             $label = t3lib_BEfunc::getRecordPath(intval($row['mount_pid']),$perms_clause,20);
01618          } else {
01619             $lRec = t3lib_BEfunc::getRecord('pages',intval($row['mount_pid']),'title');
01620             $label = $lRec['title'];
01621          }
01622          $parts[]=$LANG->sL($TCA['pages']['columns']['mount_pid']['label']).' '.$label;
01623          if ($row['mount_pid_ol'])  {
01624             $parts[] = $LANG->sL($TCA['pages']['columns']['mount_pid_ol']['label']);
01625          }
01626       }
01627       if ($row['nav_hide'])   $parts[] = ereg_replace(':$','',$LANG->sL($TCA['pages']['columns']['nav_hide']['label']));
01628       if ($row['hidden'])  $parts[] = $LANG->sL('LLL:EXT:lang/locallang_core.php:labels.hidden');
01629       if ($row['starttime'])  $parts[] = $LANG->sL($TCA['pages']['columns']['starttime']['label']).' '.t3lib_BEfunc::dateTimeAge($row['starttime'],-1,'date');
01630       if ($row['endtime']) $parts[] = $LANG->sL($TCA['pages']['columns']['endtime']['label']).' '.t3lib_BEfunc::dateTimeAge($row['endtime'],-1,'date');
01631       if ($row['fe_group'])   {
01632          if ($row['fe_group']<0) {
01633             $label = $LANG->sL(t3lib_BEfunc::getLabelFromItemlist('pages','fe_group',$row['fe_group']));
01634          } else {
01635             $lRec = t3lib_BEfunc::getRecord('fe_groups',$row['fe_group'],'title');
01636             $label = $lRec['title'];
01637          }
01638          $parts[] = $LANG->sL($TCA['pages']['columns']['fe_group']['label']).' '.$label;
01639       }
01640       $out = htmlspecialchars(implode(' - ',$parts));
01641       return $includeAttrib ? 'title="'.$out.'"' : $out;
01642    }
01643 
01654    function getRecordIconAltText($row,$table='pages') {
01655       if ($table=='pages') {
01656          $out = t3lib_BEfunc::titleAttribForPages($row,'',0);
01657       } else {
01658          $ctrl = $GLOBALS['TCA'][$table]['ctrl']['enablecolumns'];
01659 
01660          $out='id='.$row['uid']; // Uid is added
01661          if ($table=='pages' && $row['alias'])  {
01662             $out.=' / '.$row['alias'];
01663          }
01664          if ($GLOBALS['TCA'][$table]['ctrl']['versioning'] && $row['t3ver_id'])  {
01665             $out.=' - v#'.$row['t3ver_id'];
01666          }
01667          if ($ctrl['disabled'])  {     // Hidden ...
01668             $out.=($row[$ctrl['disabled']]?' - '.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:labels.hidden'):'');
01669          }
01670          if ($ctrl['starttime']) {
01671             if ($row[$ctrl['starttime']] > $GLOBALS['EXEC_TIME']) {
01672                $out.=' - '.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:labels.starttime').':'.t3lib_BEfunc::date($row[$ctrl['starttime']]).' ('.t3lib_BEfunc::daysUntil($row[$ctrl['starttime']]).' '.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:labels.days').')';
01673             }
01674          }
01675          if ($row[$ctrl['endtime']])   {
01676             $out.=' - '.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:labels.endtime').': '.t3lib_BEfunc::date($row[$ctrl['endtime']]).' ('.t3lib_BEfunc::daysUntil($row[$ctrl['endtime']]).' '.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:labels.days').')';
01677          }
01678       }
01679       return htmlspecialchars($out);
01680    }
01681 
01691    function getLabelFromItemlist($table,$col,$key) {
01692       global $TCA;
01693          // Load full TCA for $table
01694       t3lib_div::loadTCA($table);
01695 
01696          // Check, if there is an "items" array:
01697       if (is_array($TCA[$table]) && is_array($TCA[$table]['columns'][$col]) && is_array($TCA[$table]['columns'][$col]['config']['items']))   {
01698             // Traverse the items-array...
01699          reset($TCA[$table]['columns'][$col]['config']['items']);
01700          while(list($k,$v)=each($TCA[$table]['columns'][$col]['config']['items']))  {
01701                // ... and return the first found label where the value was equal to $key
01702             if (!strcmp($v[1],$key))   return $v[0];
01703          }
01704       }
01705    }
01706 
01717    function getItemLabel($table,$col,$printAllWrap='')   {
01718       global $TCA;
01719          // Load full TCA for $table
01720       t3lib_div::loadTCA($table);
01721          // Check if column exists
01722       if (is_array($TCA[$table]) && is_array($TCA[$table]['columns'][$col]))  {
01723             // Re
01724          return $TCA[$table]['columns'][$col]['label'];
01725       }
01726       if ($printAllWrap)   {
01727          $parts = explode('|',$printAllWrap);
01728          return $parts[0].$col.$parts[1];
01729       }
01730    }
01731 
01742    function getRecordTitle($table,$row,$prep=0) {
01743       global $TCA;
01744       if (is_array($TCA[$table]))   {
01745          $t = $row[$TCA[$table]['ctrl']['label']];
01746          if ($TCA[$table]['ctrl']['label_alt'] && ($TCA[$table]['ctrl']['label_alt_force'] || !strcmp($t,''))) {
01747             $altFields=t3lib_div::trimExplode(',',$TCA[$table]['ctrl']['label_alt'],1);
01748             $tA=array();
01749             $tA[]=$t;
01750             while(list(,$fN)=each($altFields))  {
01751                $t = $tA[] = trim(strip_tags($row[$fN]));
01752                if (strcmp($t,'') && !$TCA[$table]['ctrl']['label_alt_force']) break;
01753             }
01754             if ($TCA[$table]['ctrl']['label_alt_force']) $t=implode(', ',$tA);
01755          }
01756          if ($prep)  {
01757             $t = htmlspecialchars(t3lib_div::fixed_lgd_cs($t,$GLOBALS['BE_USER']->uc['titleLen']));
01758             if (!strcmp(trim($t),''))  $t='<em>['.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:labels.no_title',1).']</em>';
01759          }
01760          return $t;
01761       }
01762    }
01763 
01778    function getProcessedValue($table,$col,$value,$fixed_lgd_chars=0,$defaultPassthrough=0)   {
01779       global $TCA;
01780          // Load full TCA for $table
01781       t3lib_div::loadTCA($table);
01782          // Check if table and field is configured:
01783       if (is_array($TCA[$table]) && is_array($TCA[$table]['columns'][$col]))  {
01784             // Depending on the fields configuration, make a meaningful output value.
01785          $theColConf = $TCA[$table]['columns'][$col]['config'];
01786          $l='';
01787          switch((string)$theColConf['type']) {
01788             case 'radio':
01789                $l=t3lib_BEfunc::getLabelFromItemlist($table,$col,$value);
01790             break;
01791             case 'select':
01792                if ($theColConf['MM'])  {
01793                   $l='N/A';
01794                } else {
01795                   $l=t3lib_BEfunc::getLabelFromItemlist($table,$col,$value);
01796                   $l=$GLOBALS['LANG']->sL($l);
01797                   if ($theColConf['foreign_table'] && !$l && $TCA[$theColConf['foreign_table']])   {
01798                      $rParts = t3lib_div::trimExplode(',',$value,1);
01799                      reset($rParts);
01800                      $lA=array();
01801                      while(list(,$rVal)=each($rParts))   {
01802                         $rVal = intval($rVal);
01803                         if ($rVal>0) {
01804                            $r=t3lib_BEfunc::getRecord($theColConf['foreign_table'],$rVal);
01805                         } else {
01806                            $r=t3lib_BEfunc::getRecord($theColConf['neg_foreign_table'],-$rVal);
01807                         }
01808                         if (is_array($r)) {
01809                            $lA[]=$GLOBALS['LANG']->sL($rVal>0?$theColConf['foreign_table_prefix']:$theColConf['neg_foreign_table_prefix']).t3lib_BEfunc::getRecordTitle($rVal>0?$theColConf['foreign_table']:$theColConf['neg_foreign_table'],$r);
01810                         } else {
01811                            $lA[]=$rVal?'['.$rVal.'!]':'';
01812                         }
01813                      }
01814                      $l=implode(',',$lA);
01815                   }
01816                }
01817             break;
01818             case 'check':
01819                if (!is_array($theColConf['items']) || count($theColConf['items'])==1)  {
01820                   $l = $value ? 'Yes' : '';
01821                } else {
01822                   reset($theColConf['items']);
01823                   $lA=Array();
01824                   while(list($key,$val)=each($theColConf['items']))  {
01825                      if ($value & pow(2,$key))  {$lA[]=$GLOBALS['LANG']->sL($val[0]);}
01826                   }
01827                   $l = implode($lA,', ');
01828                }
01829             break;
01830             case 'input':
01831                if ($value) {
01832                   if (t3lib_div::inList($theColConf['eval'],'date')) {
01833                      $l = t3lib_BEfunc::date($value).' ('.(time()-$value>0?'-':'').t3lib_BEfunc::calcAge(abs(time()-$value), $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:labels.minutesHoursDaysYears')).')';
01834                   } elseif (t3lib_div::inList($theColConf['eval'],'time')) {
01835                      $l = t3lib_BEfunc::time($value);
01836                   } elseif (t3lib_div::inList($theColConf['eval'],'datetime'))   {
01837                      $l = t3lib_BEfunc::datetime($value);
01838                   } else {
01839                      $l = $value;
01840                   }
01841                }
01842             break;
01843             default:
01844                if ($defaultPassthrough)   {
01845                   $l=$value;
01846                } elseif ($theColConf['MM'])  {
01847                   $l='N/A';
01848                } elseif ($value) {
01849                   $l=t3lib_div::fixed_lgd_cs(strip_tags($value),200);
01850                }
01851             break;
01852          }
01853          if ($fixed_lgd_chars)   {
01854             return t3lib_div::fixed_lgd_cs($l,$fixed_lgd_chars);
01855          } else {
01856             return $l;
01857          }
01858       }
01859    }
01860 
01872    function getProcessedValueExtra($table,$fN,$fV,$fixed_lgd_chars=0)   {
01873       global $TCA;
01874       $fVnew = t3lib_BEfunc::getProcessedValue($table,$fN,$fV,$fixed_lgd_chars);
01875       if (!isset($fVnew))  {
01876          if (is_array($TCA[$table]))   {
01877             if ($fN==$TCA[$table]['ctrl']['tstamp'] || $fN==$TCA[$table]['ctrl']['crdate'])  {
01878                $fVnew = t3lib_BEfunc::datetime($fV);
01879             } elseif ($fN=='pid'){
01880                $fVnew = t3lib_BEfunc::getRecordPath($fV,'1',20);  // Fetches the path with no regard to the users permissions to select pages.
01881             } else {
01882                $fVnew = $fV;
01883             }
01884          }
01885       }
01886       return $fVnew;
01887    }
01888 
01896    function getFileIcon($ext) {
01897       return $GLOBALS['FILEICONS'][$ext] ? $GLOBALS['FILEICONS'][$ext] : $GLOBALS['FILEICONS']['default'];
01898    }
01899 
01910    function getCommonSelectFields($table,$prefix)  {
01911       global $TCA;
01912       $fields = array();
01913       $fields[] = $prefix.'uid';
01914       $fields[] = $prefix.$TCA[$table]['ctrl']['label'];
01915 
01916       if ($TCA[$table]['ctrl']['label_alt']) {
01917          $secondFields = t3lib_div::trimExplode(',',$TCA[$table]['ctrl']['label_alt'],1);
01918          foreach($secondFields as $fieldN)   {
01919             $fields[] = $prefix.$fieldN;
01920          }
01921       }
01922       if ($TCA[$table]['ctrl']['versioning'])   {
01923          $fields[] = $prefix.'t3ver_id';
01924       }
01925 
01926       if ($TCA[$table]['ctrl']['selicon_field'])   $fields[] = $prefix.$TCA[$table]['ctrl']['selicon_field'];
01927       if ($TCA[$table]['ctrl']['typeicon_column']) $fields[] = $prefix.$TCA[$table]['ctrl']['typeicon_column'];
01928 
01929       if (is_array($TCA[$table]['ctrl']['enablecolumns']))     {
01930          if ($TCA[$table]['ctrl']['enablecolumns']['disabled'])   $fields[] = $prefix.$TCA[$table]['ctrl']['enablecolumns']['disabled'];
01931          if ($TCA[$table]['ctrl']['enablecolumns']['starttime'])  $fields[] = $prefix.$TCA[$table]['ctrl']['enablecolumns']['starttime'];
01932          if ($TCA[$table]['ctrl']['enablecolumns']['endtime']) $fields[] = $prefix.$TCA[$table]['ctrl']['enablecolumns']['endtime'];
01933          if ($TCA[$table]['ctrl']['enablecolumns']['fe_group'])   $fields[] = $prefix.$TCA[$table]['ctrl']['enablecolumns']['fe_group'];
01934       }
01935 
01936       return implode(',',array_unique($fields));
01937    }
01938 
01950    function makeConfigForm($configArray,$defaults,$dataPrefix) {
01951       $params = $defaults;
01952       if (is_array($configArray))   {
01953          reset($configArray);
01954          $lines=array();
01955          while(list($fname,$config)=each($configArray))  {
01956             if (is_array($config))  {
01957                $lines[$fname]='<strong>'.htmlspecialchars($config[1]).'</strong><br />';
01958                $lines[$fname].=$config[2].'<br />';
01959                switch($config[0])   {
01960                   case 'string':
01961                   case 'short':
01962                      $formEl = '<input type="text" name="'.$dataPrefix.'['.$fname.']" value="'.$params[$fname].'"'.$GLOBALS['TBE_TEMPLATE']->formWidth($config[0]=='short'?24:48).' />';
01963                   break;
01964                   case 'check':
01965                      $formEl = '<input type="hidden" name="'.$dataPrefix.'['.$fname.']" value="0" /><input type="checkbox" name="'.$dataPrefix.'['.$fname.']" value="1"'.($params[$fname]?' checked="checked"':'').' />';
01966                   break;
01967                   case 'comment':
01968                      $formEl = '';
01969                   break;
01970                   case 'select':
01971                      reset($config[3]);
01972                      $opt=array();
01973                      while(list($k,$v)=each($config[3])) {
01974                         $opt[]='<option value="'.htmlspecialchars($k).'"'.($params[$fname]==$k?' selected="selected"':'').'>'.htmlspecialchars($v).'</option>';
01975                      }
01976                      $formEl = '<select name="'.$dataPrefix.'['.$fname.']">'.implode('',$opt).'</select>';
01977                   break;
01978                   default:
01979                      debug($config);
01980                   break;
01981                }
01982                $lines[$fname].=$formEl;
01983                $lines[$fname].='<br /><br />';
01984             } else {
01985                $lines[$fname]='<hr />';
01986                if ($config)   $lines[$fname].='<strong>'.strtoupper(htmlspecialchars($config)).'</strong><br />';
01987                if ($config)   $lines[$fname].='<br />';
01988             }
01989          }
01990       }
01991       $out = implode('',$lines);
01992       $out.='<input type="submit" name="submit" value="Update configuration" />';
01993       return $out;
01994    }
01995 
01996 
01997 
01998 
01999 
02000 
02001 
02002 
02003 
02004 
02005 
02006 
02007 
02008    /*******************************************
02009     *
02010     * Backend Modules API functions
02011     *
02012     *******************************************/
02013 
02025    function helpTextIcon($table,$field,$BACK_PATH,$force=0) {
02026       global $TCA_DESCR,$BE_USER;
02027       if (is_array($TCA_DESCR[$table]) && is_array($TCA_DESCR[$table]['columns'][$field]) && ($BE_USER->uc['edit_showFieldHelp']=='icon' || $force))  {
02028          $onClick = 'vHWin=window.open(\''.$BACK_PATH.'view_help.php?tfID='.($table.'.'.$field).'\',\'viewFieldHelp\',\'height=400,width=600,status=0,menubar=0,scrollbars=1\');vHWin.focus();return false;';
02029          return '<a href="#" onclick="'.htmlspecialchars($onClick).'">'.
02030                '<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/helpbubble.gif','width="14" height="14"').' hspace="2" border="0" class="typo3-csh-icon" alt="" />'.
02031                '</a>';
02032       }
02033    }
02034 
02047    function helpText($table,$field,$BACK_PATH,$styleAttrib='') {
02048       global $TCA_DESCR,$BE_USER;
02049       if (is_array($TCA_DESCR[$table]) && is_array($TCA_DESCR[$table]['columns'][$field]) && $BE_USER->uc['edit_showFieldHelp']=='text')  {
02050          $fDat = $TCA_DESCR[$table]['columns'][$field];
02051 
02052             // Get Icon:
02053          $editIcon = t3lib_BEfunc::helpTextIcon(
02054                            $table,
02055                            $field,
02056                            $BACK_PATH,
02057                            TRUE
02058                         );
02059             // Add title?
02060          $onClick = 'vHWin=window.open(\''.$BACK_PATH.'view_help.php?tfID='.($table.'.'.$field).'\',\'viewFieldHelp\',\'height=400,width=600,status=0,menubar=0,scrollbars=1\');vHWin.focus();return false;';
02061          $text =
02062                ($fDat['alttitle'] ? '<h4><a href="#" onclick="'.htmlspecialchars($onClick).'">'.$fDat['alttitle'].'</a></h4>' : '').
02063                $fDat['description'];
02064 
02065             // More information to get?
02066          if ($fDat['image_descr'] || $fDat['seeAlso'] || $fDat['details'] || $fDat['syntax'])   { // || $fDat['image'];
02067             $text.=' <a href="#" onclick="'.htmlspecialchars($onClick).'">'.
02068                   '<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/rel_db.gif','width="13" height="12"').' class="absmiddle typo3-csh-more" alt="" />'.
02069                   '</a>';
02070          }
02071 
02072             // Additional styles?
02073          $params = $styleAttrib ? ' style="'.$styleAttrib.'"' : '';
02074 
02075             // Compile table with CSH information:
02076          return '<table border="0" cellpadding="2" cellspacing="0" class="typo3-csh-inline"'.$params.'>
02077                   <tr>
02078                      <td valign="top" width="14">'.$editIcon.'</td>
02079                      <td valign="top">'.$text.'</td>
02080                   </tr>
02081                </table>';
02082       }
02083    }
02084 
02099    function cshItem($table,$field,$BACK_PATH,$wrap='',$onlyIconMode=FALSE, $styleAttrib='')  {
02100       global $TCA_DESCR, $LANG, $BE_USER;
02101       if ($BE_USER->uc['edit_showFieldHelp'])   {
02102          $LANG->loadSingleTableDescription($table);
02103 
02104          if (is_array($TCA_DESCR[$table]))   {
02105                // Creating CSH icon and short description:
02106             $fullText = t3lib_BEfunc::helpText($table,$field,$BACK_PATH,$styleAttrib);
02107             $icon = t3lib_BEfunc::helpTextIcon($table,$field,$BACK_PATH,$onlyIconMode);
02108 
02109             if ($fullText && !$onlyIconMode) {
02110                $output = $fullText;
02111             } else {
02112                #$output = '<span style="position:absolute; filter: alpha(opacity=50); -moz-opacity: 0.50;">'.$icon.'</span>';
02113                $output = $icon;
02114 
02115                if ($output && $wrap)   {
02116                   $wrParts = explode('|',$wrap);
02117                   $output = $wrParts[0].$output.$wrParts[1];
02118                }
02119             }
02120 
02121             return $output;
02122          }
02123       }
02124    }
02125 
02137    function editOnClick($params,$backPath='',$requestUri='')   {
02138       $retUrl = 'returnUrl='.($requestUri==-1?"'+T3_THIS_LOCATION+'":rawurlencode($requestUri?$requestUri:t3lib_div::getIndpEnv('REQUEST_URI')));
02139       return "document.location='".$backPath."alt_doc.php?".$retUrl.$params."'; return false;";
02140    }
02141 
02155    function viewOnClick($id,$backPath='',$rootLine='',$anchor='',$altUrl='',$addGetVars='')  {
02156       if ($altUrl)   {
02157          $url = $altUrl;
02158       } else {
02159          if ($rootLine) {
02160             $parts = parse_url(t3lib_div::getIndpEnv('TYPO3_SITE_URL'));
02161             if (t3lib_BEfunc::getDomainStartPage($parts['host'],$parts['path'])) {
02162                $preUrl_temp = t3lib_BEfunc::firstDomainRecord($rootLine);
02163             }
02164          }
02165          $preUrl = $preUrl_temp ? 'http://'.$preUrl_temp : $backPath.'..';
02166          $url = $preUrl.'/index.php?id='.$id.$addGetVars.$anchor;
02167       }
02168 
02169       return "previewWin=window.open('".$url."','newTypo3FrontendWindow','status=1,menubar=1,resizable=1,location=1,scrollbars=1,toolbar=1');previewWin.focus();";
02170    }
02171 
02181    function getModTSconfig($id,$TSref) {
02182       $pageTS_modOptions = $GLOBALS['BE_USER']->getTSConfig($TSref,t3lib_BEfunc::getPagesTSconfig($id));
02183       $BE_USER_modOptions = $GLOBALS['BE_USER']->getTSConfig($TSref);
02184       $modTSconfig = t3lib_div::array_merge_recursive_overrule($pageTS_modOptions,$BE_USER_modOptions);
02185       return $modTSconfig;
02186    }
02187 
02202    function getFuncMenu($mainParams,$elementName,$currentValue,$menuItems,$script='',$addparams='')   {
02203       if (is_array($menuItems))  {
02204          if (!is_array($mainParams)) {
02205             $mainParams = array('id' => $mainParams);
02206          }
02207          $mainParams = t3lib_div::implodeArrayForUrl('',$mainParams);
02208 
02209          if (!$script) { $script=basename(PATH_thisScript); }
02210 
02211          $options = array();
02212          foreach($menuItems as $value => $label)   {
02213             $options[] = '<option value="'.htmlspecialchars($value).'"'.(!strcmp($currentValue,$value)?' selected="selected"':'').'>'.
02214                         t3lib_div::deHSCentities(htmlspecialchars($label)).
02215                         '</option>';
02216          }
02217          if (count($options)) {
02218             $onChange = 'jumpToUrl(\''.$script.'?'.$mainParams.$addparams.'&'.$elementName.'=\'+this.options[this.selectedIndex].value,this);';
02219             return '
02220 
02221                <!-- Function Menu of module -->
02222                <select name="'.$elementName.'" onchange="'.htmlspecialchars($onChange).'">
02223                   '.implode('
02224                   ',$options).'
02225                </select>
02226                      ';
02227          }
02228       }
02229    }
02230 
02245    function getFuncCheck($mainParams,$elementName,$currentValue,$script='',$addparams='',$tagParams='')  {
02246       if (!is_array($mainParams)) {
02247          $mainParams = array('id' => $mainParams);
02248       }
02249       $mainParams = t3lib_div::implodeArrayForUrl('',$mainParams);
02250 
02251       if (!$script) {basename(PATH_thisScript);}
02252       $onClick = 'jumpToUrl(\''.$script.'?'.$mainParams.$addparams.'&'.$elementName.'=\'+(this.checked?1:0),this);';
02253       return '<input type="checkbox" name="'.$elementName.'"'.($currentValue?' checked="checked"':'').' onclick="'.htmlspecialchars($onClick).'"'.($tagParams?' '.$tagParams:'').' />';
02254    }
02255 
02270    function getFuncInput($mainParams,$elementName,$currentValue,$size=10,$script="",$addparams="") {
02271       if (!is_array($mainParams)) {
02272          $mainParams = array('id' => $mainParams);
02273       }
02274       $mainParams = t3lib_div::implodeArrayForUrl('',$mainParams);
02275 
02276       if (!$script) {basename(PATH_thisScript);}
02277       $onChange = 'jumpToUrl(\''.$script.'?'.$mainParams.$addparams.'&'.$elementName.'=\'+escape(this.value),this);';
02278       return '<input type="text"'.$GLOBALS['TBE_TEMPLATE']->formWidth($size).' name="'.$elementName.'" value="'.htmlspecialchars($currentValue).'" onchange="'.htmlspecialchars($onChange).'" />';
02279    }
02280 
02291    function unsetMenuItems($modTSconfig,$itemArray,$TSref)  {
02292          // Getting TS-config options for this module for the Backend User:
02293       $conf = $GLOBALS['BE_USER']->getTSConfig($TSref,$modTSconfig);
02294       if (is_array($conf['properties']))  {
02295          reset($conf['properties']);
02296          while(list($key,$val)=each($conf['properties']))   {
02297             if (!$val)  {
02298                unset($itemArray[$key]);
02299             }
02300          }
02301       }
02302       return $itemArray;
02303    }
02304 
02314    function getSetUpdateSignal($set='')   {
02315       global $BE_USER;
02316       $key = 't3lib_BEfunc::getSetUpdateSignal';
02317       $out='';
02318       if ($set)   {
02319          $modData=array();
02320          $modData['set']=$set;
02321          $BE_USER->pushModuleData($key,$modData);
02322       } else {
02323          $modData = $BE_USER->getModuleData($key,'ses');
02324          if (trim($modData['set'])) {
02325             $l=explode(',',$modData['set']);
02326             while(list(,$v)=each($l))  {
02327                switch($v)  {
02328                   case 'updatePageTree':
02329                   case 'updateFolderTree':
02330                      $out.='
02331                <script type="text/javascript">
02332                /*<![CDATA[*/
02333                      if (top.content && top.content.nav_frame && top.content.nav_frame.refresh_nav)   {
02334                         top.content.nav_frame.refresh_nav();
02335                      }
02336                /*]]>*/
02337                </script>';
02338                   break;
02339                }
02340             }
02341             $modData=array();
02342             $modData['set']='';
02343             $BE_USER->pushModuleData($key,$modData);
02344          }
02345       }
02346       return $out;
02347    }
02348 
02349 
02365    function getModuleData($MOD_MENU, $CHANGED_SETTINGS, $modName, $type='', $dontValidateList='', $setDefaultList='')   {
02366 
02367       if ($modName && is_string($modName))   {
02368                // GETTING stored user-data from this module:
02369          $settings = $GLOBALS['BE_USER']->getModuleData($modName,$type);
02370 
02371          $changed=0;
02372          if (!is_array($settings))  {
02373             $changed=1;
02374             $settings=array();
02375          }
02376          if (is_array($MOD_MENU))   {
02377             reset($MOD_MENU);
02378             while(list($key,$var)=each($MOD_MENU)) {
02379                   // If a global var is set before entering here. eg if submitted, then it's substituting the current value the array.
02380                if (is_array($CHANGED_SETTINGS) && isset($CHANGED_SETTINGS[$key]) && strcmp($settings[$key],$CHANGED_SETTINGS[$key]))   {
02381                   $settings[$key] = (string)$CHANGED_SETTINGS[$key];
02382                   $changed=1;
02383                }
02384                   // If the $var is an array, which denotes the existence of a menu, we check if the value is permitted
02385                if (is_array($var) && (!$dontValidateList || !t3lib_div::inList($dontValidateList,$key))) {
02386                      // If the setting is an array or not present in the menu-array, MOD_MENU, then the default value is inserted.
02387                   if (is_array($settings[$key]) || !isset($MOD_MENU[$key][$settings[$key]])) {
02388                      $settings[$key]=(string)key($var);
02389                      $changed=1;
02390                   }
02391                }
02392                if ($setDefaultList && !is_array($var))   {  // Sets default values (only strings/checkboxes, not menus)
02393                   if (t3lib_div::inList($setDefaultList,$key) && !isset($settings[$key])) {
02394                      $settings[$key]=$var;
02395                   }
02396                }
02397             }
02398          } else {die ('No menu!');}
02399 
02400          if ($changed)  {
02401             $GLOBALS['BE_USER']->pushModuleData($modName,$settings);
02402          }
02403 
02404          return  $settings;
02405       } else {die ('Wrong module name: "'.$modName.'"');}
02406    }
02407 
02408 
02409 
02410 
02411 
02412 
02413 
02414 
02415 
02416 
02417 
02418 
02419 
02420    /*******************************************
02421     *
02422     * Core
02423     *
02424     *******************************************/
02425 
02426 
02427 
02440    function lockRecords($table='',$uid=0,$pid=0)   {
02441       $user_id = intval($GLOBALS['BE_USER']->user['uid']);
02442       if ($table && $uid)  {
02443          $fields_values = array(
02444             'userid' => $user_id,
02445             'tstamp' => $GLOBALS['EXEC_TIME'],
02446             'record_table' => $table,
02447             'record_uid' => $uid,
02448             'username' => $GLOBALS['BE_USER']->user['username'],
02449             'record_pid' => $pid
02450          );
02451 
02452          $GLOBALS['TYPO3_DB']->exec_INSERTquery('sys_lockedrecords', $fields_values);
02453       } else {
02454          $GLOBALS['TYPO3_DB']->exec_DELETEquery('sys_lockedrecords', 'userid='.intval($user_id));
02455       }
02456    }
02457 
02469    function isRecordLocked($table,$uid)   {
02470       global $LOCKED_RECORDS;
02471       if (!is_array($LOCKED_RECORDS))  {
02472          $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
02473                      '*',
02474                      'sys_lockedrecords',
02475                      'sys_lockedrecords.userid!='.intval($GLOBALS['BE_USER']->user['uid']).'
02476                         AND sys_lockedrecords.tstamp > '.($GLOBALS['EXEC_TIME']-2*3600)
02477                   );
02478          while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))   {
02479             $LOCKED_RECORDS[$row['record_table'].':'.$row['record_uid']]=$row;
02480             $LOCKED_RECORDS[$row['record_table'].':'.$row['record_uid']]['msg']=sprintf(
02481                $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:labels.lockedRecord'),
02482                $row['username'],
02483                t3lib_BEfunc::calcAge($GLOBALS['EXEC_TIME']-$row['tstamp'],$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:labels.minutesHoursDaysYears'))
02484             );
02485             if ($row['record_pid'] && !isset($LOCKED_RECORDS[$row['record_table'].':'.$row['record_pid']])) {
02486                $LOCKED_RECORDS['pages:'.$row['record_pid']]['msg']=sprintf(
02487                   $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:labels.lockedRecord_content'),
02488                   $row['username'],
02489                   t3lib_BEfunc::calcAge($GLOBALS['EXEC_TIME']-$row['tstamp'],$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:labels.minutesHoursDaysYears'))
02490                );
02491             }
02492          }
02493       }
02494       return $LOCKED_RECORDS[$table.':'.$uid];
02495    }
02496 
02509    function exec_foreign_table_where_query($fieldValue,$field='',$TSconfig=array(),$prefix='')  {
02510       global $TCA;
02511       $foreign_table = $fieldValue['config'][$prefix.'foreign_table'];
02512       $rootLevel = $TCA[$foreign_table]['ctrl']['rootLevel'];
02513 
02514       $fTWHERE = $fieldValue['config'][$prefix.'foreign_table_where'];
02515       if (strstr($fTWHERE,'###REC_FIELD_'))  {
02516          $fTWHERE_parts = explode('###REC_FIELD_',$fTWHERE);
02517          while(list($kk,$vv)=each($fTWHERE_parts)) {
02518             if ($kk) {
02519                $fTWHERE_subpart = explode('###',$vv,2);
02520                $fTWHERE_parts[$kk]=$TSconfig['_THIS_ROW'][$fTWHERE_subpart[0]].$fTWHERE_subpart[1];
02521             }
02522          }
02523          $fTWHERE = implode('',$fTWHERE_parts);
02524       }
02525 
02526       $fTWHERE = str_replace('###CURRENT_PID###',intval($TSconfig['_CURRENT_PID']),$fTWHERE);
02527       $fTWHERE = str_replace('###THIS_UID###',intval($TSconfig['_THIS_UID']),$fTWHERE);
02528       $fTWHERE = str_replace('###THIS_CID###',intval($TSconfig['_THIS_CID']),$fTWHERE);
02529       $fTWHERE = str_replace('###STORAGE_PID###',intval($TSconfig['_STORAGE_PID']),$fTWHERE);
02530       $fTWHERE = str_replace('###SITEROOT###',intval($TSconfig['_SITEROOT']),$fTWHERE);
02531       $fTWHERE = str_replace('###PAGE_TSCONFIG_ID###',intval($TSconfig[$field]['PAGE_TSCONFIG_ID']),$fTWHERE);
02532       $fTWHERE = str_replace('###PAGE_TSCONFIG_IDLIST###',$GLOBALS['TYPO3_DB']->cleanIntList($TSconfig[$field]['PAGE_TSCONFIG_IDLIST']),$fTWHERE);
02533       $fTWHERE = str_replace('###PAGE_TSCONFIG_STR###',$GLOBALS['TYPO3_DB']->quoteStr($TSconfig[$field]['PAGE_TSCONFIG_STR'], $foreign_table),$fTWHERE);
02534 
02535          // rootLevel = -1 is not handled 'properly' here - it goes as if it was rootLevel = 1 (that is pid=0)
02536       $wgolParts = $GLOBALS['TYPO3_DB']->splitGroupOrderLimit($fTWHERE);
02537       if ($rootLevel)   {
02538          $queryParts = array(
02539             'SELECT' => t3lib_BEfunc::getCommonSelectFields($foreign_table,$foreign_table.'.'),
02540             'FROM' => $foreign_table,
02541             'WHERE' => $foreign_table.'.pid=0 '.
02542                      t3lib_BEfunc::deleteClause($foreign_table).' '.
02543                      $wgolParts['WHERE'],
02544             'GROUPBY' => $wgolParts['GROUPBY'],
02545             'ORDERBY' => $wgolParts['ORDERBY'],
02546             'LIMIT' => $wgolParts['LIMIT']
02547          );
02548       } else {
02549          $pageClause = $GLOBALS['BE_USER']->getPagePermsClause(1);
02550          if ($foreign_table!='pages')  {
02551             $queryParts = array(
02552                'SELECT' => t3lib_BEfunc::getCommonSelectFields($foreign_table,$foreign_table.'.'),
02553                'FROM' => $foreign_table.',pages',
02554                'WHERE' => 'pages.uid='.$foreign_table.'.pid
02555                         AND NOT pages.deleted '.
02556                         t3lib_BEfunc::deleteClause($foreign_table).
02557                         ' AND '.$pageClause.' '.
02558                         $wgolParts['WHERE'],
02559                'GROUPBY' => $wgolParts['GROUPBY'],
02560                'ORDERBY' => $wgolParts['ORDERBY'],
02561                'LIMIT' => $wgolParts['LIMIT']
02562             );
02563          } else {
02564             $queryParts = array(
02565                'SELECT' => t3lib_BEfunc::getCommonSelectFields($foreign_table,$foreign_table.'.'),
02566                'FROM' => 'pages',
02567                'WHERE' => 'NOT pages.deleted
02568                         AND '.$pageClause.' '.
02569                         $wgolParts['WHERE'],
02570                'GROUPBY' => $wgolParts['GROUPBY'],
02571                'ORDERBY' => $wgolParts['ORDERBY'],
02572                'LIMIT' => $wgolParts['LIMIT']
02573             );
02574          }
02575       }
02576 
02577       return $GLOBALS['TYPO3_DB']->exec_SELECT_queryArray($queryParts);
02578    }
02579 
02590    function getTCEFORM_TSconfig($table,$row) {
02591       $res = array();
02592       $typeVal = t3lib_BEfunc::getTCAtypeValue($table,$row);
02593 
02594          // Get main config for the table
02595       list($TScID,$cPid) = t3lib_BEfunc::getTSCpid($table,$row['uid'],$row['pid']);
02596 
02597       $rootLine = t3lib_BEfunc::BEgetRootLine($TScID,'');
02598       if ($TScID>=0) {
02599          $tempConf = $GLOBALS['BE_USER']->getTSConfig('TCEFORM.'.$table,t3lib_BEfunc::getPagesTSconfig($TScID,$rootLine));
02600          if (is_array($tempConf['properties'])) {
02601             while(list($key,$val)=each($tempConf['properties']))  {
02602                if (is_array($val))  {
02603                   $fieldN = substr($key,0,-1);
02604                   $res[$fieldN] = $val;
02605                   unset($res[$fieldN]['types.']);
02606                   if (strcmp($typeVal,'') && is_array($val['types.'][$typeVal.'.']))   {
02607                      $res[$fieldN] = t3lib_div::array_merge_recursive_overrule($res[$fieldN],$val['types.'][$typeVal.'.']);
02608                   }
02609                }
02610             }
02611          }
02612       }
02613       $res['_CURRENT_PID']=$cPid;
02614       $res['_THIS_UID']=$row['uid'];
02615       $res['_THIS_CID']=$row['cid'];
02616       $res['_THIS_ROW']=$row; // So the row will be passed to foreign_table_where_query()
02617       reset($rootLine);
02618       while(list(,$rC)=each($rootLine))   {
02619          if (!$res['_STORAGE_PID']) $res['_STORAGE_PID']=intval($rC['storage_pid']);
02620          if (!$res['_SITEROOT']) $res['_SITEROOT']=$rC['is_siteroot']?intval($rC['uid']):0;
02621       }
02622 
02623       return $res;
02624    }
02625 
02637    function getTSconfig_pidValue($table,$uid,$pid) {
02638       if (t3lib_div::testInt($pid)) {  // If pid is an integer this takes precedence in our lookup.
02639          $thePidValue = intval($pid);
02640          if ($thePidValue<0)  {  // If ref to another record, look that record up.
02641             $pidRec = t3lib_BEfunc::getRecord($table,abs($thePidValue),'pid');
02642             $thePidValue= is_array($pidRec) ? $pidRec['pid'] : -2;   // Returns -2 if the record did not exist.
02643          }
02644          // ... else the pos/zero pid is just returned here.
02645       } else { // No integer pid and we are forced to look up the $pid
02646          $rr = t3lib_BEfunc::getRecord($table,$uid,'pid');  // Try to fetch the record pid from uid. If the uid is 'NEW...' then this will of course return nothing...
02647          if (is_array($rr))   {
02648             $thePidValue = $rr['pid']; // Returning the 'pid' of the record
02649          } else $thePidValue=-1; // Returns -1 if the record with the pid was not found.
02650       }
02651       return $thePidValue;
02652    }
02653 
02665    function getPidForModTSconfig($table,$uid,$pid) {
02666       $retVal = ($table=='pages' && t3lib_div::testInt($uid)) ? $uid : $pid;
02667       return $retVal;
02668    }
02669 
02681    function getTSCpid($table,$uid,$pid)   {
02682          // If pid is negative (referring to another record) the pid of the other record is fetched and returned.
02683       $cPid = t3lib_BEfunc::getTSconfig_pidValue($table,$uid,$pid);
02684          // $TScID is the id of $table=pages, else it's the pid of the record.
02685       $TScID = t3lib_BEfunc::getPidForModTSconfig($table,$uid,$cPid);
02686 
02687       return array($TScID,$cPid);
02688    }
02689 
02697    function firstDomainRecord($rootLine)  {
02698       if (t3lib_extMgm::isLoaded('cms'))  {
02699          reset($rootLine);
02700          while(list(,$row)=each($rootLine))  {
02701             $dRec = t3lib_BEfunc::getRecordsByField('sys_domain','pid',$row['uid'],' AND redirectTo="" AND hidden=0', '', 'sorting');
02702             if (is_array($dRec)) {
02703                reset($dRec);
02704                $dRecord = current($dRec);
02705                return ereg_replace('\/$','',$dRecord['domainName']);
02706             }
02707          }
02708       }
02709    }
02710 
02719    function getDomainStartPage($domain, $path='')  {
02720       if (t3lib_extMgm::isLoaded('cms'))  {
02721          $domain = explode(':',$domain);
02722          $domain = strtolower(ereg_replace('\.$','',$domain[0]));
02723             // path is calculated.
02724          $path = trim(ereg_replace('\/[^\/]*$','',$path));
02725             // stuff:
02726          $domain.=$path;
02727 
02728          $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('sys_domain.*', 'pages,sys_domain', '
02729             pages.uid=sys_domain.pid
02730             AND NOT sys_domain.hidden
02731             AND (sys_domain.domainName="'.$GLOBALS['TYPO3_DB']->quoteStr($domain, 'sys_domain').'" or sys_domain.domainName="'.$GLOBALS['TYPO3_DB']->quoteStr($domain.'/', 'sys_domain').'")'.
02732             t3lib_BEfunc::deleteClause('pages'),
02733             '', '', '1');
02734          return $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res);
02735       }
02736    }
02737 
02746    function selectVersionsOfRecord($table, $uid, $fields='*')  {
02747       global $TCA;
02748 
02749       if ($TCA[$table] && $TCA[$table]['ctrl']['versioning'])  {
02750 
02751             // Select all versions of record:
02752          $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
02753             $fields,
02754             $table,
02755             '(t3ver_oid='.intval($uid).' || uid='.intval($uid).')'.
02756                t3lib_BEfunc::deleteClause($table),
02757             '',
02758             't3ver_id DESC'
02759          );
02760 
02761             // Add rows to output array:
02762          $realPid = 0;
02763          $outputRows = array();
02764          while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))   {
02765             if ($uid==$row['uid'])  {
02766                $row['_CURRENT_VERSION']=TRUE;
02767                $realPid = $row['pid'];
02768             }
02769             $outputRows[] = $row;
02770          }
02771 
02772             // Set real-pid:
02773          foreach($outputRows as $idx => $oRow)  {
02774             $outputRows[$idx]['_REAL_PID'] = $realPid;
02775          }
02776 
02777          return $outputRows;
02778       }
02779    }
02780 
02792    function RTEsetup($RTEprop,$table,$field,$type='') {
02793       $thisConfig = is_array($RTEprop['default.']) ? $RTEprop['default.'] : array();
02794       $thisFieldConf = $RTEprop['config.'][$table.'.'][$field.'.'];
02795       if (is_array($thisFieldConf)) {
02796          unset($thisFieldConf['types.']);
02797          $thisConfig = t3lib_div::array_merge_recursive_overrule($thisConfig,$thisFieldConf);
02798       }
02799       if ($type && is_array($RTEprop['config.'][$table.'.'][$field.'.']['types.'][$type.'.']))  {
02800          $thisConfig = t3lib_div::array_merge_recursive_overrule($thisConfig,$RTEprop['config.'][$table.'.'][$field.'.']['types.'][$type.'.']);
02801       }
02802       return $thisConfig;
02803    }
02804 
02810    function &RTEgetObj()   {
02811 
02812          // If no RTE object has been set previously, try to create it:
02813       if (!isset($GLOBALS['TYPO3_CONF_VARS']['T3_VAR']['RTEobj']))   {
02814 
02815             // Set the object string to blank by default:
02816          $GLOBALS['TYPO3_CONF_VARS']['T3_VAR']['RTEobj'] = array();
02817 
02818             // Traverse registered RTEs:
02819          if (is_array($GLOBALS['TYPO3_CONF_VARS']['BE']['RTE_reg'])) {
02820             foreach($GLOBALS['TYPO3_CONF_VARS']['BE']['RTE_reg'] as $extKey => $rteObjCfg)   {
02821                $rteObj = &t3lib_div::getUserObj($rteObjCfg['objRef']);
02822                if (is_object($rteObj)) {
02823                   if ($rteObj->isAvailable())   {
02824                      $GLOBALS['TYPO3_CONF_VARS']['T3_VAR']['RTEobj'] = &$rteObj;
02825                      break;
02826                   } else {
02827                      $GLOBALS['TYPO3_CONF_VARS']['T3_VAR']['RTEobj'] = array_merge($GLOBALS['TYPO3_CONF_VARS']['T3_VAR']['RTEobj'], $rteObj->errorLog);
02828                   }
02829                }
02830             }
02831          }
02832 
02833          if (!count($GLOBALS['TYPO3_CONF_VARS']['T3_VAR']['RTEobj']))   {
02834             $GLOBALS['TYPO3_CONF_VARS']['T3_VAR']['RTEobj'][] = 'No RTEs configured at all';
02835          }
02836       }
02837 
02838          // Return RTE object (if any!)
02839       return $GLOBALS['TYPO3_CONF_VARS']['T3_VAR']['RTEobj'];
02840    }
02841 
02849    function isModuleSetInTBE_MODULES($modName)  {
02850       reset($GLOBALS['TBE_MODULES']);
02851       $loaded=array();
02852       while(list($mkey,$list)=each($GLOBALS['TBE_MODULES']))   {
02853          $loaded[$mkey]=1;
02854          if (trim($list))  {
02855             $subList = t3lib_div::trimExplode(',',$list,1);
02856             while(list(,$skey)=each($subList))  {
02857                $loaded[$mkey.'_'.$skey]=1;
02858             }
02859          }
02860       }
02861       return $modName && isset($loaded[$modName]);
02862    }
02863 
02864 
02865 
02866 
02867 
02868 
02869 
02870 
02871 
02872 
02873 
02874 
02875 
02876 
02877 
02878 
02879 
02880 
02881    /*******************************************
02882     *
02883     * Miscellaneous
02884     *
02885     *******************************************/
02886 
02887 
02898    function typo3PrintError($header,$text,$js='',$head=1)   {
02899          // This prints out a TYPO3 error message.
02900          // If $js is set the message will be output in JavaScript
02901       if ($js) {
02902          echo "alert('".t3lib_div::slashJS($header.'\n'.$text)."');";
02903       } else {
02904          echo $head?'<html>
02905             <head>
02906                <title>Error!</title>
02907             </head>
02908             <body bgcolor="white" topmargin="0" leftmargin="0" marginwidth="0" marginheight="0">':'';
02909          echo '<div align="center">
02910                <table border="0" cellspacing="0" cellpadding="0" width="333">
02911                   <tr>
02912                      <td align="center">'.
02913                         ($GLOBALS['TBE_STYLES']['logo_login']?'<img src="'.$GLOBALS['BACK_PATH'].$GLOBALS['TBE_STYLES']['logo_login'].'" alt="" />':'<img src="'.$GLOBALS['BACK_PATH'].'gfx/typo3logo.gif" width="333" height="43" vspace="10" />').
02914                      '</td>
02915                   </tr>
02916                   <tr>
02917                      <td bgcolor="black">
02918                         <table width="100%" border="0" cellspacing="1" cellpadding="10">
02919                            <tr>
02920                               <td bgcolor="#F4F0E8">
02921                                  <font face="verdana,arial,helvetica" size="2">';
02922          echo '<b><center><font size="+1">'.$header.'</font></center></b><br />'.$text;
02923          echo '                     </font>
02924                               </td>
02925                            </tr>
02926                         </table>
02927                      </td>
02928                   </tr>
02929                </table>
02930             </div>';
02931          echo $head?'
02932             </body>
02933          </html>':'';
02934       }
02935    }
02936 
02942    function TYPO3_copyRightNotice() {
02943       global $TYPO3_CONF_VARS;
02944 
02945          // COPYRIGHT NOTICE:
02946       $loginCopyrightWarrantyProvider = strip_tags(trim($TYPO3_CONF_VARS['SYS']['loginCopyrightWarrantyProvider']));
02947       $loginCopyrightWarrantyURL = strip_tags(trim($TYPO3_CONF_VARS['SYS']['loginCopyrightWarrantyURL']));
02948 
02949       if (strlen($loginCopyrightWarrantyProvider)>=2 && strlen($loginCopyrightWarrantyURL)>=10) {
02950          $warrantyNote='Warranty is supplied by '.htmlspecialchars($loginCopyrightWarrantyProvider).'; <a href="'.htmlspecialchars($loginCopyrightWarrantyURL).'" target="_blank">click for details.</a>';
02951       } else {
02952          $warrantyNote='TYPO3 comes with ABSOLUTELY NO WARRANTY; <a href="http://typo3.com/1316.0.html" target="_blank">click for details.</a>';
02953       }
02954       $cNotice = '<a href="http://typo3.com/" target="_blank"><img src="gfx/loginlogo_transp.gif" width="75" vspace="2" height="19" alt="TYPO3 logo" align="left" />TYPO3 CMS ver. '.htmlspecialchars($GLOBALS['TYPO_VERSION']).'</a>. Copyright &copy; 1998-2004 Kasper Sk&aring;rh&oslash;j. Extensions are copyright of their respective owners. Go to <a href="http://typo3.com/" target="_blank">http://typo3.com/</a> for details.
02955       '.strip_tags($warrantyNote,'<a>').' This is free software, and you are welcome to redistribute it under certain conditions; <a href="http://typo3.com/1316.0.html" target="_blank">click for details</a>. Obstructing the appearance of this notice is prohibited by law.';
02956 
02957       return $cNotice;
02958    }
02959 
02967    function getPathType_web_nonweb($path) {
02968       return t3lib_div::isFirstPartOfStr($path,t3lib_div::getIndpEnv('TYPO3_DOCUMENT_ROOT')) ? 'web' : '';
02969    }
02970 
02979    function ADMCMD_previewCmds($pageinfo) {
02980       if ($pageinfo['fe_group']>0)  {
02981          $simUser = '&ADMCMD_simUser='.$pageinfo['fe_group'];
02982       }
02983       if ($pageinfo['starttime']>time())  {
02984          $simTime = '&ADMCMD_simTime='.$pageinfo['starttime'];
02985       }
02986       if ($pageinfo['endtime']<time() && $pageinfo['endtime']!=0) {
02987          $simTime = '&ADMCMD_simTime='.($pageinfo['endtime']-1);
02988       }
02989       return $simUser.$simTime;
02990    }
02991 
03001    function processParams($params)  {
03002       $paramArr=array();
03003       $lines=explode(chr(10),$params);
03004       while(list(,$val)=each($lines))  {
03005          $val = trim($val);
03006          if ($val)   {
03007             $pair = explode('=',$val,2);
03008             $paramArr[trim($pair[0])] = trim($pair[1]);
03009          }
03010       }
03011       return $paramArr;
03012    }
03013 
03027    function getListOfBackendModules($name,$perms_clause,$backPath='',$script='index.php') {
03028       $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*', 'pages', 'doktype!=255 AND module IN ("'.implode('","',$name).'") AND'.$perms_clause.t3lib_BEfunc::deleteClause('pages'));
03029       if (!$GLOBALS['TYPO3_DB']->sql_num_rows($res))  return false;
03030 
03031       $out='';
03032       $theRows=array();
03033       while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))   {
03034          $theRows[]=$row;
03035          $out.='<span class="nobr"><a href="'.htmlspecialchars($script.'?id='.$row['uid']).'">'.
03036                t3lib_iconWorks::getIconImage('pages',$row,$backPath,'title="'.htmlspecialchars(t3lib_BEfunc::getRecordPath($row['uid'],$perms_clause,20)).'" align="top"').
03037                htmlspecialchars($row['title']).
03038                '</a></span><br />';
03039       }
03040       return array('rows'=>$theRows,'list'=>$out);
03041    }
03042 }
03043 ?>

Generated on Sun Oct 3 01:05:46 2004 for TYPO3core 3.7.0 dev by  doxygen 1.3.8-20040913