[ Index ] |
|
Code source de Typo3 4.1.3 |
1 <?php 2 /*************************************************************** 3 * Copyright notice 4 * 5 * (c) 1999-2006 Kasper Skaarhoj (kasperYYYY@typo3.com) 6 * All rights reserved 7 * 8 * This script is part of the TYPO3 project. The TYPO3 project is 9 * free software; you can redistribute it and/or modify 10 * it under the terms of the GNU General Public License as published by 11 * the Free Software Foundation; either version 2 of the License, or 12 * (at your option) any later version. 13 * 14 * The GNU General Public License can be found at 15 * http://www.gnu.org/copyleft/gpl.html. 16 * A copy is found in the textfile GPL.txt and important notices to the license 17 * from the author is found in LICENSE.txt distributed with these scripts. 18 * 19 * 20 * This script is distributed in the hope that it will be useful, 21 * but WITHOUT ANY WARRANTY; without even the implied warranty of 22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 23 * GNU General Public License for more details. 24 * 25 * This copyright notice MUST APPEAR in all copies of the script! 26 ***************************************************************/ 27 /** 28 * Contains a class for evaluation of database integrity according to $TCA 29 * Most of these functions are considered obsolete! 30 * 31 * $Id: class.t3lib_admin.php 2061 2007-02-20 21:16:23Z mundaun $ 32 * Revised for TYPO3 3.6 July/2003 by Kasper Skaarhoj 33 * XHTML compliant 34 * 35 * @author Kasper Skaarhoj <kasperYYYY@typo3.com> 36 */ 37 /** 38 * [CLASS/FUNCTION INDEX of SCRIPT] 39 * 40 * 41 * 42 * 93: class t3lib_admin 43 * 128: function genTree($theID, $depthData, $versions=FALSE) 44 * 217: function genTree_records($theID, $depthData, $table='', $versions=FALSE) 45 * 292: function genTreeStatus() 46 * 315: function lostRecords($pid_list) 47 * 346: function fixLostRecord($table,$uid) 48 * 367: function countRecords($pid_list) 49 * 395: function getGroupFields($mode) 50 * 429: function getFileFields($uploadfolder) 51 * 452: function getDBFields($theSearchTable) 52 * 480: function selectNonEmptyRecordsWithFkeys($fkey_arrays) 53 * 569: function testFileRefs () 54 * 620: function testDBRefs($theArray) 55 * 658: function whereIsRecordReferenced($searchTable,$id) 56 * 695: function whereIsFileReferenced($uploadfolder,$filename) 57 * 58 * TOTAL FUNCTIONS: 14 59 * (This index is automatically created/updated by the extension "extdeveval") 60 * 61 */ 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 /** 83 * This class holds functions used by the TYPO3 backend to check the integrity of the database (The DBint module, 'lowlevel' extension) 84 * 85 * Depends on: Depends on loaddbgroup from t3lib/ 86 * 87 * @todo Need to really extend this class when the tcemain library has been updated and the whole API is better defined. There are some known bugs in this library. Further it would be nice with a facility to not only analyze but also clean up! 88 * @see SC_mod_tools_dbint_index::func_relations(), SC_mod_tools_dbint_index::func_records() 89 * @author Kasper Skaarhoj <kasperYYYY@typo3.com> 90 * @package TYPO3 91 * @subpackage t3lib 92 */ 93 class t3lib_admin { 94 var $genTree_includeDeleted = TRUE; // if set, genTree() includes deleted pages. This is default. 95 var $genTree_includeVersions = TRUE; // if set, genTree() includes verisonized pages/records. This is default. 96 var $genTree_includeRecords = FALSE; // if set, genTree() includes records from pages. 97 var $perms_clause = ''; // extra where-clauses for the tree-selection 98 var $genTree_makeHTML = 0; // if set, genTree() generates HTML, that visualizes the tree. 99 100 // internal 101 var $page_idArray = Array(); // Will hod id/rec pais from genTree() 102 var $rec_idArray = Array(); 103 var $getTree_HTML = ''; // Will hold the HTML-code visualising the tree. genTree() 104 var $backPath = ''; 105 106 // internal 107 var $checkFileRefs = Array(); 108 var $checkSelectDBRefs = Array(); // From the select-fields 109 var $checkGroupDBRefs = Array(); // From the group-fields 110 111 var $recStats = Array( 112 'allValid' => array(), 113 'published_versions' => array(), 114 'deleted' => array(), 115 ); 116 var $lRecords = Array(); 117 var $lostPagesList = ''; 118 119 120 /** 121 * Generates a list of Page-uid's that corresponds to the tables in the tree. This list should ideally include all records in the pages-table. 122 * 123 * @param integer a pid (page-record id) from which to start making the tree 124 * @param string HTML-code (image-tags) used when this function calls itself recursively. 125 * @param boolean Internal variable, don't set from outside! 126 * @return void 127 */ 128 function genTree($theID, $depthData, $versions=FALSE) { 129 130 if ($versions) { 131 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery( 132 'uid,title,doktype,deleted,t3ver_wsid,t3ver_id,t3ver_count,t3ver_swapmode'.(t3lib_extMgm::isLoaded('cms')?',hidden':''), 133 'pages', 134 'pid=-1 AND t3ver_oid='.intval($theID).' '.((!$this->genTree_includeDeleted)?'AND deleted=0':'').$this->perms_clause, 135 '', 136 'sorting' 137 ); 138 } else { 139 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery( 140 'uid,title,doktype,deleted'.(t3lib_extMgm::isLoaded('cms')?',hidden':''), 141 'pages', 142 'pid='.intval($theID).' '.((!$this->genTree_includeDeleted)?'AND deleted=0':'').$this->perms_clause, 143 '', 144 'sorting' 145 ); 146 } 147 148 // Traverse the records selected: 149 $a = 0; 150 $c = $GLOBALS['TYPO3_DB']->sql_num_rows($res); 151 while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) { 152 153 // Prepare the additional label used in the HTML output in case of versions: 154 if ($versions) { 155 $versionLabel = '[v1.'.$row['t3ver_id'].'; WS#'.$row['t3ver_wsid'].']'; 156 } else $versionLabel=''; 157 158 $a++; 159 $newID = $row['uid']; 160 161 // Build HTML output: 162 if ($this->genTree_makeHTML) { 163 $this->genTree_HTML.=chr(10).'<div><span class="nobr">'; 164 $PM = 'join'; 165 $LN = ($a==$c)?'blank':'line'; 166 $BTM = ($a==$c)?'bottom':''; 167 $this->genTree_HTML.= $depthData. 168 '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/ol/'.$PM.$BTM.'.gif','width="18" height="16"').' align="top" alt="" />'. 169 $versionLabel. 170 t3lib_iconWorks::getIconImage('pages',$row,$this->backPath,'align="top"'). 171 htmlspecialchars($row['uid'].': '.t3lib_div::fixed_lgd_cs(strip_tags($row['title']),50)).'</span></div>'; 172 } 173 174 // Register various data for this item: 175 $this->page_idArray[$newID]=$row; 176 177 $this->recStats['all_valid']['pages'][$newID] = $newID; 178 # if ($versions) $this->recStats['versions']['pages'][$newID] = $newID; 179 if ($row['deleted']) $this->recStats['deleted']['pages'][$newID] = $newID; 180 if ($versions && $row['t3ver_count']>=1) { 181 $this->recStats['published_versions']['pages'][$newID] = $newID; 182 } 183 184 if ($row['deleted']) {$this->recStat['deleted']++;} 185 if ($row['hidden']) {$this->recStat['hidden']++;} 186 $this->recStat['doktype'][$row['doktype']]++; 187 188 // Create the HTML code prefix for recursive call: 189 $genHTML = $depthData.'<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/ol/'.$LN.'.gif','width="18" height="16"').' align="top" alt="" />'.$versionLabel; 190 191 // If all records should be shown, do so: 192 if ($this->genTree_includeRecords) { 193 foreach($GLOBALS['TCA'] as $tableName => $cfg) { 194 if ($tableName!='pages') { 195 $this->genTree_records($newID, $this->genTree_HTML ? $genHTML : '', $tableName); 196 } 197 } 198 } 199 200 // Add sub pages: 201 $this->genTree($newID, $this->genTree_HTML ? $genHTML : ''); 202 203 // If versions are included in the tree, add those now: 204 if ($this->genTree_includeVersions) { 205 $this->genTree($newID, $this->genTree_HTML ? $genHTML : '', TRUE); 206 } 207 } 208 } 209 210 /** 211 * @param [type] $theID: ... 212 * @param [type] $depthData: ... 213 * @param [type] $table: ... 214 * @param [type] $versions: ... 215 * @return [type] ... 216 */ 217 function genTree_records($theID, $depthData, $table='', $versions=FALSE) { 218 global $TCA; 219 220 if ($versions) { 221 // Select all records from table pointing to this page: 222 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery( 223 t3lib_BEfunc::getCommonSelectFields($table), 224 $table, 225 'pid=-1 AND t3ver_oid='.intval($theID). 226 (!$this->genTree_includeDeleted?t3lib_BEfunc::deleteClause($table):'') 227 ); 228 } else { 229 // Select all records from table pointing to this page: 230 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery( 231 t3lib_BEfunc::getCommonSelectFields($table), 232 $table, 233 'pid='.intval($theID). 234 (!$this->genTree_includeDeleted?t3lib_BEfunc::deleteClause($table):'') 235 ); 236 } 237 238 // Traverse selected: 239 $a = 0; 240 $c = $GLOBALS['TYPO3_DB']->sql_num_rows($res); 241 while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) { 242 243 // Prepare the additional label used in the HTML output in case of versions: 244 if ($versions) { 245 $versionLabel = '[v1.'.$row['t3ver_id'].'; WS#'.$row['t3ver_wsid'].']'; 246 } else $versionLabel=''; 247 248 $a++; 249 $newID = $row['uid']; 250 251 // Build HTML output: 252 if ($this->genTree_makeHTML) { 253 $this->genTree_HTML.=chr(10).'<div><span class="nobr">'; 254 $PM = 'join'; 255 $LN = ($a==$c)?'blank':'line'; 256 $BTM = ($a==$c)?'bottom':''; 257 $this->genTree_HTML.= $depthData. 258 '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/ol/'.$PM.$BTM.'.gif','width="18" height="16"').' align="top" alt="" />'. 259 $versionLabel. 260 t3lib_iconWorks::getIconImage($table,$row,$this->backPath,'align="top" title="'.$table.'"').htmlspecialchars($row['uid'].': '.t3lib_BEfunc::getRecordTitle($table,$row)).'</span></div>'; 261 } 262 263 // Register various data for this item: 264 $this->rec_idArray[$table][$newID]=$row; 265 266 $this->recStats['all_valid'][$table][$newID] = $newID; 267 # $this->recStats[$versions?'versions':'live'][$table][$newID] = $newID; 268 if ($row['deleted']) $this->recStats['deleted'][$table][$newID] = $newID; 269 if ($versions && $row['t3ver_count']>=1 && $row['t3ver_wsid']==0) { 270 $this->recStats['published_versions'][$table][$newID] = $newID; 271 } 272 273 # if ($row['deleted']) {$this->recStat['deleted']++;} 274 # if ($row['hidden']) {$this->recStat['hidden']++;} 275 276 277 278 // Select all versions of this record: 279 if ($this->genTree_includeVersions && $TCA[$table]['ctrl']['versioningWS']) { 280 $genHTML = $depthData.'<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/ol/'.$LN.'.gif','width="18" height="16"').' align="top" alt="" />'; 281 282 $this->genTree_records($newID, $genHTML, $table, TRUE); 283 } 284 } 285 } 286 287 /** 288 * [Describe function...] 289 * 290 * @return [type] ... 291 */ 292 function genTreeStatus($root=0) { 293 $this->genTree_includeDeleted = TRUE; // if set, genTree() includes deleted pages. This is default. 294 $this->genTree_includeVersions = TRUE; // if set, genTree() includes verisonized pages/records. This is default. 295 $this->genTree_includeRecords = TRUE; // if set, genTree() includes records from pages. 296 $this->perms_clause = ''; // extra where-clauses for the tree-selection 297 $this->genTree_makeHTML = 0; // if set, genTree() generates HTML, that visualizes the tree. 298 299 $this->genTree($root,''); 300 301 return $this->recStats; 302 } 303 304 305 306 307 308 309 /** 310 * Fills $this->lRecords with the records from all tc-tables that are not attached to a PID in the pid-list. 311 * 312 * @param string list of pid's (page-record uid's). This list is probably made by genTree() 313 * @return void 314 */ 315 function lostRecords($pid_list) { 316 global $TCA; 317 reset($TCA); 318 $this->lostPagesList=''; 319 if ($pid_list) { 320 while (list($table)=each($TCA)) { 321 t3lib_div::loadTCA($table); 322 323 $pid_list_tmp = $pid_list; 324 if (!isset($TCA[$table]['ctrl']['versioningWS']) || !$TCA[$table]['ctrl']['versioningWS']) { 325 // Remove preceding "-1," for non-versioned tables 326 $pid_list_tmp = preg_replace('/^\-1,/','',$pid_list_tmp); 327 } 328 329 $garbage = $GLOBALS['TYPO3_DB']->exec_SELECTquery ( 330 'uid,pid,'.$TCA[$table]['ctrl']['label'], 331 $table, 332 'pid NOT IN ('.$pid_list_tmp.')' 333 ); 334 $lostIdList = array(); 335 while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($garbage)) { 336 $this->lRecords[$table][$row['uid']]=Array('uid'=>$row['uid'], 'pid'=>$row['pid'], 'title'=> strip_tags($row[$TCA[$table]['ctrl']['label']]) ); 337 $lostIdList[]=$row['uid']; 338 } 339 if ($table=='pages') { 340 $this->lostPagesList=implode(',',$lostIdList); 341 } 342 } 343 } 344 } 345 346 /** 347 * Fixes lost record from $table with uid $uid by setting the PID to zero. If there is a disabled column for the record that will be set as well. 348 * 349 * @param string Database tablename 350 * @param integer The uid of the record which will have the PID value set to 0 (zero) 351 * @return boolean True if done. 352 */ 353 function fixLostRecord($table,$uid) { 354 if ($table && $GLOBALS['TCA'][$table] && $uid && is_array($this->lRecords[$table][$uid]) && $GLOBALS['BE_USER']->user['admin']) { 355 356 $updateFields = array(); 357 $updateFields['pid'] = 0; 358 if ($GLOBALS['TCA'][$table]['ctrl']['enablecolumns']['disabled']) { // If possible a lost record restored is hidden as default 359 $updateFields[$GLOBALS['TCA'][$table]['ctrl']['enablecolumns']['disabled']] = 1; 360 } 361 362 $GLOBALS['TYPO3_DB']->exec_UPDATEquery($table, 'uid='.intval($uid), $updateFields); 363 364 return TRUE; 365 } else return FALSE; 366 } 367 368 /** 369 * Counts records from $TCA-tables that ARE attached to an existing page. 370 * 371 * @param string list of pid's (page-record uid's). This list is probably made by genTree() 372 * @return array an array with the number of records from all $TCA-tables that are attached to a PID in the pid-list. 373 */ 374 function countRecords($pid_list) { 375 global $TCA; 376 reset($TCA); 377 $list=Array(); 378 $list_n=Array(); 379 if ($pid_list) { 380 while (list($table)=each($TCA)) { 381 t3lib_div::loadTCA($table); 382 383 $pid_list_tmp = $pid_list; 384 if (!isset($TCA[$table]['ctrl']['versioningWS']) || !$TCA[$table]['ctrl']['versioningWS']) { 385 // Remove preceding "-1," for non-versioned tables 386 $pid_list_tmp = preg_replace('/^\-1,/','',$pid_list_tmp); 387 } 388 389 $count = $GLOBALS['TYPO3_DB']->exec_SELECTquery('count(*)', $table, 'pid IN ('.$pid_list_tmp.')'); 390 if ($row = $GLOBALS['TYPO3_DB']->sql_fetch_row($count)) { 391 $list[$table]=$row[0]; 392 } 393 394 $count = $GLOBALS['TYPO3_DB']->exec_SELECTquery('count(*)', $table, 'pid IN ('.$pid_list_tmp.')'.t3lib_BEfunc::deleteClause($table)); 395 if ($row = $GLOBALS['TYPO3_DB']->sql_fetch_row($count)) { 396 $list_n[$table]=$row[0]; 397 } 398 } 399 } 400 return array('all' => $list, 'non_deleted' => $list_n); 401 } 402 403 /** 404 * Finding relations in database based on type 'group' (files or database-uid's in a list) 405 * 406 * @param string $mode = file, $mode = db, $mode = '' (all...) 407 * @return array An array with all fields listed that somehow are references to other records (foreign-keys) or files 408 */ 409 function getGroupFields($mode) { 410 global $TCA; 411 reset ($TCA); 412 $result = Array(); 413 while (list($table)=each($TCA)) { 414 t3lib_div::loadTCA($table); 415 $cols = $TCA[$table]['columns']; 416 reset ($cols); 417 while (list($field,$config)=each($cols)) { 418 if ($config['config']['type']=='group') { 419 if ( 420 ((!$mode||$mode=='file') && $config['config']['internal_type']=='file') || 421 ((!$mode||$mode=='db') && $config['config']['internal_type']=='db') 422 ) { 423 $result[$table][]=$field; 424 } 425 } 426 if ( (!$mode||$mode=='db') && $config['config']['type']=='select' && $config['config']['foreign_table']) { 427 $result[$table][]=$field; 428 } 429 } 430 if ($result[$table]) { 431 $result[$table] = implode(',',$result[$table]); 432 } 433 } 434 return $result; 435 } 436 437 /** 438 * Finds all fields that hold filenames from uploadfolder 439 * 440 * @param string Path to uploadfolder 441 * @return array An array with all fields listed that have references to files in the $uploadfolder 442 */ 443 function getFileFields($uploadfolder) { 444 global $TCA; 445 reset ($TCA); 446 $result = Array(); 447 while (list($table)=each($TCA)) { 448 t3lib_div::loadTCA($table); 449 $cols = $TCA[$table]['columns']; 450 reset ($cols); 451 while (list($field,$config)=each($cols)) { 452 if ($config['config']['type']=='group' && $config['config']['internal_type']=='file' && $config['config']['uploadfolder']==$uploadfolder) { 453 $result[]=Array($table,$field); 454 } 455 } 456 } 457 return $result; 458 } 459 460 /** 461 * Returns an array with arrays of table/field pairs which are allowed to hold references to the input table name - according to $TCA 462 * 463 * @param string Table name 464 * @return array 465 */ 466 function getDBFields($theSearchTable) { 467 global $TCA; 468 $result = Array(); 469 reset ($TCA); 470 while (list($table)=each($TCA)) { 471 t3lib_div::loadTCA($table); 472 $cols = $TCA[$table]['columns']; 473 reset ($cols); 474 while (list($field,$config)=each($cols)) { 475 if ($config['config']['type']=='group' && $config['config']['internal_type']=='db') { 476 if (trim($config['config']['allowed'])=='*' || strstr($config['config']['allowed'],$theSearchTable)) { 477 $result[]=Array($table,$field); 478 } 479 } else if ($config['config']['type']=='select' && $config['config']['foreign_table']==$theSearchTable) { 480 $result[]=Array($table,$field); 481 } 482 } 483 } 484 return $result; 485 } 486 487 /** 488 * This selects non-empty-records from the tables/fields in the fkey_array generated by getGroupFields() 489 * 490 * @param array Array with tables/fields generated by getGroupFields() 491 * @return void 492 * @see getGroupFields() 493 */ 494 function selectNonEmptyRecordsWithFkeys($fkey_arrays) { 495 global $TCA; 496 if (is_array($fkey_arrays)) { 497 reset($fkey_arrays); 498 while (list($table,$field_list)=each($fkey_arrays)) { 499 if ($TCA[$table] && trim($field_list)) { 500 t3lib_div::loadTCA($table); 501 $fieldArr = explode(',',$field_list); 502 503 if(t3lib_extMgm::isLoaded('dbal')) { 504 $fields = $GLOBALS['TYPO3_DB']->admin_get_fields($table); 505 reset($fields); 506 list(,$field)=each($fieldArr); 507 $cl_fl = ($GLOBALS['TYPO3_DB']->MetaType($fields[$field]['type'],$table) == 'I' || $GLOBALS['TYPO3_DB']->MetaType($fields[$field]['type'],$table) == 'N' || $GLOBALS['TYPO3_DB']->MetaType($fields[$field]['type'],$table) == 'R') ? 508 $field.'!=0' : $field.'!=\'\''; 509 while (list(,$field)=each($fieldArr)) { 510 $cl_fl .= ($GLOBALS['TYPO3_DB']->MetaType($fields[$field]['type'],$table) == 'I' || $GLOBALS['TYPO3_DB']->MetaType($fields[$field]['type'],$table) == 'N' || $GLOBALS['TYPO3_DB']->MetaType($fields[$field]['type'],$table) == 'R') ? 511 ' OR '.$field.'!=0' : ' OR '.$field.'!=\'\''; 512 } 513 unset($fields); 514 } 515 else { 516 $cl_fl = implode ('!="" OR ',$fieldArr). '!=""'; 517 } 518 519 $mres = $GLOBALS['TYPO3_DB']->exec_SELECTquery('uid,'.$field_list, $table, $cl_fl); 520 while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($mres)) { 521 reset($fieldArr); 522 while (list(,$field)=each($fieldArr)) { 523 if (trim($row[$field])) { 524 $fieldConf = $TCA[$table]['columns'][$field]['config']; 525 if ($fieldConf['type']=='group') { 526 if ($fieldConf['internal_type']=='file') { 527 // files... 528 if ($fieldConf['MM']) { 529 $tempArr=array(); 530 $dbAnalysis = t3lib_div::makeInstance('t3lib_loadDBGroup'); 531 $dbAnalysis->start('','files',$fieldConf['MM'],$row['uid']); 532 reset($dbAnalysis->itemArray); 533 while (list($somekey,$someval)=each($dbAnalysis->itemArray)) { 534 if ($someval['id']) { 535 $tempArr[]=$someval['id']; 536 } 537 } 538 } else { 539 $tempArr = explode(',',trim($row[$field])); 540 } 541 reset($tempArr); 542 while (list(,$file)=each($tempArr)) { 543 $file = trim($file); 544 if ($file) { 545 $this->checkFileRefs[$fieldConf['uploadfolder']][$file]+=1; 546 } 547 } 548 } 549 if ($fieldConf['internal_type']=='db') { 550 // dbs - group 551 $dbAnalysis = t3lib_div::makeInstance('t3lib_loadDBGroup'); 552 $dbAnalysis->start($row[$field],$fieldConf['allowed'],$fieldConf['MM'],$row['uid'], $table, $fieldConf); 553 reset($dbAnalysis->itemArray); 554 while (list(,$tempArr)=each($dbAnalysis->itemArray)) { 555 $this->checkGroupDBRefs[$tempArr['table']][$tempArr['id']]+=1; 556 } 557 } 558 } 559 if ($fieldConf['type']=='select' && $fieldConf['foreign_table']) { 560 // dbs - select 561 $dbAnalysis = t3lib_div::makeInstance('t3lib_loadDBGroup'); 562 $dbAnalysis->start($row[$field],$fieldConf['foreign_table'],$fieldConf['MM'],$row['uid'], $table, $fieldConf); 563 reset($dbAnalysis->itemArray); 564 while (list(,$tempArr)=each($dbAnalysis->itemArray)) { 565 if ($tempArr['id']>0) { 566 $this->checkGroupDBRefs[$fieldConf['foreign_table']][$tempArr['id']]+=1; 567 } 568 } 569 } 570 } 571 } 572 } 573 } 574 } 575 } 576 } 577 578 /** 579 * Depends on selectNonEmpty.... to be executed first!! 580 * 581 * @return array Report over files; keys are "moreReferences", "noReferences", "noFile", "error" 582 */ 583 function testFileRefs () { 584 $output=Array(); 585 reset($this->checkFileRefs); 586 while(list($folder,$fileArr)=each($this->checkFileRefs)) { 587 $path = PATH_site.$folder; 588 if (@is_dir($path)) { 589 $d = dir($path); 590 while($entry=$d->read()) { 591 if (@is_file($path.'/'.$entry)) { 592 if (isset($fileArr[$entry])) { 593 if ($fileArr[$entry] > 1) { 594 $temp = $this->whereIsFileReferenced($folder,$entry); 595 $tempList = ''; 596 while(list(,$inf)=each($temp)) { 597 $tempList.='['.$inf['table'].']['.$inf['uid'].']['.$inf['field'].'] (pid:'.$inf['pid'].') - '; 598 } 599 $output['moreReferences'][] = Array($path,$entry,$fileArr[$entry],$tempList); 600 } 601 unset($fileArr[$entry]); 602 } else { 603 if (!strstr($entry,'index.htm')) { 604 $output['noReferences'][] = Array($path,$entry); 605 } 606 } 607 } 608 } 609 $d->close(); 610 reset($fileArr); 611 $tempCounter=0; 612 while(list($file,)=each($fileArr)) { 613 $temp = $this->whereIsFileReferenced($folder,$file); 614 $tempList = ''; 615 while(list(,$inf)=each($temp)) { 616 $tempList.='['.$inf['table'].']['.$inf['uid'].']['.$inf['field'].'] (pid:'.$inf['pid'].') - '; 617 } 618 $tempCounter++; 619 $output['noFile'][substr($path,-3).'_'.substr($file,0,3).'_'.$tempCounter] = Array($path,$file,$tempList); 620 } 621 } else { 622 $output['error'][] = Array($path); 623 } 624 } 625 return $output; 626 } 627 628 /** 629 * Depends on selectNonEmpty.... to be executed first!! 630 * 631 * @param array Table with key/value pairs being table names and arrays with uid numbers 632 * @return string HTML Error message 633 */ 634 function testDBRefs($theArray) { 635 global $TCA; 636 reset($theArray); 637 while(list($table,$dbArr)=each($theArray)) { 638 if ($TCA[$table]) { 639 $idlist = Array(); 640 while(list($id,)=each($dbArr)) { 641 $idlist[]=$id; 642 } 643 $theList = implode(',',$idlist); 644 if ($theList) { 645 $mres = $GLOBALS['TYPO3_DB']->exec_SELECTquery('uid', $table, 'uid IN ('.$theList.')'.t3lib_BEfunc::deleteClause($table)); 646 while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($mres)) { 647 if (isset($dbArr[$row['uid']])) { 648 unset ($dbArr[$row['uid']]); 649 } else { 650 $result.='Strange Error. ...<br />'; 651 } 652 } 653 reset($dbArr); 654 while (list($theId,$theC)=each($dbArr)) { 655 $result.='There are '.$theC.' records pointing to this missing or deleted record; ['.$table.']['.$theId.']<br />'; 656 } 657 } 658 } else { 659 $result.='Codeerror. Table is not a table...<br />'; 660 } 661 } 662 return $result; 663 } 664 665 /** 666 * Finding all references to record based on table/uid 667 * 668 * @param string Table name 669 * @param integer Uid of database record 670 * @return array Array with other arrays containing information about where references was found 671 */ 672 function whereIsRecordReferenced($searchTable,$id) { 673 global $TCA; 674 $fileFields = $this->getDBFields($searchTable); // Gets tables / Fields that reference to files... 675 $theRecordList=Array(); 676 while (list(,$info)=each($fileFields)) { 677 $table=$info[0]; $field=$info[1]; 678 t3lib_div::loadTCA($table); 679 $mres = $GLOBALS['TYPO3_DB']->exec_SELECTquery( 680 'uid,pid,'.$TCA[$table]['ctrl']['label'].','.$field, 681 $table, 682 $field.' LIKE \'%'.$GLOBALS['TYPO3_DB']->quoteStr($id, $table).'%\'' 683 ); 684 while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($mres)) { 685 // Now this is the field, where the reference COULD come from. But we're not garanteed, so we must carefully examine the data. 686 $fieldConf = $TCA[$table]['columns'][$field]['config']; 687 $allowedTables = ($fieldConf['type']=='group') ? $fieldConf['allowed'] : $fieldConf['foreign_table']; 688 689 $dbAnalysis = t3lib_div::makeInstance('t3lib_loadDBGroup'); 690 $dbAnalysis->start($row[$field],$allowedTables,$fieldConf['MM'],$row['uid'], $table, $fieldConf); 691 reset($dbAnalysis->itemArray); 692 while (list(,$tempArr)=each($dbAnalysis->itemArray)) { 693 if ($tempArr['table']==$searchTable && $tempArr['id']==$id) { 694 $theRecordList[]=Array('table'=>$table,'uid'=>$row['uid'],'field'=>$field,'pid'=>$row['pid']); 695 } 696 } 697 } 698 } 699 return $theRecordList; 700 } 701 702 /** 703 * Finding all references to file based on uploadfolder / filename 704 * 705 * @param string Upload folder where file is found 706 * @param string Filename to search for 707 * @return array Array with other arrays containing information about where references was found 708 */ 709 function whereIsFileReferenced($uploadfolder,$filename) { 710 global $TCA; 711 $fileFields = $this->getFileFields($uploadfolder); // Gets tables / Fields that reference to files... 712 $theRecordList=Array(); 713 while (list(,$info)=each($fileFields)) { 714 $table=$info[0]; $field=$info[1]; 715 $mres = $GLOBALS['TYPO3_DB']->exec_SELECTquery( 716 'uid,pid,'.$TCA[$table]['ctrl']['label'].','.$field, 717 $table, 718 $field.' LIKE \'%'.$GLOBALS['TYPO3_DB']->quoteStr($filename, $table).'%\'' 719 ); 720 while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($mres)) { 721 // Now this is the field, where the reference COULD come from. But we're not garanteed, so we must carefully examine the data. 722 $tempArr = explode(',',trim($row[$field])); 723 while (list(,$file)=each($tempArr)) { 724 $file = trim($file); 725 if ($file==$filename) { 726 $theRecordList[]=Array('table'=>$table,'uid'=>$row['uid'],'field'=>$field,'pid'=>$row['pid']); 727 } 728 } 729 } 730 } 731 return $theRecordList; 732 } 733 } 734 735 736 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_admin.php']) { 737 include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_admin.php']); 738 } 739 ?>
titre
Description
Corps
titre
Description
Corps
titre
Description
Corps
titre
Corps
Généré le : Sun Nov 25 17:13:16 2007 | par Balluche grâce à PHPXref 0.7 |
![]() |