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
00086 class recordList extends t3lib_recordList {
00087
00088
00089 var $tableList='';
00090 var $returnUrl='';
00091 var $thumbs = 0;
00092 var $itemsLimitPerTable = 20;
00093 var $itemsLimitSingleTable = 100;
00094 var $widthGif = '<img src="clear.gif" width="1" height="4" hspace="160" alt="" />';
00095 var $script = 'db_list.php';
00096 var $allFields=0;
00097 var $localizationView=FALSE;
00098
00099
00100 var $csvOutput=FALSE;
00101 var $sortField;
00102 var $sortRev;
00103 var $displayFields;
00104 var $duplicateField;
00105
00106
00107 var $id;
00108 var $table='';
00109 var $listOnlyInSingleTableMode=FALSE;
00110 var $firstElementNumber=0;
00111 var $searchString='';
00112 var $searchLevels='';
00113 var $showLimit=0;
00114 var $pidSelect='';
00115 var $perms_clause='';
00116 var $calcPerms=0;
00117 var $clickTitleMode = '';
00118 var $modSharedTSconfig = array();
00119 var $pageRecord = array();
00120 var $hideTables = '';
00121
00122
00123 var $JScode = '';
00124 var $HTMLcode = '';
00125 var $iLimit=0;
00126 var $eCounter=0;
00127 var $totalItems='';
00128 var $recPath_cache=array();
00129 var $setFields=array();
00130 var $currentTable = array();
00131 var $duplicateStack=array();
00132
00133
00134
00135
00136
00148 function start($id,$table,$pointer,$search="",$levels="",$showLimit=0) {
00149 global $TCA;
00150
00151
00152 $this->id=intval($id);
00153 if ($TCA[$table]) $this->table=$table;
00154 $this->firstElementNumber=$pointer;
00155 $this->searchString=trim($search);
00156 $this->searchLevels=trim($levels);
00157 $this->showLimit=t3lib_div::intInRange($showLimit,0,10000);
00158
00159
00160 $this->csvOutput = t3lib_div::_GP('csv') ? TRUE : FALSE;
00161 $this->sortField = t3lib_div::_GP('sortField');
00162 $this->sortRev = t3lib_div::_GP('sortRev');
00163 $this->displayFields = t3lib_div::_GP('displayFields');
00164 $this->duplicateField = t3lib_div::_GP('duplicateField');
00165
00166 if (t3lib_div::_GP('justLocalized')) {
00167 $this->localizationRedirect(t3lib_div::_GP('justLocalized'));
00168 }
00169
00170
00171 if (!$GLOBALS['TYPO3_CONF_VARS']['GFX']['thumbnails']) {
00172 $this->thumbScript='gfx/notfound_thumb.gif';
00173 }
00174
00175
00176 $this->counter=0;
00177 $this->JScode='';
00178 $this->HTMLcode='';
00179
00180
00181 $sL=intval($this->searchLevels);
00182 $this->perms_clause = $GLOBALS['BE_USER']->getPagePermsClause(1);
00183
00184
00185 if ($pidList = $GLOBALS['BE_USER']->getTSConfigVal('options.hideRecords.pages')) {
00186 if ($pidList = $GLOBALS['TYPO3_DB']->cleanIntList($pidList)) {
00187 $this->perms_clause .= ' AND pages.uid NOT IN ('.$pidList.')';
00188 }
00189 }
00190
00191 if ($sL>0) {
00192 $tree = $this->getTreeObject($id,$sL,$this->perms_clause);
00193 $this->pidSelect = 'pid IN ('.implode(',',$tree->ids).')';
00194 } else {
00195 $this->pidSelect = 'pid='.intval($id);
00196 }
00197
00198
00199 if ($this->localizationView) {
00200 $this->initializeLanguages();
00201 }
00202 }
00203
00211 function generateList() {
00212 global $TCA;
00213
00214
00215 $this->pageRecord = t3lib_BEfunc::getRecordWSOL('pages',$this->id);
00216
00217
00218 reset($TCA);
00219 while (list($tableName)=each($TCA)) {
00220
00221
00222 if ((!$this->table || $tableName==$this->table) && (!$this->tableList || t3lib_div::inList($this->tableList,$tableName)) && $GLOBALS['BE_USER']->check('tables_select',$tableName)) {
00223
00224
00225 t3lib_div::loadTCA($tableName);
00226
00227
00228 if (t3lib_div::inList($this->hideTables, $tableName)) continue;
00229
00230
00231 if ($this->table) {
00232 $this->iLimit=(isset($TCA[$tableName]['interface']['maxSingleDBListItems'])?intval($TCA[$tableName]['interface']['maxSingleDBListItems']):$this->itemsLimitSingleTable);
00233 } else {
00234 $this->iLimit=(isset($TCA[$tableName]['interface']['maxDBListItems'])?intval($TCA[$tableName]['interface']['maxDBListItems']):$this->itemsLimitPerTable);
00235 }
00236 if ($this->showLimit) $this->iLimit = $this->showLimit;
00237
00238
00239 if ($this->allFields) {
00240 $fields = $this->makeFieldList($tableName);
00241 $fields[]='tstamp';
00242 $fields[]='crdate';
00243 $fields[]='_PATH_';
00244 $fields[]='_CONTROL_';
00245 if (is_array($this->setFields[$tableName])) {
00246 $fields = array_intersect($fields,$this->setFields[$tableName]);
00247 } else {
00248 $fields = array();
00249 }
00250 } else {
00251 $fields = array();
00252 }
00253
00254
00255 if (intval($this->searchLevels)==0) {
00256 if ($TCA[$tableName]['ctrl']['versioning_followPages'] && $this->pageRecord['_ORIG_pid']==-1 && $this->pageRecord['t3ver_swapmode']==0) {
00257 $this->pidSelect = 'pid='.intval($this->pageRecord['_ORIG_uid']);
00258 } else {
00259 $this->pidSelect = 'pid='.intval($this->id);
00260 }
00261 }
00262 #debug($this->pidSelect,$tableName);
00263
00264 $this->HTMLcode.=$this->getTable($tableName, $this->id, implode(',',$fields));
00265 }
00266 }
00267 }
00268
00275 function getSearchBox($formFields=1) {
00276
00277
00278 $formElements=array('','');
00279 if ($formFields) {
00280 $formElements=array('<form action="'.htmlspecialchars($this->listURL()).'" method="post">','</form>');
00281 }
00282
00283
00284 $opt=array();
00285 $parts = explode('|',$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:labels.enterSearchLevels'));
00286 while(list($kv,$label)=each($parts)) {
00287 $opt[] = '<option value="'.$kv.'"'.($kv==intval($this->searchLevels)?' selected="selected"':'').'>'.htmlspecialchars($label).'</option>';
00288 }
00289 $lMenu = '<select name="search_levels">'.implode('',$opt).'</select>';
00290
00291
00292 $content.= '
00293 '.$formElements[0].'
00294
00295 <!--
00296 Search box:
00297 -->
00298 <table border="0" cellpadding="0" cellspacing="0" class="bgColor4" id="typo3-dblist-search">
00299 <tr>
00300 <td>'.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:labels.enterSearchString',1).'<input type="text" name="search_field" value="'.htmlspecialchars($this->searchString).'"'.$GLOBALS['TBE_TEMPLATE']->formWidth(10).' /></td>
00301 <td>'.$lMenu.'</td>
00302 <td><input type="submit" name="search" value="'.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:labels.search',1).'" /></td>
00303 </tr>
00304 <tr>
00305 <td colspan="3">'.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:labels.showRecords',1).':<input type="text" name="showLimit" value="'.htmlspecialchars($this->showLimit?$this->showLimit:'').'"'.$GLOBALS['SOBE']->doc->formWidth(4).' /></td>
00306 </tr>
00307 </table>
00308 '.$formElements[1];
00309 $content.=t3lib_BEfunc::cshItem('xMOD_csh_corebe', 'list_searchbox', $GLOBALS['BACK_PATH'],'|<br/>');
00310 return $content;
00311 }
00312
00319 function showSysNotesForPage() {
00320 global $TCA;
00321
00322 $out='';
00323
00324
00325 if (!t3lib_extMgm::isLoaded('sys_note')) return '';
00326
00327
00328 $result = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*','sys_note','pid IN ('.$this->id.') AND (personal=0 OR cruser='.intval($GLOBALS['BE_USER']->user['uid']).')'.t3lib_BEfunc::deleteClause('sys_note').t3lib_BEfunc::versioningPlaceholderClause('sys_note'));
00329
00330
00331 $dbCount = $GLOBALS['TYPO3_DB']->sql_num_rows($result);
00332
00333
00334 if ($dbCount) {
00335 $cat = array();
00336
00337
00338 t3lib_div::loadTCA('sys_note');
00339
00340
00341 if ($TCA['sys_note'] && $TCA['sys_note']['columns']['category'] && is_array($TCA['sys_note']['columns']['category']['config']['items'])) {
00342 foreach($TCA['sys_note']['columns']['category']['config']['items'] as $el) {
00343 $cat[$el[1]]=$GLOBALS['LANG']->sL($el[0]);
00344 }
00345 }
00346
00347
00348 while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($result)) {
00349
00350
00351 $iconImg = t3lib_iconWorks::getIconImage('sys_note',$row,$this->backPath,'');
00352 $subject = htmlspecialchars($row['subject']);
00353 $fields = array();
00354 $fields['Author:'] = htmlspecialchars($row['author'].($row['email'] && $row['author'] ? ', ':'').$row['email']);
00355 $fields['Category:'] = htmlspecialchars($cat[$row['category']]);
00356 $fields['Note:'] = nl2br(htmlspecialchars($row['message']));
00357
00358
00359 $out.='
00360
00361
00362 <!--
00363 Sys-notes for the db_list.php:
00364 -->
00365 <table border="0" cellpadding="1" cellspacing="1" id="typo3-dblist-sysnotes">
00366 <tr><td colspan="2" class="bgColor2">'.$iconImg.'<strong>'.$subject.'</strong></td></tr>
00367 <tr><td class="bgColor4">'.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:labels.category',1).'</td><td class="bgColor4">'.$fields['Category:'].'</td></tr>
00368 <tr><td class="bgColor4">'.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:labels.author',1).'</td><td class="bgColor4">'.$fields['Author:'].'</td></tr>
00369 <tr><td class="bgColor4">'.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:labels.note',1).'</td><td class="bgColor4">'.$fields['Note:'].'</td></tr>
00370 </table>
00371 ';
00372 }
00373 }
00374 return $out;
00375 }
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389
00396 function setDispFields() {
00397
00398
00399 $dispFields = $GLOBALS['BE_USER']->getModuleData('db_list.php/displayFields');
00400
00401
00402 if (is_array($this->displayFields)) {
00403 reset($this->displayFields);
00404 $tKey = key($this->displayFields);
00405 $dispFields[$tKey]=$this->displayFields[$tKey];
00406 $GLOBALS['BE_USER']->pushModuleData('db_list.php/displayFields',$dispFields);
00407 }
00408
00409
00410 $this->setFields=$dispFields;
00411 }
00412
00421 function thumbCode($row,$table,$field) {
00422 return t3lib_BEfunc::thumbCode($row,$table,$field,$this->backPath,$this->thumbScript);
00423 }
00424
00434 function makeQueryArray($table, $id, $addWhere="",$fieldList='*') {
00435 global $TCA;
00436
00437
00438 $orderBy = ($TCA[$table]['ctrl']['sortby']) ? 'ORDER BY '.$TCA[$table]['ctrl']['sortby'] : $TCA[$table]['ctrl']['default_sortby'];
00439 if ($this->sortField) {
00440 if (in_array($this->sortField,$this->makeFieldList($table,1))) {
00441 $orderBy = 'ORDER BY '.$this->sortField;
00442 if ($this->sortRev) $orderBy.=' DESC';
00443 }
00444 }
00445
00446
00447 $limit = $this->iLimit ? ($this->firstElementNumber ? $this->firstElementNumber.',' : '').($this->iLimit+1) : '';
00448
00449
00450 $pC = ($table=='pages' && $this->perms_clause)?' AND '.$this->perms_clause:'';
00451
00452
00453 $search = $this->makeSearchString($table);
00454
00455
00456 $queryParts = array(
00457 'SELECT' => $fieldList,
00458 'FROM' => $table,
00459 'WHERE' => $this->pidSelect.
00460 ' '.$pC.
00461 t3lib_BEfunc::deleteClause($table).
00462 t3lib_BEfunc::versioningPlaceholderClause($table).
00463 ' '.$addWhere.
00464 ' '.$search,
00465 'GROUPBY' => '',
00466 'ORDERBY' => $GLOBALS['TYPO3_DB']->stripOrderBy($orderBy),
00467 'LIMIT' => $limit
00468 );
00469
00470
00471 return $queryParts;
00472 }
00473
00481 function setTotalItems($queryParts) {
00482 $result = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
00483 'count(*)',
00484 $queryParts['FROM'],
00485 $queryParts['WHERE']
00486 );
00487 list($rCount) = $GLOBALS['TYPO3_DB']->sql_fetch_row($result);
00488 $this->totalItems = $rCount;
00489 }
00490
00497 function makeSearchString($table) {
00498 global $TCA;
00499
00500
00501 if ($TCA[$table] && $this->searchString) {
00502
00503
00504 t3lib_div::loadTCA($table);
00505
00506
00507 $sfields=array();
00508 $sfields[]='uid';
00509
00510
00511 foreach($TCA[$table]['columns'] as $fieldName => $info) {
00512 if ($info['config']['type']=='text' || ($info['config']['type']=='input' && !ereg('date|time|int',$info['config']['eval']))) {
00513 $sfields[]=$fieldName;
00514 }
00515 }
00516
00517
00518 if (count($sfields)) {
00519 $like = ' LIKE \'%'.$GLOBALS['TYPO3_DB']->quoteStr($this->searchString, $table).'%\'';
00520 $queryPart = ' AND ('.implode($like.' OR ',$sfields).$like.')';
00521
00522
00523 return $queryPart;
00524 }
00525 }
00526 }
00527
00536 function linkWrapTable($table,$code) {
00537 if ($this->table!=$table) {
00538 return '<a href="'.htmlspecialchars($this->listURL('',$table)).'">'.$code.'</a>';
00539 } else {
00540 return '<a href="'.htmlspecialchars($this->listURL('','','sortField,sortRev,table')).'">'.$code.'</a>';
00541 }
00542 }
00543
00553 function linkWrapItems($table,$uid,$code,$row) {
00554 global $TCA, $LANG;
00555
00556 $origCode = $code;
00557
00558
00559 if (!strcmp($code,'')) {
00560 $code = '<i>['.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:labels.no_title',1).']</i> - '.htmlspecialchars(t3lib_div::fixed_lgd_cs(t3lib_BEfunc::getRecordTitle($table,$row),$GLOBALS['BE_USER']->uc['titleLen']));
00561 } else {
00562 $code = htmlspecialchars(t3lib_div::fixed_lgd_cs($code,$this->fixedL));
00563 }
00564
00565 switch((string)$this->clickTitleMode) {
00566 case 'edit':
00567
00568 if ($table=='pages') {
00569 $localCalcPerms = $GLOBALS['BE_USER']->calcPerms(t3lib_BEfunc::getRecord('pages',$row['uid']));
00570 $permsEdit = $localCalcPerms&2;
00571 } else {
00572 $permsEdit = $this->calcPerms&16;
00573 }
00574
00575
00576 if ($permsEdit) {
00577 $params='&edit['.$table.']['.$row['uid'].']=edit';
00578 $code = '<a href="#" onclick="'.htmlspecialchars(t3lib_BEfunc::editOnClick($params,$this->backPath,-1)).'" title="'.$LANG->getLL('edit',1).'">'.
00579 $code.
00580 '</a>';
00581 }
00582 break;
00583 case 'show':
00584
00585 if ($table=='pages' || $table=='tt_content') {
00586 $code = '<a href="#" onclick="'.htmlspecialchars(t3lib_BEfunc::viewOnClick($table=='tt_content'?$this->id.'#'.$row['uid']:$row['uid'])).'" title="'.$LANG->sL('LLL:EXT:lang/locallang_core.php:labels.showPage',1).'">'.
00587 $code.
00588 '</a>';
00589 }
00590 break;
00591 case 'info':
00592
00593 $code = '<a href="#" onclick="'.htmlspecialchars('top.launchView(\''.$table.'\', \''.$row['uid'].'\'); return false;').'" title="'.$LANG->getLL('showInfo',1).'">'.
00594 $code.
00595 '</a>';
00596 break;
00597 default:
00598
00599 if ($table=='pages') {
00600 $code = '<a href="'.htmlspecialchars($this->listURL($uid,'')).'" onclick="setHighlight('.$uid.')">'.$code.'</a>';
00601 } else {
00602 $code = $this->linkUrlMail($code,$origCode);
00603 }
00604 break;
00605 }
00606
00607 return $code;
00608 }
00609
00617 function linkUrlMail($code,$testString) {
00618
00619
00620 $schema = parse_url($testString);
00621 if ($schema['scheme'] && t3lib_div::inList('http,https,ftp',$schema['scheme'])) {
00622 return '<a href="'.htmlspecialchars($testString).'" target="_blank">'.$code.'</a>';
00623 }
00624
00625
00626 if (t3lib_div::validEmail($testString)) {
00627 return '<a href="mailto:'.htmlspecialchars($testString).'" target="_blank">'.$code.'</a>';
00628 }
00629
00630
00631 return $code;
00632 }
00633
00644 function listURL($altId='',$table=-1,$exclList='') {
00645 return $this->script.
00646 '?id='.(strcmp($altId,'')?$altId:$this->id).
00647 '&table='.rawurlencode($table==-1?$this->table:$table).
00648 ($this->thumbs?'&imagemode='.$this->thumbs:'').
00649 ($this->returnUrl?'&returnUrl='.rawurlencode($this->returnUrl):'').
00650 ($this->searchString?'&search_field='.rawurlencode($this->searchString):'').
00651 ($this->searchLevels?'&search_levels='.rawurlencode($this->searchLevels):'').
00652 ($this->showLimit?'&showLimit='.rawurlencode($this->showLimit):'').
00653 ((!$exclList || !t3lib_div::inList($exclList,'sortField')) && $this->sortField?'&sortField='.rawurlencode($this->sortField):'').
00654 ((!$exclList || !t3lib_div::inList($exclList,'sortRev')) && $this->sortRev?'&sortRev='.rawurlencode($this->sortRev):'')
00655 ;
00656 }
00657
00663 function requestUri() {
00664 return $this->listURL();
00665 }
00666
00674 function makeFieldList($table,$dontCheckUser=0) {
00675 global $TCA,$BE_USER;
00676
00677
00678 $fieldListArr = array();
00679
00680
00681 if (is_array($TCA[$table])) {
00682 t3lib_div::loadTCA($table);
00683
00684
00685 foreach($TCA[$table]['columns'] as $fN => $fieldValue) {
00686 if ($dontCheckUser ||
00687 ((!$fieldValue['exclude'] || $BE_USER->check('non_exclude_fields',$table.':'.$fN)) && $fieldValue['config']['type']!='passthrough')) {
00688 $fieldListArr[]=$fN;
00689 }
00690 }
00691
00692
00693 if ($dontCheckUser || $BE_USER->isAdmin()) {
00694 $fieldListArr[]='uid';
00695 $fieldListArr[]='pid';
00696 if ($TCA[$table]['ctrl']['tstamp']) $fieldListArr[]=$TCA[$table]['ctrl']['tstamp'];
00697 if ($TCA[$table]['ctrl']['crdate']) $fieldListArr[]=$TCA[$table]['ctrl']['crdate'];
00698 if ($TCA[$table]['ctrl']['cruser_id']) $fieldListArr[]=$TCA[$table]['ctrl']['cruser_id'];
00699 if ($TCA[$table]['ctrl']['sortby']) $fieldListArr[]=$TCA[$table]['ctrl']['sortby'];
00700 if ($TCA[$table]['ctrl']['versioningWS']) {
00701 $fieldListArr[]='t3ver_id';
00702 $fieldListArr[]='t3ver_state';
00703 $fieldListArr[]='t3ver_wsid';
00704 if ($table==='pages') {
00705 $fieldListArr[]='t3ver_swapmode';
00706 }
00707 }
00708 }
00709 }
00710 return $fieldListArr;
00711 }
00712
00721 function getTreeObject($id,$depth,$perms_clause) {
00722 $tree = t3lib_div::makeInstance('t3lib_pageTree');
00723 $tree->init('AND '.$perms_clause);
00724 $tree->makeHTML=0;
00725 $tree->fieldArray = Array('uid','php_tree_stop');
00726 if ($depth) {
00727 $tree->getTree($id, $depth, '');
00728 }
00729 $tree->ids[]=$id;
00730 return $tree;
00731 }
00732
00739 function localizationRedirect($justLocalized) {
00740 global $TCA;
00741
00742 list($table,$orig_uid,$language) = explode(':',$justLocalized);
00743
00744 if ($TCA[$table] && $TCA[$table]['ctrl']['languageField'] && $TCA[$table]['ctrl']['transOrigPointerField']) {
00745 list($localizedRecord) = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows(
00746 'uid',
00747 $table,
00748 $TCA[$table]['ctrl']['languageField'].'='.intval($language).' AND '.
00749 $TCA[$table]['ctrl']['transOrigPointerField'].'='.intval($orig_uid).
00750 t3lib_BEfunc::deleteClause($table).
00751 t3lib_BEfunc::versioningPlaceholderClause($table)
00752 );
00753
00754 if (is_array($localizedRecord)) {
00755
00756 $params = '&edit['.$table.']['.$localizedRecord['uid'].']=edit';
00757 $returnUrl = '&returnUrl='.rawurlencode($this->listURL());
00758 $location = $GLOBALS['BACK_PATH'].'alt_doc.php?'.$params.$returnUrl;
00759
00760 header('Location: '.t3lib_div::locationHeaderUrl($location));
00761 exit;
00762 }
00763 }
00764 }
00765 }
00766
00767
00768 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['typo3/class.db_list.inc']) {
00769 include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['typo3/class.db_list.inc']);
00770 }
00771 ?>