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

class.t3lib_admin.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 ***************************************************************/
00090 class t3lib_admin {
00091    var $genTree_includeDeleted = 1; // if set, genTree() includes deleted pages. This is default.
00092    var $perms_clause='';      // extra where-clauses for the tree-selection
00093    var $genTree_makeHTML = 0;       // if set, genTree() generates HTML, that visualizes the tree.
00094       // internal
00095    var $genTree_idlist = '';  // Will hold the id-list from genTree()
00096    var $getTree_HTML = '';    // Will hold the HTML-code visualising the tree. genTree()
00097    var $backPath='';
00098 
00099       // internal
00100    var $checkFileRefs = Array();
00101    var $checkSelectDBRefs = Array();   // From the select-fields
00102    var $checkGroupDBRefs = Array(); // From the group-fields
00103 
00104    var $page_idArray=Array();
00105    var $recStat = Array();
00106    var $lRecords = Array();
00107    var $lostPagesList = '';
00108 
00116    function genTree($theID, $depthData)   {
00117       $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
00118                'uid,title,doktype,deleted'.(t3lib_extMgm::isLoaded('cms')?',hidden':''),
00119                'pages',
00120                'pid='.intval($theID).' '.((!$this->genTree_includeDeleted)?'AND deleted=0':'').$this->perms_clause,
00121                '',
00122                'sorting'
00123             );
00124       $a=0;
00125       $c = $GLOBALS['TYPO3_DB']->sql_num_rows($res);
00126       while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))  {
00127          $a++;
00128          $newID =$row['uid'];
00129          if ($this->genTree_makeHTML)  {
00130             $this->genTree_HTML.=chr(10).'<div><span class="nobr">';
00131             $PM = 'join';
00132             $LN = ($a==$c)?'blank':'line';
00133             $BTM = ($a==$c)?'bottom':'';
00134             $this->genTree_HTML.= $depthData.'<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/ol/'.$PM.$BTM.'.gif','width="18" height="16"').' align="top" alt="" />'.t3lib_iconWorks::getIconImage('pages',$row,$this->backPath,'align="top"').htmlspecialchars($row['uid'].': '.t3lib_div::fixed_lgd_cs(strip_tags($row['title']),50)).'</span></div>';
00135          }
00136 
00137          if (isset($page_idlist[$newID])) {
00138             $this->recStat['doublePageID'][]=$newID;
00139          }
00140          $this->page_idArray[$newID]=$newID;
00141          if ($row['deleted']) {$this->recStat['deleted']++;}
00142          if ($row['hidden']) {$this->recStat['hidden']++;}
00143          $this->recStat['doktype'][$row['doktype']]++;
00144 
00145          $this->genTree($newID,$this->genTree_HTML ? $depthData.'<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/ol/'.$LN.'.gif','width="18" height="16"').' align="top" alt="" />'  : '');
00146       }
00147       return $GLOBALS['TYPO3_DB']->sql_num_rows($res);
00148    }
00149 
00156    function lostRecords($pid_list)  {
00157       global $TCA;
00158       reset($TCA);
00159       $this->lostPagesList='';
00160       if ($pid_list) {
00161          while (list($table)=each($TCA))  {
00162             t3lib_div::loadTCA($table);
00163             $garbage = $GLOBALS['TYPO3_DB']->exec_SELECTquery (
00164                         'uid,pid,'.$TCA[$table]['ctrl']['label'],
00165                         $table,
00166                         'pid NOT IN ('.$pid_list.')'
00167                      );
00168             $lostIdList=Array();
00169             while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($garbage)) {
00170                $this->lRecords[$table][$row['uid']]=Array('uid'=>$row['uid'], 'pid'=>$row['pid'], 'title'=> strip_tags($row[$TCA[$table]['ctrl']['label']]) );
00171                $lostIdList[]=$row['uid'];
00172             }
00173             if ($table=='pages') {
00174                $this->lostPagesList=implode(',',$lostIdList);
00175             }
00176          }
00177       }
00178    }
00179 
00187    function fixLostRecord($table,$uid) {
00188       if ($table && $GLOBALS['TCA'][$table] && $uid && is_array($this->lRecords[$table][$uid]) && $GLOBALS['BE_USER']->user['admin'])  {
00189 
00190          $updateFields = array();
00191          $updateFields['pid'] = 0;
00192          if ($GLOBALS['TCA'][$table]['ctrl']['enablecolumns']['disabled']) {  // If possible a lost record restored is hidden as default
00193             $updateFields[$GLOBALS['TCA'][$table]['ctrl']['enablecolumns']['disabled']] = 1;
00194          }
00195 
00196          $GLOBALS['TYPO3_DB']->exec_UPDATEquery($table, 'uid='.intval($uid), $updateFields);
00197 
00198          return TRUE;
00199       } else return FALSE;
00200    }
00201 
00208    function countRecords($pid_list) {
00209       global $TCA;
00210       reset($TCA);
00211       $list=Array();
00212       $list_n=Array();
00213       if ($pid_list) {
00214          while (list($table)=each($TCA))  {
00215             t3lib_div::loadTCA($table);
00216             $count = $GLOBALS['TYPO3_DB']->exec_SELECTquery('count(*)', $table, 'pid IN ('.$pid_list.')');
00217             if ($row = $GLOBALS['TYPO3_DB']->sql_fetch_row($count))  {
00218                $list[$table]=$row[0];
00219             }
00220 
00221             $count = $GLOBALS['TYPO3_DB']->exec_SELECTquery('count(*)', $table, 'pid IN ('.$pid_list.')'.t3lib_BEfunc::deleteClause($table));
00222             if ($row = $GLOBALS['TYPO3_DB']->sql_fetch_row($count))  {
00223                $list_n[$table]=$row[0];
00224             }
00225          }
00226       }
00227       return array('all' => $list, 'non_deleted' => $list_n);
00228    }
00229 
00236    function getGroupFields($mode)   {
00237       global $TCA;
00238       reset ($TCA);
00239       $result = Array();
00240       while (list($table)=each($TCA))  {
00241          t3lib_div::loadTCA($table);
00242          $cols = $TCA[$table]['columns'];
00243          reset ($cols);
00244          while (list($field,$config)=each($cols))  {
00245             if ($config['config']['type']=='group')   {
00246                if (
00247                   ((!$mode||$mode=='file') && $config['config']['internal_type']=='file') ||
00248                   ((!$mode||$mode=='db') && $config['config']['internal_type']=='db')
00249                   )  {
00250                   $result[$table][]=$field;
00251                }
00252             }
00253             if ( (!$mode||$mode=='db') && $config['config']['type']=='select' && $config['config']['foreign_table']) {
00254                $result[$table][]=$field;
00255             }
00256          }
00257          if ($result[$table]) {
00258             $result[$table] = implode(',',$result[$table]);
00259          }
00260       }
00261       return $result;
00262    }
00263 
00270    function getFileFields($uploadfolder)  {
00271       global $TCA;
00272       reset ($TCA);
00273       $result = Array();
00274       while (list($table)=each($TCA))  {
00275          t3lib_div::loadTCA($table);
00276          $cols = $TCA[$table]['columns'];
00277          reset ($cols);
00278          while (list($field,$config)=each($cols))  {
00279             if ($config['config']['type']=='group' && $config['config']['internal_type']=='file' && $config['config']['uploadfolder']==$uploadfolder) {
00280                $result[]=Array($table,$field);
00281             }
00282          }
00283       }
00284       return $result;
00285    }
00286 
00293    function getDBFields($theSearchTable)  {
00294       global $TCA;
00295       $result = Array();
00296       reset ($TCA);
00297       while (list($table)=each($TCA))  {
00298          t3lib_div::loadTCA($table);
00299          $cols = $TCA[$table]['columns'];
00300          reset ($cols);
00301          while (list($field,$config)=each($cols))  {
00302             if ($config['config']['type']=='group' && $config['config']['internal_type']=='db') {
00303                if (trim($config['config']['allowed'])=='*' || strstr($config['config']['allowed'],$theSearchTable))  {
00304                   $result[]=Array($table,$field);
00305                }
00306             } else if ($config['config']['type']=='select' && $config['config']['foreign_table']==$theSearchTable)   {
00307                $result[]=Array($table,$field);
00308             }
00309          }
00310       }
00311       return $result;
00312    }
00313 
00321    function selectNonEmptyRecordsWithFkeys($fkey_arrays) {
00322       global $TCA;
00323       if (is_array($fkey_arrays))   {
00324          reset($fkey_arrays);
00325          while (list($table,$field_list)=each($fkey_arrays))   {
00326             if ($TCA[$table] && trim($field_list)) {
00327                t3lib_div::loadTCA($table);
00328                $fieldArr = explode(',',$field_list);
00329                $cl_fl = implode ('!="" OR ',$fieldArr). '!=""';
00330                $mres = $GLOBALS['TYPO3_DB']->exec_SELECTquery('uid,'.$field_list, $table, $cl_fl);
00331                while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($mres)) {
00332                   reset($fieldArr);
00333                   while (list(,$field)=each($fieldArr))  {
00334                      if (trim($row[$field]))    {
00335                         $fieldConf = $TCA[$table]['columns'][$field]['config'];
00336                         if ($fieldConf['type']=='group') {
00337                            if ($fieldConf['internal_type']=='file')  {
00338                               // files...
00339                               if ($fieldConf['MM'])   {
00340                                  $tempArr=array();
00341                                  $dbAnalysis = t3lib_div::makeInstance('t3lib_loadDBGroup');
00342                                  $dbAnalysis->start('','files',$fieldConf['MM'],$row['uid']);
00343                                  reset($dbAnalysis->itemArray);
00344                                  while (list($somekey,$someval)=each($dbAnalysis->itemArray))   {
00345                                     if ($someval['id'])  {
00346                                        $tempArr[]=$someval['id'];
00347                                     }
00348                                  }
00349                               } else {
00350                                  $tempArr = explode(',',trim($row[$field]));
00351                               }
00352                               reset($tempArr);
00353                               while (list(,$file)=each($tempArr)) {
00354                                  $file = trim($file);
00355                                  if ($file)  {
00356                                     $this->checkFileRefs[$fieldConf['uploadfolder']][$file]+=1;
00357                                  }
00358                               }
00359                            }
00360                            if ($fieldConf['internal_type']=='db') {
00361                               // dbs - group
00362                               $dbAnalysis = t3lib_div::makeInstance('t3lib_loadDBGroup');
00363                               $dbAnalysis->start($row[$field],$fieldConf['allowed'],$fieldConf['MM'],$row['uid']);
00364                               reset($dbAnalysis->itemArray);
00365                               while (list(,$tempArr)=each($dbAnalysis->itemArray))  {
00366                                  $this->checkGroupDBRefs[$tempArr['table']][$tempArr['id']]+=1;
00367                               }
00368                            }
00369                         }
00370                         if ($fieldConf['type']=='select' && $fieldConf['foreign_table'])  {
00371                            // dbs - select
00372                            $dbAnalysis = t3lib_div::makeInstance('t3lib_loadDBGroup');
00373                            $dbAnalysis->start($row[$field],$fieldConf['foreign_table'],$fieldConf['MM'],$row['uid']);
00374                            reset($dbAnalysis->itemArray);
00375                            while (list(,$tempArr)=each($dbAnalysis->itemArray))  {
00376                               if ($tempArr['id']>0)   {
00377                                  $this->checkGroupDBRefs[$fieldConf['foreign_table']][$tempArr['id']]+=1;
00378                               }
00379                            }
00380                         }
00381                      }
00382                   }
00383                }
00384             }
00385          }
00386       }
00387    }
00388 
00394    function testFileRefs ()   {
00395       $output=Array();
00396       reset($this->checkFileRefs);
00397       while(list($folder,$fileArr)=each($this->checkFileRefs)) {
00398          $path = PATH_site.$folder;
00399          if (@is_dir($path))  {
00400             $d = dir($path);
00401             while($entry=$d->read()) {
00402                if (@is_file($path.'/'.$entry))  {
00403                   if (isset($fileArr[$entry]))  {
00404                      if ($fileArr[$entry] > 1)  {
00405                         $temp = $this->whereIsFileReferenced($folder,$entry);
00406                         $tempList = '';
00407                         while(list(,$inf)=each($temp))   {
00408                            $tempList.='['.$inf['table'].']['.$inf['uid'].']['.$inf['field'].'] (pid:'.$inf['pid'].') - ';
00409                         }
00410                         $output['moreReferences'][] = Array($path,$entry,$fileArr[$entry],$tempList);
00411                      }
00412                      unset($fileArr[$entry]);
00413                   } else {
00414                      if (!strstr($entry,'index.htm')) {
00415                         $output['noReferences'][] = Array($path,$entry);
00416                      }
00417                   }
00418                }
00419             }
00420             $d->close();
00421             reset($fileArr);
00422             $tempCounter=0;
00423             while(list($file,)=each($fileArr))  {
00424                $temp = $this->whereIsFileReferenced($folder,$file);
00425                $tempList = '';
00426                while(list(,$inf)=each($temp))   {
00427                   $tempList.='['.$inf['table'].']['.$inf['uid'].']['.$inf['field'].'] (pid:'.$inf['pid'].') - ';
00428                }
00429                $tempCounter++;
00430                $output['noFile'][substr($path,-3).'_'.substr($file,0,3).'_'.$tempCounter] = Array($path,$file,$tempList);
00431             }
00432          } else {
00433             $output['error'][] = Array($path);
00434          }
00435       }
00436       return $output;
00437    }
00438 
00445    function testDBRefs($theArray)   {
00446       global $TCA;
00447       reset($theArray);
00448       while(list($table,$dbArr)=each($theArray))   {
00449          if ($TCA[$table]) {
00450             $idlist = Array();
00451             while(list($id,)=each($dbArr))   {
00452                $idlist[]=$id;
00453             }
00454             $theList = implode(',',$idlist);
00455             if ($theList)  {
00456                $mres = $GLOBALS['TYPO3_DB']->exec_SELECTquery('uid', $table, 'uid IN ('.$theList.')'.t3lib_BEfunc::deleteClause($table));
00457                while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($mres))  {
00458                   if (isset($dbArr[$row['uid']]))  {
00459                      unset ($dbArr[$row['uid']]);
00460                   } else {
00461                      $result.='Strange Error. ...<br />';
00462                   }
00463                }
00464                reset($dbArr);
00465                while (list($theId,$theC)=each($dbArr))   {
00466                   $result.='There are '.$theC.' records pointing to this missing or deleted record; ['.$table.']['.$theId.']<br />';
00467                }
00468             }
00469          } else {
00470             $result.='Codeerror. Table is not a table...<br />';
00471          }
00472       }
00473       return $result;
00474    }
00475 
00483    function whereIsRecordReferenced($searchTable,$id) {
00484       global $TCA;
00485       $fileFields = $this->getDBFields($searchTable); // Gets tables / Fields that reference to files...
00486       $theRecordList=Array();
00487       while (list(,$info)=each($fileFields)) {
00488          $table=$info[0];  $field=$info[1];
00489          t3lib_div::loadTCA($table);
00490          $mres = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
00491                      'uid,pid,'.$TCA[$table]['ctrl']['label'].','.$field,
00492                      $table,
00493                      $field.' LIKE "%'.$GLOBALS['TYPO3_DB']->quoteStr($id, $table).'%"'
00494                   );
00495          while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($mres)) {
00496                // Now this is the field, where the reference COULD come from. But we're not garanteed, so we must carefully examine the data.
00497             $fieldConf = $TCA[$table]['columns'][$field]['config'];
00498             $allowedTables = ($fieldConf['type']=='group') ? $fieldConf['allowed'] : $fieldConf['foreign_table'];
00499 
00500             $dbAnalysis = t3lib_div::makeInstance('t3lib_loadDBGroup');
00501             $dbAnalysis->start($row[$field],$allowedTables,$fieldConf['MM'],$row['uid']);
00502             reset($dbAnalysis->itemArray);
00503             while (list(,$tempArr)=each($dbAnalysis->itemArray))  {
00504                if ($tempArr['table']==$searchTable && $tempArr['id']==$id) {
00505                   $theRecordList[]=Array('table'=>$table,'uid'=>$row['uid'],'field'=>$field,'pid'=>$row['pid']);
00506                }
00507             }
00508          }
00509       }
00510       return $theRecordList;
00511    }
00512 
00520    function whereIsFileReferenced($uploadfolder,$filename)  {
00521       global $TCA;
00522       $fileFields = $this->getFileFields($uploadfolder); // Gets tables / Fields that reference to files...
00523       $theRecordList=Array();
00524       while (list(,$info)=each($fileFields)) {
00525          $table=$info[0];  $field=$info[1];
00526          $mres = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
00527                      'uid,pid,'.$TCA[$table]['ctrl']['label'].','.$field,
00528                      $table,
00529                      $field.' LIKE "%'.$GLOBALS['TYPO3_DB']->quoteStr($filename, $table).'%"'
00530                   );
00531          while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($mres)) {
00532             // Now this is the field, where the reference COULD come from. But we're not garanteed, so we must carefully examine the data.
00533             $tempArr = explode(',',trim($row[$field]));
00534             while (list(,$file)=each($tempArr)) {
00535                $file = trim($file);
00536                if ($file==$filename)   {
00537                   $theRecordList[]=Array('table'=>$table,'uid'=>$row['uid'],'field'=>$field,'pid'=>$row['pid']);
00538                }
00539             }
00540          }
00541       }
00542       return $theRecordList;
00543    }
00544 }
00545 
00546 
00547 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_admin.php'])   {
00548    include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_admin.php']);
00549 }
00550 ?>

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