00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00093 class t3lib_admin {
00094 var $genTree_includeDeleted = TRUE;
00095 var $genTree_includeVersions = TRUE;
00096 var $genTree_includeRecords = FALSE;
00097 var $perms_clause = '';
00098 var $genTree_makeHTML = 0;
00099
00100
00101 var $page_idArray = Array();
00102 var $rec_idArray = Array();
00103 var $getTree_HTML = '';
00104 var $backPath = '';
00105
00106
00107 var $checkFileRefs = Array();
00108 var $checkSelectDBRefs = Array();
00109 var $checkGroupDBRefs = Array();
00110
00111 var $recStats = Array(
00112 'allValid' => array(),
00113 'published_versions' => array(),
00114 'deleted' => array(),
00115 );
00116 var $lRecords = Array();
00117 var $lostPagesList = '';
00118
00119
00128 function genTree($theID, $depthData, $versions=FALSE) {
00129
00130 if ($versions) {
00131 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
00132 'uid,title,doktype,deleted,t3ver_wsid,t3ver_id,t3ver_count,t3ver_swapmode'.(t3lib_extMgm::isLoaded('cms')?',hidden':''),
00133 'pages',
00134 'pid=-1 AND t3ver_oid='.intval($theID).' '.((!$this->genTree_includeDeleted)?'AND deleted=0':'').$this->perms_clause,
00135 '',
00136 'sorting'
00137 );
00138 } else {
00139 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
00140 'uid,title,doktype,deleted'.(t3lib_extMgm::isLoaded('cms')?',hidden':''),
00141 'pages',
00142 'pid='.intval($theID).' '.((!$this->genTree_includeDeleted)?'AND deleted=0':'').$this->perms_clause,
00143 '',
00144 'sorting'
00145 );
00146 }
00147
00148
00149 $a = 0;
00150 $c = $GLOBALS['TYPO3_DB']->sql_num_rows($res);
00151 while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
00152
00153
00154 if ($versions) {
00155 $versionLabel = '[v1.'.$row['t3ver_id'].'; WS#'.$row['t3ver_wsid'].']';
00156 } else $versionLabel='';
00157
00158 $a++;
00159 $newID = $row['uid'];
00160
00161
00162 if ($this->genTree_makeHTML) {
00163 $this->genTree_HTML.=chr(10).'<div><span class="nobr">';
00164 $PM = 'join';
00165 $LN = ($a==$c)?'blank':'line';
00166 $BTM = ($a==$c)?'bottom':'';
00167 $this->genTree_HTML.= $depthData.
00168 '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/ol/'.$PM.$BTM.'.gif','width="18" height="16"').' align="top" alt="" />'.
00169 $versionLabel.
00170 t3lib_iconWorks::getIconImage('pages',$row,$this->backPath,'align="top"').
00171 htmlspecialchars($row['uid'].': '.t3lib_div::fixed_lgd_cs(strip_tags($row['title']),50)).'</span></div>';
00172 }
00173
00174
00175 $this->page_idArray[$newID]=$row;
00176
00177 $this->recStats['all_valid']['pages'][$newID] = $newID;
00178 # if ($versions) $this->recStats['versions']['pages'][$newID] = $newID;
00179 if ($row['deleted']) $this->recStats['deleted']['pages'][$newID] = $newID;
00180 if ($versions && $row['t3ver_count']>=1) {
00181 $this->recStats['published_versions']['pages'][$newID] = $newID;
00182 }
00183
00184 if ($row['deleted']) {$this->recStat['deleted']++;}
00185 if ($row['hidden']) {$this->recStat['hidden']++;}
00186 $this->recStat['doktype'][$row['doktype']]++;
00187
00188
00189 $genHTML = $depthData.'<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/ol/'.$LN.'.gif','width="18" height="16"').' align="top" alt="" />'.$versionLabel;
00190
00191
00192 if ($this->genTree_includeRecords) {
00193 foreach($GLOBALS['TCA'] as $tableName => $cfg) {
00194 if ($tableName!='pages') {
00195 $this->genTree_records($newID, $this->genTree_HTML ? $genHTML : '', $tableName);
00196 }
00197 }
00198 }
00199
00200
00201 $this->genTree($newID, $this->genTree_HTML ? $genHTML : '');
00202
00203
00204 if ($this->genTree_includeVersions) {
00205 $this->genTree($newID, $this->genTree_HTML ? $genHTML : '', TRUE);
00206 }
00207 }
00208 }
00209
00217 function genTree_records($theID, $depthData, $table='', $versions=FALSE) {
00218 global $TCA;
00219
00220 if ($versions) {
00221
00222 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
00223 t3lib_BEfunc::getCommonSelectFields($table),
00224 $table,
00225 'pid=-1 AND t3ver_oid='.intval($theID).
00226 (!$this->genTree_includeDeleted?t3lib_BEfunc::deleteClause($table):'')
00227 );
00228 } else {
00229
00230 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
00231 t3lib_BEfunc::getCommonSelectFields($table),
00232 $table,
00233 'pid='.intval($theID).
00234 (!$this->genTree_includeDeleted?t3lib_BEfunc::deleteClause($table):'')
00235 );
00236 }
00237
00238
00239 $a = 0;
00240 $c = $GLOBALS['TYPO3_DB']->sql_num_rows($res);
00241 while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
00242
00243
00244 if ($versions) {
00245 $versionLabel = '[v1.'.$row['t3ver_id'].'; WS#'.$row['t3ver_wsid'].']';
00246 } else $versionLabel='';
00247
00248 $a++;
00249 $newID = $row['uid'];
00250
00251
00252 if ($this->genTree_makeHTML) {
00253 $this->genTree_HTML.=chr(10).'<div><span class="nobr">';
00254 $PM = 'join';
00255 $LN = ($a==$c)?'blank':'line';
00256 $BTM = ($a==$c)?'bottom':'';
00257 $this->genTree_HTML.= $depthData.
00258 '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/ol/'.$PM.$BTM.'.gif','width="18" height="16"').' align="top" alt="" />'.
00259 $versionLabel.
00260 t3lib_iconWorks::getIconImage($table,$row,$this->backPath,'align="top" title="'.$table.'"').htmlspecialchars($row['uid'].': '.t3lib_BEfunc::getRecordTitle($table,$row)).'</span></div>';
00261 }
00262
00263
00264 $this->rec_idArray[$table][$newID]=$row;
00265
00266 $this->recStats['all_valid'][$table][$newID] = $newID;
00267 # $this->recStats[$versions?'versions':'live'][$table][$newID] = $newID;
00268 if ($row['deleted']) $this->recStats['deleted'][$table][$newID] = $newID;
00269 if ($versions && $row['t3ver_count']>=1 && $row['t3ver_wsid']==0) {
00270 $this->recStats['published_versions'][$table][$newID] = $newID;
00271 }
00272
00273 # if ($row['deleted']) {$this->recStat['deleted']++;}
00274 # if ($row['hidden']) {$this->recStat['hidden']++;}
00275
00276
00277
00278
00279 if ($this->genTree_includeVersions && $TCA[$table]['ctrl']['versioningWS']) {
00280 $genHTML = $depthData.'<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/ol/'.$LN.'.gif','width="18" height="16"').' align="top" alt="" />';
00281
00282 $this->genTree_records($newID, $genHTML, $table, TRUE);
00283 }
00284 }
00285 }
00286
00292 function genTreeStatus() {
00293 $this->genTree_includeDeleted = TRUE;
00294 $this->genTree_includeVersions = TRUE;
00295 $this->genTree_includeRecords = TRUE;
00296 $this->perms_clause = '';
00297 $this->genTree_makeHTML = 0;
00298
00299 $this->genTree(537,'');
00300
00301 return $this->recStats;
00302 }
00303
00304
00305
00306
00307
00308
00315 function lostRecords($pid_list) {
00316 global $TCA;
00317 reset($TCA);
00318 $this->lostPagesList='';
00319 if ($pid_list) {
00320 while (list($table)=each($TCA)) {
00321 t3lib_div::loadTCA($table);
00322 $garbage = $GLOBALS['TYPO3_DB']->exec_SELECTquery (
00323 'uid,pid,'.$TCA[$table]['ctrl']['label'],
00324 $table,
00325 'pid NOT IN ('.$pid_list.')'
00326 );
00327 $lostIdList=Array();
00328 while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($garbage)) {
00329 $this->lRecords[$table][$row['uid']]=Array('uid'=>$row['uid'], 'pid'=>$row['pid'], 'title'=> strip_tags($row[$TCA[$table]['ctrl']['label']]) );
00330 $lostIdList[]=$row['uid'];
00331 }
00332 if ($table=='pages') {
00333 $this->lostPagesList=implode(',',$lostIdList);
00334 }
00335 }
00336 }
00337 }
00338
00346 function fixLostRecord($table,$uid) {
00347 if ($table && $GLOBALS['TCA'][$table] && $uid && is_array($this->lRecords[$table][$uid]) && $GLOBALS['BE_USER']->user['admin']) {
00348
00349 $updateFields = array();
00350 $updateFields['pid'] = 0;
00351 if ($GLOBALS['TCA'][$table]['ctrl']['enablecolumns']['disabled']) {
00352 $updateFields[$GLOBALS['TCA'][$table]['ctrl']['enablecolumns']['disabled']] = 1;
00353 }
00354
00355 $GLOBALS['TYPO3_DB']->exec_UPDATEquery($table, 'uid='.intval($uid), $updateFields);
00356
00357 return TRUE;
00358 } else return FALSE;
00359 }
00360
00367 function countRecords($pid_list) {
00368 global $TCA;
00369 reset($TCA);
00370 $list=Array();
00371 $list_n=Array();
00372 if ($pid_list) {
00373 while (list($table)=each($TCA)) {
00374 t3lib_div::loadTCA($table);
00375 $count = $GLOBALS['TYPO3_DB']->exec_SELECTquery('count(*)', $table, 'pid IN ('.$pid_list.')');
00376 if ($row = $GLOBALS['TYPO3_DB']->sql_fetch_row($count)) {
00377 $list[$table]=$row[0];
00378 }
00379
00380 $count = $GLOBALS['TYPO3_DB']->exec_SELECTquery('count(*)', $table, 'pid IN ('.$pid_list.')'.t3lib_BEfunc::deleteClause($table));
00381 if ($row = $GLOBALS['TYPO3_DB']->sql_fetch_row($count)) {
00382 $list_n[$table]=$row[0];
00383 }
00384 }
00385 }
00386 return array('all' => $list, 'non_deleted' => $list_n);
00387 }
00388
00395 function getGroupFields($mode) {
00396 global $TCA;
00397 reset ($TCA);
00398 $result = Array();
00399 while (list($table)=each($TCA)) {
00400 t3lib_div::loadTCA($table);
00401 $cols = $TCA[$table]['columns'];
00402 reset ($cols);
00403 while (list($field,$config)=each($cols)) {
00404 if ($config['config']['type']=='group') {
00405 if (
00406 ((!$mode||$mode=='file') && $config['config']['internal_type']=='file') ||
00407 ((!$mode||$mode=='db') && $config['config']['internal_type']=='db')
00408 ) {
00409 $result[$table][]=$field;
00410 }
00411 }
00412 if ( (!$mode||$mode=='db') && $config['config']['type']=='select' && $config['config']['foreign_table']) {
00413 $result[$table][]=$field;
00414 }
00415 }
00416 if ($result[$table]) {
00417 $result[$table] = implode(',',$result[$table]);
00418 }
00419 }
00420 return $result;
00421 }
00422
00429 function getFileFields($uploadfolder) {
00430 global $TCA;
00431 reset ($TCA);
00432 $result = Array();
00433 while (list($table)=each($TCA)) {
00434 t3lib_div::loadTCA($table);
00435 $cols = $TCA[$table]['columns'];
00436 reset ($cols);
00437 while (list($field,$config)=each($cols)) {
00438 if ($config['config']['type']=='group' && $config['config']['internal_type']=='file' && $config['config']['uploadfolder']==$uploadfolder) {
00439 $result[]=Array($table,$field);
00440 }
00441 }
00442 }
00443 return $result;
00444 }
00445
00452 function getDBFields($theSearchTable) {
00453 global $TCA;
00454 $result = Array();
00455 reset ($TCA);
00456 while (list($table)=each($TCA)) {
00457 t3lib_div::loadTCA($table);
00458 $cols = $TCA[$table]['columns'];
00459 reset ($cols);
00460 while (list($field,$config)=each($cols)) {
00461 if ($config['config']['type']=='group' && $config['config']['internal_type']=='db') {
00462 if (trim($config['config']['allowed'])=='*' || strstr($config['config']['allowed'],$theSearchTable)) {
00463 $result[]=Array($table,$field);
00464 }
00465 } else if ($config['config']['type']=='select' && $config['config']['foreign_table']==$theSearchTable) {
00466 $result[]=Array($table,$field);
00467 }
00468 }
00469 }
00470 return $result;
00471 }
00472
00480 function selectNonEmptyRecordsWithFkeys($fkey_arrays) {
00481 global $TCA;
00482 if (is_array($fkey_arrays)) {
00483 reset($fkey_arrays);
00484 while (list($table,$field_list)=each($fkey_arrays)) {
00485 if ($TCA[$table] && trim($field_list)) {
00486 t3lib_div::loadTCA($table);
00487 $fieldArr = explode(',',$field_list);
00488
00489 if(t3lib_extMgm::isLoaded('dbal')) {
00490 $fields = $GLOBALS['TYPO3_DB']->admin_get_fields($table);
00491 reset($fields);
00492 list(,$field)=each($fieldArr);
00493 $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') ?
00494 $field.'!=0' : $field.'!=\'\'';
00495 while (list(,$field)=each($fieldArr)) {
00496 $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') ?
00497 ' OR '.$field.'!=0' : ' OR '.$field.'!=\'\'';
00498 }
00499 unset($fields);
00500 }
00501 else {
00502 $cl_fl = implode ('!="" OR ',$fieldArr). '!=""';
00503 }
00504
00505 $mres = $GLOBALS['TYPO3_DB']->exec_SELECTquery('uid,'.$field_list, $table, $cl_fl);
00506 while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($mres)) {
00507 reset($fieldArr);
00508 while (list(,$field)=each($fieldArr)) {
00509 if (trim($row[$field])) {
00510 $fieldConf = $TCA[$table]['columns'][$field]['config'];
00511 if ($fieldConf['type']=='group') {
00512 if ($fieldConf['internal_type']=='file') {
00513
00514 if ($fieldConf['MM']) {
00515 $tempArr=array();
00516 $dbAnalysis = t3lib_div::makeInstance('t3lib_loadDBGroup');
00517 $dbAnalysis->start('','files',$fieldConf['MM'],$row['uid']);
00518 reset($dbAnalysis->itemArray);
00519 while (list($somekey,$someval)=each($dbAnalysis->itemArray)) {
00520 if ($someval['id']) {
00521 $tempArr[]=$someval['id'];
00522 }
00523 }
00524 } else {
00525 $tempArr = explode(',',trim($row[$field]));
00526 }
00527 reset($tempArr);
00528 while (list(,$file)=each($tempArr)) {
00529 $file = trim($file);
00530 if ($file) {
00531 $this->checkFileRefs[$fieldConf['uploadfolder']][$file]+=1;
00532 }
00533 }
00534 }
00535 if ($fieldConf['internal_type']=='db') {
00536
00537 $dbAnalysis = t3lib_div::makeInstance('t3lib_loadDBGroup');
00538 $dbAnalysis->start($row[$field],$fieldConf['allowed'],$fieldConf['MM'],$row['uid']);
00539 reset($dbAnalysis->itemArray);
00540 while (list(,$tempArr)=each($dbAnalysis->itemArray)) {
00541 $this->checkGroupDBRefs[$tempArr['table']][$tempArr['id']]+=1;
00542 }
00543 }
00544 }
00545 if ($fieldConf['type']=='select' && $fieldConf['foreign_table']) {
00546
00547 $dbAnalysis = t3lib_div::makeInstance('t3lib_loadDBGroup');
00548 $dbAnalysis->start($row[$field],$fieldConf['foreign_table'],$fieldConf['MM'],$row['uid']);
00549 reset($dbAnalysis->itemArray);
00550 while (list(,$tempArr)=each($dbAnalysis->itemArray)) {
00551 if ($tempArr['id']>0) {
00552 $this->checkGroupDBRefs[$fieldConf['foreign_table']][$tempArr['id']]+=1;
00553 }
00554 }
00555 }
00556 }
00557 }
00558 }
00559 }
00560 }
00561 }
00562 }
00563
00569 function testFileRefs () {
00570 $output=Array();
00571 reset($this->checkFileRefs);
00572 while(list($folder,$fileArr)=each($this->checkFileRefs)) {
00573 $path = PATH_site.$folder;
00574 if (@is_dir($path)) {
00575 $d = dir($path);
00576 while($entry=$d->read()) {
00577 if (@is_file($path.'/'.$entry)) {
00578 if (isset($fileArr[$entry])) {
00579 if ($fileArr[$entry] > 1) {
00580 $temp = $this->whereIsFileReferenced($folder,$entry);
00581 $tempList = '';
00582 while(list(,$inf)=each($temp)) {
00583 $tempList.='['.$inf['table'].']['.$inf['uid'].']['.$inf['field'].'] (pid:'.$inf['pid'].') - ';
00584 }
00585 $output['moreReferences'][] = Array($path,$entry,$fileArr[$entry],$tempList);
00586 }
00587 unset($fileArr[$entry]);
00588 } else {
00589 if (!strstr($entry,'index.htm')) {
00590 $output['noReferences'][] = Array($path,$entry);
00591 }
00592 }
00593 }
00594 }
00595 $d->close();
00596 reset($fileArr);
00597 $tempCounter=0;
00598 while(list($file,)=each($fileArr)) {
00599 $temp = $this->whereIsFileReferenced($folder,$file);
00600 $tempList = '';
00601 while(list(,$inf)=each($temp)) {
00602 $tempList.='['.$inf['table'].']['.$inf['uid'].']['.$inf['field'].'] (pid:'.$inf['pid'].') - ';
00603 }
00604 $tempCounter++;
00605 $output['noFile'][substr($path,-3).'_'.substr($file,0,3).'_'.$tempCounter] = Array($path,$file,$tempList);
00606 }
00607 } else {
00608 $output['error'][] = Array($path);
00609 }
00610 }
00611 return $output;
00612 }
00613
00620 function testDBRefs($theArray) {
00621 global $TCA;
00622 reset($theArray);
00623 while(list($table,$dbArr)=each($theArray)) {
00624 if ($TCA[$table]) {
00625 $idlist = Array();
00626 while(list($id,)=each($dbArr)) {
00627 $idlist[]=$id;
00628 }
00629 $theList = implode(',',$idlist);
00630 if ($theList) {
00631 $mres = $GLOBALS['TYPO3_DB']->exec_SELECTquery('uid', $table, 'uid IN ('.$theList.')'.t3lib_BEfunc::deleteClause($table));
00632 while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($mres)) {
00633 if (isset($dbArr[$row['uid']])) {
00634 unset ($dbArr[$row['uid']]);
00635 } else {
00636 $result.='Strange Error. ...<br />';
00637 }
00638 }
00639 reset($dbArr);
00640 while (list($theId,$theC)=each($dbArr)) {
00641 $result.='There are '.$theC.' records pointing to this missing or deleted record; ['.$table.']['.$theId.']<br />';
00642 }
00643 }
00644 } else {
00645 $result.='Codeerror. Table is not a table...<br />';
00646 }
00647 }
00648 return $result;
00649 }
00650
00658 function whereIsRecordReferenced($searchTable,$id) {
00659 global $TCA;
00660 $fileFields = $this->getDBFields($searchTable);
00661 $theRecordList=Array();
00662 while (list(,$info)=each($fileFields)) {
00663 $table=$info[0]; $field=$info[1];
00664 t3lib_div::loadTCA($table);
00665 $mres = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
00666 'uid,pid,'.$TCA[$table]['ctrl']['label'].','.$field,
00667 $table,
00668 $field.' LIKE \'%'.$GLOBALS['TYPO3_DB']->quoteStr($id, $table).'%\''
00669 );
00670 while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($mres)) {
00671
00672 $fieldConf = $TCA[$table]['columns'][$field]['config'];
00673 $allowedTables = ($fieldConf['type']=='group') ? $fieldConf['allowed'] : $fieldConf['foreign_table'];
00674
00675 $dbAnalysis = t3lib_div::makeInstance('t3lib_loadDBGroup');
00676 $dbAnalysis->start($row[$field],$allowedTables,$fieldConf['MM'],$row['uid']);
00677 reset($dbAnalysis->itemArray);
00678 while (list(,$tempArr)=each($dbAnalysis->itemArray)) {
00679 if ($tempArr['table']==$searchTable && $tempArr['id']==$id) {
00680 $theRecordList[]=Array('table'=>$table,'uid'=>$row['uid'],'field'=>$field,'pid'=>$row['pid']);
00681 }
00682 }
00683 }
00684 }
00685 return $theRecordList;
00686 }
00687
00695 function whereIsFileReferenced($uploadfolder,$filename) {
00696 global $TCA;
00697 $fileFields = $this->getFileFields($uploadfolder);
00698 $theRecordList=Array();
00699 while (list(,$info)=each($fileFields)) {
00700 $table=$info[0]; $field=$info[1];
00701 $mres = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
00702 'uid,pid,'.$TCA[$table]['ctrl']['label'].','.$field,
00703 $table,
00704 $field.' LIKE \'%'.$GLOBALS['TYPO3_DB']->quoteStr($filename, $table).'%\''
00705 );
00706 while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($mres)) {
00707
00708 $tempArr = explode(',',trim($row[$field]));
00709 while (list(,$file)=each($tempArr)) {
00710 $file = trim($file);
00711 if ($file==$filename) {
00712 $theRecordList[]=Array('table'=>$table,'uid'=>$row['uid'],'field'=>$field,'pid'=>$row['pid']);
00713 }
00714 }
00715 }
00716 }
00717 return $theRecordList;
00718 }
00719 }
00720
00721
00722 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_admin.php']) {
00723 include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_admin.php']);
00724 }
00725 ?>