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

class.t3lib_page.php

Go to the documentation of this file.
00001 <?php
00002 /***************************************************************
00003 *  Copyright notice
00004 *
00005 *  (c) 1999-2004 Kasper Skaarhoj (kasperYYYY@typo3.com)
00006 *  All rights reserved
00007 *
00008 *  This script is part of the TYPO3 project. The TYPO3 project is
00009 *  free software; you can redistribute it and/or modify
00010 *  it under the terms of the GNU General Public License as published by
00011 *  the Free Software Foundation; either version 2 of the License, or
00012 *  (at your option) any later version.
00013 *
00014 *  The GNU General Public License can be found at
00015 *  http://www.gnu.org/copyleft/gpl.html.
00016 *  A copy is found in the textfile GPL.txt and important notices to the license
00017 *  from the author is found in LICENSE.txt distributed with these scripts.
00018 *
00019 *
00020 *  This script is distributed in the hope that it will be useful,
00021 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00022 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00023 *  GNU General Public License for more details.
00024 *
00025 *  This copyright notice MUST APPEAR in all copies of the script!
00026 ***************************************************************/
00107 class t3lib_pageSelect {
00108    var $urltypes = Array('','http://','ftp://','mailto:');
00109    var $where_hid_del = ' AND pages.deleted=0'; // This is not the final clauses. There will normally be conditions for the hidden,starttime and endtime fields as well. You MUST initialize the object by the init() function
00110    var $sys_language_uid = 0;
00111 
00112       // Versioning preview related:
00113    var $versioningPreview = FALSE;     // If true, preview of other record versions is allowed. THIS MUST ONLY BE SET IF the page is not cached and truely previewed by a backend user!!!
00114    var $versionPreviewMap = array(
00115 # EXAMPLE:     'tt_content:421' => 427
00116    );
00117 
00118 
00119       // Internal, dynamic:
00120    var $error_getRootLine = '';     // Error string set by getRootLine()
00121    var $error_getRootLine_failPid = 0;    // Error uid set by getRootLine()
00122 
00123 
00132    function init($show_hidden)   {
00133       $this->where_hid_del = ' AND pages.deleted=0 ';
00134       if (!$show_hidden)   {
00135          $this->where_hid_del.= 'AND pages.hidden=0 ';
00136       }
00137       $this->where_hid_del.= 'AND (pages.starttime<='.$GLOBALS['SIM_EXEC_TIME'].') AND (pages.endtime=0 OR pages.endtime>'.$GLOBALS['SIM_EXEC_TIME'].') ';
00138    }
00139 
00140 
00141 
00142 
00143 
00144 
00145 
00146 
00147 
00148 
00149 
00150 
00151 
00152 
00153 
00154 
00155 
00156    /*******************************************
00157     *
00158     * Selecting page records
00159     *
00160     ******************************************/
00161 
00171    function getPage($uid)  {
00172       $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*', 'pages', 'uid='.intval($uid).$this->where_hid_del);
00173       if ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))  {
00174 #??         $this->versionOL('pages',$row);
00175          return $this->getPageOverlay($row);
00176       }
00177       return Array();
00178    }
00179 
00187    function getPage_noCheck($uid)   {
00188       $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*', 'pages', 'uid='.intval($uid).$this->deleteClause('pages'));
00189       if ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))  {
00190 #??         $this->versionOL('pages',$row);
00191          return $this->getPageOverlay($row);
00192       }
00193       return Array();
00194    }
00195 
00203    function getFirstWebPage($uid)   {
00204       $output = '';
00205       $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*', 'pages', 'pid='.intval($uid).$this->where_hid_del, '', 'sorting', '1');
00206       if ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))  {
00207 #??         $this->versionOL('pages',$row);
00208          $output = $this->getPageOverlay($row);
00209       }
00210       $GLOBALS['TYPO3_DB']->sql_free_result($res);
00211       return $output;
00212    }
00213 
00221    function getPageIdFromAlias($alias) {
00222       $alias = strtolower($alias);
00223       $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('uid', 'pages', 'alias="'.$GLOBALS['TYPO3_DB']->quoteStr($alias, 'pages').'" AND pid>=0 AND pages.deleted=0');   // "AND pid>=0" is because of versioning...
00224       if ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))  {
00225          return $row['uid'];
00226       }
00227       return 0;
00228    }
00229 
00237    function getPageOverlay($pageInput,$lUid=-1) {
00238 
00239          // Initialize:
00240       if ($lUid<0)   $lUid = $this->sys_language_uid;
00241       unset($row);
00242 
00243          // If language UID is different from zero, do overlay:
00244       if ($lUid)  {
00245          $fieldArr = explode(',', $GLOBALS['TYPO3_CONF_VARS']['FE']['pageOverlayFields']);
00246          if (is_array($pageInput))  {
00247             $page_id = $pageInput['uid']; // Was the whole record
00248             $fieldArr = array_intersect($fieldArr,array_keys($pageInput));    // Make sure that only fields which exist in the incoming record are overlaid!
00249          } else {
00250             $page_id = $pageInput;  // Was the id
00251          }
00252 
00253          if (count($fieldArr))   {
00254             /*
00255                NOTE to enabledFields('pages_language_overlay'):
00256                Currently the showHiddenRecords of TSFE set will allow pages_language_overlay records to be selected as they are child-records of a page.
00257                However you may argue that the showHiddenField flag should determine this. But that's not how it's done right now.
00258             */
00259 
00260                // Selecting overlay record:
00261             $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
00262                      implode(',',$fieldArr),
00263                      'pages_language_overlay',
00264                      'pid='.intval($page_id).'
00265                         AND sys_language_uid='.intval($lUid).
00266                         $this->enableFields('pages_language_overlay'),
00267                      '',
00268                      '',
00269                      '1'
00270                   );
00271             $row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res);
00272             if (is_array($row))  {
00273                $row['_PAGES_OVERLAY'] = TRUE;
00274                $this->versionOL('pages_language_overlay',$row);
00275 
00276                   // Unset vital fields that are NOT allowed to be overlaid:
00277                unset($row['uid']);
00278                unset($row['pid']);
00279             }
00280          }
00281       }
00282 
00283          // Create output:
00284       if (is_array($pageInput))  {
00285          return is_array($row) ? array_merge($pageInput,$row) : $pageInput;   // If the input was an array, simply overlay the newfound array and return...
00286       } else {
00287          return is_array($row) ? $row : array();   // always an array in return
00288       }
00289    }
00290 
00300    function getRecordOverlay($table,$row,$sys_language_content,$OLmode='') {
00301       global $TCA;
00302 
00303       if ($row['uid']>0 && $row['pid']>0) {
00304          if ($TCA[$table] && $TCA[$table]['ctrl']['languageField'] && $TCA[$table]['ctrl']['transOrigPointerField']) {
00305             if (!$TCA[$table]['ctrl']['transOrigPointerTable'])   {  // Will not be able to work with other tables (Just didn't implement it yet; Requires a scan over all tables [ctrl] part for first FIND the table that carries localization information for this table (which could even be more than a single table) and then use that. Could be implemented, but obviously takes a little more....)
00306 
00307                   // Will try to overlay a record only if the sys_language_content value is larger that zero.
00308                if ($sys_language_content>0)  {
00309 
00310                      // Must be default language or [All], otherwise no overlaying:
00311                   if ($row[$TCA[$table]['ctrl']['languageField']]<=0)   {
00312 
00313                         // Select overlay record:
00314                      $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
00315                               '*',
00316                               $table,
00317                               'pid='.intval($row['pid']).
00318                                  ' AND '.$TCA[$table]['ctrl']['languageField'].'='.intval($sys_language_content).
00319                                  ' AND '.$TCA[$table]['ctrl']['transOrigPointerField'].'='.intval($row['uid']).
00320                                  $this->enableFields($table),
00321                               '',
00322                               '',
00323                               '1'
00324                            );
00325                      $olrow = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res);
00326                      $this->versionOL($table,$olrow);
00327    #debug($row);
00328    #debug($olrow);
00329                         // Merge record content by traversing all fields:
00330                      if (is_array($olrow))   {
00331                         foreach($row as $fN => $fV)   {
00332                            if ($fN!='uid' && $fN!='pid' && isset($olrow[$fN]))   {
00333 
00334                               if ($GLOBALS['TSFE']->TCAcachedExtras[$table]['l10n_mode'][$fN]!='exclude'
00335                                     && ($GLOBALS['TSFE']->TCAcachedExtras[$table]['l10n_mode'][$fN]!='mergeIfNotBlank' || strcmp(trim($olrow[$fN]),''))) {
00336                                  $row[$fN] = $olrow[$fN];
00337                               }
00338                            }
00339                         }
00340                      } elseif ($OLmode==='hideNonTranslated' && $row[$TCA[$table]['ctrl']['languageField']]==0)   {  // Unset, if non-translated records should be hidden. ONLY done if the source record really is default language and not [All] in which case it is allowed.
00341                         unset($row);
00342                      }
00343 
00344                      // Otherwise, check if sys_language_content is different from the value of the record - that means a japanese site might try to display french content.
00345                   } elseif ($sys_language_content!=$row[$TCA[$table]['ctrl']['languageField']]) {
00346                      unset($row);
00347                   }
00348                } else {
00349                      // When default language is displayed, we never want to return a record carrying another language!:
00350                   if ($row[$TCA[$table]['ctrl']['languageField']]>0) {
00351                      unset($row);
00352                   }
00353                }
00354             }
00355          }
00356       }
00357 
00358       return $row;
00359    }
00360 
00361 
00362 
00363 
00364 
00365 
00366 
00367 
00368 
00369 
00370 
00371 
00372 
00373 
00374 
00375 
00376 
00377 
00378    /*******************************************
00379     *
00380     * Page related: Menu, Domain record, Root line
00381     *
00382     ******************************************/
00383 
00396    function getMenu($uid,$fields='*',$sortField='sorting',$addWhere='') {
00397       $output = Array();
00398       $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery($fields, 'pages', 'pid='.intval($uid).$this->where_hid_del.' '.$addWhere, '', $sortField);
00399       while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))  {
00400 #??         $this->versionOL('pages',$row);
00401 
00402             // Keep mount point:
00403          $origUid = $row['uid'];
00404          $mount_info = $this->getMountPointInfo($origUid, $row);  // $row MUST have "uid", "pid", "doktype", "mount_pid", "mount_pid_ol" fields in it
00405          if (is_array($mount_info) && $mount_info['overlay'])  {  // There is a valid mount point.
00406             $mp_row = $this->getPage($mount_info['mount_pid']);      // Using "getPage" is OK since we need the check for enableFields AND for type 2 of mount pids we DO require a doktype < 200!
00407             if (count($mp_row))  {
00408                $row = $mp_row;
00409                $row['_MP_PARAM'] = $mount_info['MPvar'];
00410             } else unset($row);  // If the mount point could not be fetched with respect to enableFields, unset the row so it does not become a part of the menu!
00411          }
00412 
00413             // Add to output array after overlaying language:
00414          if (is_array($row))  {
00415             $output[$origUid] = $this->getPageOverlay($row);
00416          }
00417       }
00418       return $output;
00419    }
00420 
00431    function getDomainStartPage($domain, $path='',$request_uri='') {
00432       $domain = explode(':',$domain);
00433       $domain = strtolower(ereg_replace('\.$','',$domain[0]));
00434          // Removing extra trailing slashes
00435       $path = trim(ereg_replace('\/[^\/]*$','',$path));
00436          // Appending to domain string
00437       $domain.= $path;
00438       $domain = ereg_replace('\/*$','',$domain);
00439 
00440       $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
00441                'pages.uid,sys_domain.redirectTo,sys_domain.prepend_params',
00442                'pages,sys_domain',
00443                'pages.uid=sys_domain.pid
00444                   AND sys_domain.hidden=0
00445                   AND (sys_domain.domainName="'.$GLOBALS['TYPO3_DB']->quoteStr($domain, 'sys_domain').'" OR sys_domain.domainName="'.$GLOBALS['TYPO3_DB']->quoteStr($domain.'/', 'sys_domain').'") '.
00446                   $this->where_hid_del,
00447                '',
00448                '',
00449                1
00450             );
00451       if ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))  {
00452          if ($row['redirectTo']) {
00453             $rURL = $row['redirectTo'];
00454             if ($row['prepend_params'])   {
00455                $rURL = ereg_replace('\/$','',$rURL);
00456                $prependStr = ereg_replace('^\/','',substr($request_uri,strlen($path)));
00457                $rURL.='/'.$prependStr;
00458             }
00459             Header('Location: '.t3lib_div::locationHeaderUrl($rURL));
00460             exit;
00461          } else {
00462             return $row['uid'];
00463          }
00464       }
00465    }
00466 
00479    function getRootLine($uid, $MP='', $ignoreMPerrors=FALSE)   {
00480 
00481          // Initialize:
00482       $selFields = t3lib_div::uniqueList('pid,uid,t3ver_oid,title,alias,nav_title,media,layout,hidden,starttime,endtime,fe_group,extendToSubpages,doktype,TSconfig,storage_pid,is_siteroot,mount_pid,mount_pid_ol,'.$GLOBALS['TYPO3_CONF_VARS']['FE']['addRootLineFields']);
00483       $this->error_getRootLine = '';
00484       $this->error_getRootLine_failPid = 0;
00485 
00486          // Splitting the $MP parameters if present
00487       $MPA = array();
00488       if ($MP) {
00489          $MPA = explode(',',$MP);
00490          reset($MPA);
00491          while(list($MPAk) = each($MPA))  {
00492             $MPA[$MPAk] = explode('-', $MPA[$MPAk]);
00493          }
00494       }
00495 
00496       $loopCheck = 0;
00497       $theRowArray = Array();
00498       $uid = intval($uid);
00499 
00500       while ($uid!=0 && $loopCheck<20) {  // Max 20 levels in the page tree.
00501          $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery($selFields, 'pages', 'uid='.intval($uid).' AND pages.deleted=0 AND pages.doktype!=255');
00502          if ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))  {
00503             $this->fixVersioningPid('pages',$row);
00504 #??            $this->versionOL('pages',$row);
00505 
00506                // Mount Point page types are allowed ONLY a) if they are the outermost record in rootline and b) if the overlay flag is not set:
00507             if ($GLOBALS['TYPO3_CONF_VARS']['FE']['enable_mount_pids'] && $row['doktype']==7 && !$ignoreMPerrors) {
00508                $mount_info = $this->getMountPointInfo($row['uid'], $row);
00509                if ($loopCheck>0 || $mount_info['overlay'])  {
00510                   $this->error_getRootLine = 'Illegal Mount Point found in rootline';
00511                   return array();
00512                }
00513             }
00514 
00515             $uid = $row['pid'];  // Next uid
00516 
00517             if (count($MPA) && $GLOBALS['TYPO3_CONF_VARS']['FE']['enable_mount_pids']) {
00518                $curMP = end($MPA);
00519                if (!strcmp($row['uid'],$curMP[0])) {
00520 
00521                   array_pop($MPA);
00522                   $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery($selFields, 'pages', 'uid='.intval($curMP[1]).' AND pages.deleted=0 AND pages.doktype!=255');
00523                   $mp_row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res);
00524 
00525                   if (is_array($mp_row))  {
00526                      $this->fixVersioningPid('pages',$mp_row);
00527 #??                     $this->versionOL('pages',$mp_row);
00528                      $mount_info = $this->getMountPointInfo($mp_row['uid'], $mp_row);
00529                      if (is_array($mount_info) && $mount_info['mount_pid']==$curMP[0]) {
00530                         $uid = $mp_row['pid'];  // Setting next uid
00531 
00532                         if ($mount_info['overlay'])   {  // Symlink style: Keep mount point (current row).
00533                            $row['_MOUNT_OL'] = TRUE;  // Set overlay mode:
00534                            $row['_MOUNT_PAGE'] = array(
00535                               'uid' => $mp_row['uid'],
00536                               'pid' => $mp_row['pid'],
00537                               'title' =>  $mp_row['title'],
00538                            );
00539                         } else { // Normal operation: Insert the mount page row in rootline instead mount point.
00540                            if ($loopCheck>0) {
00541                               $row = $mp_row;
00542                            } else {
00543                               $this->error_getRootLine = 'Current Page Id is a mounted page of the overlay type and cannot be accessed directly!';
00544                               return array();   // Matching the page id (first run, $loopCheck = 0) with the MPvar is ONLY allowed if the mount point is the "overlay" type (otherwise it could be forged!)
00545                            }
00546                         }
00547 
00548                         $row['_MOUNTED_FROM'] = $curMP[0];
00549                         $row['_MP_PARAM'] = $mount_info['MPvar'];
00550                      } else {
00551                         $this->error_getRootLine = 'MP var was corrupted';
00552                         return array();   // The MP variables did NOT connect proper mount points:
00553                      }
00554                   } else {
00555                      $this->error_getRootLine = 'No moint point record found according to PID in MP var';
00556                      return array();   // The second PID in MP var was NOT a valid page.
00557                   }
00558                }
00559             }
00560                // Add row to rootline with language overlaid:
00561             $theRowArray[] = $this->getPageOverlay($row);
00562          } else {
00563             $this->error_getRootLine = 'Broken rootline';
00564             $this->error_getRootLine_failPid = $uid;
00565             return array();   // broken rootline.
00566          }
00567 
00568          $loopCheck++;
00569       }
00570 
00571          // If the MPA array is NOT empty, we have to return an error; All MP elements were not resolved!
00572       if (count($MPA))  {
00573          $this->error_getRootLine = 'MP value remain!';
00574          return array();
00575       }
00576 
00577          // Create output array (with reversed order of numeric keys):
00578       $output = Array();
00579       $c = count($theRowArray);
00580       foreach($theRowArray as $key => $val)  {
00581          $c--;
00582          $output[$c] = $val;
00583       }
00584 
00585       return $output;
00586    }
00587 
00597    function getPathFromRootline($rl,$len=20) {
00598       if (is_array($rl))   {
00599          $c=count($rl);
00600          $path = '';
00601          for ($a=0;$a<$c;$a++)   {
00602             if ($rl[$a]['uid'])  {
00603                $path.='/'.t3lib_div::fixed_lgd_cs(strip_tags($rl[$a]['title']),$len);
00604             }
00605          }
00606          return $path;
00607       }
00608    }
00609 
00618    function getExtURL($pagerow,$disable=0)   {
00619       if ($pagerow['doktype']==3 && !$disable)  {
00620          $redirectTo = $this->urltypes[$pagerow['urltype']].$pagerow['url'];
00621 
00622             // If relative path, prefix Site URL:
00623          $uI = parse_url($redirectTo);
00624          if (!$uI['scheme'] && substr($redirectTo,0,1)!='/')   { // relative path assumed now...
00625             $redirectTo = t3lib_div::getIndpEnv('TYPO3_SITE_URL').$redirectTo;
00626          }
00627          return $redirectTo;
00628       }
00629    }
00630 
00642    function getMountPointInfo($pageId, $pageRec=FALSE, $prevMountPids=array(), $firstPageUid=0) {
00643       if ($GLOBALS['TYPO3_CONF_VARS']['FE']['enable_mount_pids']) {
00644 
00645             // Get pageRec if not supplied:
00646          if (!is_array($pageRec))   {
00647             $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('uid,pid,doktype,mount_pid,mount_pid_ol', 'pages', 'uid='.intval($pageId).' AND pages.deleted=0 AND pages.doktype!=255');
00648             $pageRec = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res);
00649 #??            $this->versionOL('pages',$pageRec);
00650          }
00651 
00652             // Set first Page uid:
00653          if (!$firstPageUid)  $firstPageUid = $pageRec['uid'];
00654 
00655             // Look for mount pid value plus other required circumstances:
00656          $mount_pid = intval($pageRec['mount_pid']);
00657          if (is_array($pageRec) && $pageRec['doktype']==7 && $mount_pid>0 && !in_array($mount_pid, $prevMountPids))  {
00658 
00659                // Get the mount point record (to verify its general existence):
00660             $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('uid,pid,doktype,mount_pid,mount_pid_ol', 'pages', 'uid='.$mount_pid.' AND pages.deleted=0 AND pages.doktype!=255');
00661             $mount_rec = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res);
00662             if (is_array($mount_rec))  {
00663 #??               $this->versionOL('pages',$mount_rec);
00664 
00665                   // Look for recursive mount point:
00666                $prevMountPids[] = $mount_pid;
00667                $recursiveMountPid = $this->getMountPointInfo($mount_pid, $mount_rec, $prevMountPids, $firstPageUid);
00668 
00669                   // Return mount point information:
00670                return $recursiveMountPid ?
00671                         $recursiveMountPid :
00672                         array(
00673                            'mount_pid' => $mount_pid,
00674                            'overlay' => $pageRec['mount_pid_ol'],
00675                            'MPvar' => $mount_pid.'-'.$firstPageUid,
00676                            'mount_point_rec' => $pageRec,
00677                            'mount_pid_rec' => $mount_rec,
00678                         );
00679             } else {
00680                return -1;  // Means, there SHOULD have been a mount point, but there was none!
00681             }
00682          }
00683       }
00684 
00685       return FALSE;
00686    }
00687 
00688 
00689 
00690 
00691 
00692 
00693 
00694 
00695 
00696 
00697 
00698 
00699 
00700 
00701 
00702 
00703 
00704    /*********************************
00705     *
00706     * Selecting records in general
00707     *
00708     **********************************/
00709 
00719    function checkRecord($table,$uid,$checkPage=0)  {
00720       global $TCA;
00721       $uid=intval($uid);
00722       if (is_array($TCA[$table])) {
00723          $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*', $table, 'uid='.intval($uid).$this->enableFields($table));
00724          if ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))  {
00725 #??            $this->versionOL($table,$row);
00726             $GLOBALS['TYPO3_DB']->sql_free_result($res);
00727             if ($checkPage)   {
00728                $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('uid', 'pages', 'uid='.intval($row['pid']).$this->enableFields('pages'));
00729                if ($GLOBALS['TYPO3_DB']->sql_num_rows($res))   {
00730                   return $row;
00731                } else {
00732                   return 0;
00733                }
00734             } else {
00735                return $row;
00736             }
00737          }
00738       }
00739    }
00740 
00750    function getRawRecord($table,$uid,$fields='*')  {
00751       global $TCA;
00752       $uid = intval($uid);
00753       if (is_array($TCA[$table]) || $table=='pages') {   // Excluding pages here so we can ask the function BEFORE TCA gets initialized. Support for this is followed up in deleteClause()...
00754          $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery($fields, $table, 'uid='.intval($uid).$this->deleteClause($table));
00755          if ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))  {
00756 #??            $this->versionOL($table,$row);
00757             return $row;
00758          }
00759       }
00760    }
00761 
00774    function getRecordsByField($theTable,$theField,$theValue,$whereClause='',$groupBy='',$orderBy='',$limit='') {
00775       global $TCA;
00776       if (is_array($TCA[$theTable])) {
00777          $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
00778                   '*',
00779                   $theTable,
00780                   $theField.'="'.$GLOBALS['TYPO3_DB']->quoteStr($theValue, $theTable).'"'.
00781                      $this->deleteClause($theTable).' '.
00782                         $whereClause,  // whereClauseMightContainGroupOrderBy
00783                   $groupBy,
00784                   $orderBy,
00785                   $limit
00786                );
00787          $rows = array();
00788          while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))   {
00789 #??            $this->versionOL($theTable,$row);
00790             $rows[] = $row;
00791          }
00792          $GLOBALS['TYPO3_DB']->sql_free_result($res);
00793          if (count($rows)) return $rows;
00794       }
00795    }
00796 
00797 
00798 
00799 
00800 
00801 
00802 
00803 
00804 
00805 
00806 
00807 
00808 
00809 
00810    /*********************************
00811     *
00812     * Caching and standard clauses
00813     *
00814     **********************************/
00815 
00826    function getHash($hash,$expTime=0)  {
00827          //
00828       $expTime = intval($expTime);
00829       if ($expTime)  {
00830          $whereAdd = ' AND tstamp > '.(time()-$expTime);
00831       }
00832       $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('content', 'cache_hash', 'hash="'.$GLOBALS['TYPO3_DB']->quoteStr($hash, 'cache_hash').'"'.$whereAdd);
00833       if ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))  {
00834          $GLOBALS['TYPO3_DB']->sql_free_result($res);
00835          return $row['content'];
00836       }
00837    }
00838 
00849    function storeHash($hash,$data,$ident) {
00850       $insertFields = array(
00851          'hash' => $hash,
00852          'content' => $data,
00853          'ident' => $ident,
00854          'tstamp' => time()
00855       );
00856       $GLOBALS['TYPO3_DB']->exec_DELETEquery('cache_hash', 'hash="'.$GLOBALS['TYPO3_DB']->quoteStr($hash, 'cache_hash').'"');
00857       $GLOBALS['TYPO3_DB']->exec_INSERTquery('cache_hash', $insertFields);
00858    }
00859 
00867    function deleteClause($table) {
00868       global $TCA;
00869       if (!strcmp($table,'pages'))  {  // Hardcode for pages...:
00870          return ' AND deleted=0';
00871       } else {
00872          return $TCA[$table]['ctrl']['delete'] ? ' AND '.$TCA[$table]['ctrl']['delete'].'=0' : '';
00873       }
00874    }
00875 
00886    function enableFields($table,$show_hidden=-1,$ignore_array=array())  {
00887       if ($show_hidden==-1 && is_object($GLOBALS['TSFE']))  {  // If show_hidden was not set from outside and if TSFE is an object, set it based on showHiddenPage and showHiddenRecords from TSFE
00888          $show_hidden = $table=='pages' ? $GLOBALS['TSFE']->showHiddenPage : $GLOBALS['TSFE']->showHiddenRecords;
00889       }
00890       if ($show_hidden==-1)   $show_hidden=0;   // If show_hidden was not changed during the previous evaluation, do it here.
00891 
00892       $ctrl = $GLOBALS['TCA'][$table]['ctrl'];
00893       $query='';
00894       if (is_array($ctrl)) {
00895          if ($ctrl['delete']) {
00896             $query.=' AND '.$table.'.'.$ctrl['delete'].'=0';
00897          }
00898          if (is_array($ctrl['enablecolumns']))  {
00899             if ($ctrl['enablecolumns']['disabled'] && !$show_hidden && !$ignore_array['disabled']) {
00900                $field = $table.'.'.$ctrl['enablecolumns']['disabled'];
00901                $query.=' AND '.$field.'=0';
00902             }
00903             if ($ctrl['enablecolumns']['starttime'] && !$ignore_array['starttime']) {
00904                $field = $table.'.'.$ctrl['enablecolumns']['starttime'];
00905                $query.=' AND ('.$field.'<='.$GLOBALS['SIM_EXEC_TIME'].')';
00906             }
00907             if ($ctrl['enablecolumns']['endtime'] && !$ignore_array['endtime'])  {
00908                $field = $table.'.'.$ctrl['enablecolumns']['endtime'];
00909                $query.=' AND ('.$field.'=0 OR '.$field.'>'.$GLOBALS['SIM_EXEC_TIME'].')';
00910             }
00911             if ($ctrl['enablecolumns']['fe_group'] && !$ignore_array['fe_group'])   {
00912                $field = $table.'.'.$ctrl['enablecolumns']['fe_group'];
00913                $gr_list = $GLOBALS['TSFE']->gr_list;
00914                if (!strcmp($gr_list,''))  $gr_list=0;
00915                $query.=' AND '.$field.' IN ('.$gr_list.')';
00916             }
00917          }
00918       } else {
00919          die ('NO entry in the $TCA-array for the table "'.$table.'". This means that the function enableFields() is called with an invalid table name as argument.');
00920       }
00921 
00922       return $query;
00923    }
00924 
00925 
00926 
00927 
00928 
00929 
00930 
00931 
00932 
00933 
00934 
00935 
00936 
00937 
00938 
00939    /*********************************
00940     *
00941     * Versioning Preview
00942     *
00943     **********************************/
00944 
00954    function fixVersioningPid($table,&$rr) {
00955       global $TCA;
00956 # SWAP uid as well???
00957       if ($this->versioningPreview && $rr['pid']==-1 && ($table=='pages' || $TCA[$table]['ctrl']['versioning']))  {  // Have to hardcode it for "pages" table since TCA is not loaded at this moment!
00958          if ($rr['t3ver_oid']>0) {  // If "t3ver_oid" is already a field, just set this:
00959             $oid = $rr['t3ver_oid'];
00960          } else { // Otherwise we have to expect "uid" to be in the record and look up based on this:
00961             $newPidRec = $this->getRawRecord($table,$rr['uid'],'t3ver_oid');
00962             if (is_array($newPidRec))  {
00963                $oid = $newPidRec['t3ver_oid'];
00964             }
00965          }
00966 
00967             // If ID of current online version is found, look up the PID value of that:
00968          if ($oid)   {
00969             $oidRec = $this->getRawRecord($table,$oid,'pid');
00970             if (is_array($oidRec))  {
00971                $rr['_ORIG_pid'] = $rr['pid'];
00972                $rr['pid'] = $oidRec['pid'];
00973             }
00974          }
00975       }
00976    }
00977 
00986    function versionOL($table,&$row) {
00987       global $TCA;
00988 
00989       if ($this->versioningPreview && $TCA[$table]['ctrl']['versioning'])  {
00990 #debug($row,$table);
00991 #debug($this->versionPreviewMap);
00992          if (is_array($row) && isset($this->versionPreviewMap[$table.':'.$row['uid']]))   {
00993 
00994                // ID to look for:
00995             $lookFor = $this->versionPreviewMap[$table.':'.$row['uid']];
00996 
00997                // Select the alternative version:
00998             $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*', $table, 'uid='.intval($lookFor).$this->deleteClause($table));
00999             if ($altrow = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))  {
01000                if ($altrow['pid']==-1 && $altrow['t3ver_oid']==$row['uid'])   {
01001                   unset($altrow['pid']);  // Unsetting PID since this is basically the same as what fixVersioningPid would do to the record...
01002                   unset($altrow['uid']);  // Unsetting UID because the overlaid record should KEEP its own UID.
01003                   # unset(...);  // more fields being unset???
01004                   $row = t3lib_div::array_merge_recursive_overrule($row,$altrow,TRUE);
01005 #debug($row,'Found:');
01006                }
01007             }
01008          }
01009       }
01010    }
01011 }
01012 
01013 
01014 
01015 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_page.php']) {
01016    include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_page.php']);
01017 }
01018 ?>

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