Documentation TYPO3 par Ameos |
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 ?>