[ Index ]
 

Code source de Typo3 4.1.3

Accédez au Source d'autres logiciels libres

Classes | Fonctions | Variables | Constantes | Tables

title

Body

[fermer]

/t3lib/ -> class.t3lib_admin.php (source)

   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  ?>


Généré le : Sun Nov 25 17:13:16 2007 par Balluche grâce à PHPXref 0.7
  Clicky Web Analytics