added feature #6793: Rename User and Tools modules, credits Francois Suter
[Packages/TYPO3.CMS.git] / typo3 / class.db_list_extra.inc
1 <?php
2 /*************************************************************
3 *  Copyright notice
4 *
5 *  (c) 1999-2007 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  * Include file extending recordList which extended t3lib_recordList
29  * Used specifically for the Web>List module (db_list.php)
30  *
31  * $Id$
32  * Revised for TYPO3 3.6 December/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  *   91: class localRecordList extends recordList
43  *  123:     function writeTop($row)
44  *  304:     function getTable($table,$id,$rowlist)
45  *  559:     function renderListRow($table,$row,$cc,$titleCol,$thumbsCol,$indent=0)
46  *  648:     function renderListHeader($table,$currentIdList)
47  *
48  *              SECTION: Rendering of various elements
49  *  796:     function makeControl($table,$row)
50  *  986:     function makeClip($table,$row)
51  * 1057:     function makeRef($table,$uid)
52  * 1086:     function makeLocalizationPanel($table,$row)
53  * 1148:     function fieldSelectBox($table,$formFields=1)
54  *
55  *              SECTION: Helper functions
56  * 1231:     function linkClipboardHeaderIcon($string,$table,$cmd,$warning='')
57  * 1242:     function clipNumPane()
58  * 1256:     function addSortLink($code,$field,$table)
59  * 1281:     function recPath($pid)
60  * 1294:     function showNewRecLink($table)
61  * 1304:     function makeReturnUrl()
62  *
63  *              SECTION: CSV related functions
64  * 1329:     function initCSV()
65  * 1352:     function addToCSV($row,$table)
66  * 1376:     function setCsvRow($csvRow)
67  * 1387:     function outputCSV($prefix)
68  *
69  * TOTAL FUNCTIONS: 19
70  * (This index is automatically created/updated by the extension "extdeveval")
71  *
72  */
73
74
75
76
77
78
79
80
81
82
83 /**
84  * Class for rendering of Web>List module
85  *
86  * @author      Kasper Skaarhoj <kasperYYYY@typo3.com>
87  * @package TYPO3
88  * @subpackage core
89  */
90 class localRecordList extends recordList {
91
92                 // External:
93         var $alternateBgColors=FALSE;                   // If true, table rows in the list will alternate in background colors (and have background colors at all!)
94         var $allowedNewTables=array();                  // Used to indicate which tables (values in the array) that can have a create-new-record link. If the array is empty, all tables are allowed.
95         var $newWizards=FALSE;                                  // If true, the control panel will contain links to the create-new wizards for pages and tt_content elements (normally, the link goes to just creating a new element without the wizards!).
96
97         var $dontShowClipControlPanels=FALSE;   // If true, will disable the rendering of clipboard + control panels.
98         var $showClipboard=FALSE;                               // If true, will show the clipboard in the field list.
99         var $noControlPanels = FALSE;                   // If true, will DISABLE all control panels in lists. (Takes precedence)
100         var $clickMenuEnabled = TRUE;                   // If true, clickmenus will be rendered
101
102
103
104
105                 // Internal:
106         var $pageRow=array();                                   // Set to the page record (see writeTop())
107
108         var $csvLines=array();                                  // Used to accumulate CSV lines in for CSV export.
109         var $csvOutput=FALSE;                                   // If set, the listing is returned as CSV instead.
110
111         /**
112          * Clipboard object
113          *
114          * @var t3lib_clipboard
115          */
116         var $clipObj;
117         var $CBnames=array();                                   // Tracking names of elements (for clipboard use)
118         var $duplicateStack=array();                    // Used to track which elements has duplicates and how many
119
120
121         /**
122          * Writes the top of the full listing
123          *
124          * @param       array           Current page record
125          * @return      void            (Adds content to internal variable, $this->HTMLcode)
126          */
127         function writeTop($row) {
128                 global $LANG;
129
130                         // Makes the code for the pageicon in the top
131                 $this->pageRow = $row;
132                 $this->counter++;
133                 $alttext = t3lib_BEfunc::getRecordIconAltText($row,'pages');
134                 $iconImg = t3lib_iconWorks::getIconImage('pages',$row,$this->backPath,'class="absmiddle" title="'.htmlspecialchars($alttext).'"');
135                 $titleCol = 'test';     // pseudo title column name
136                 $this->fieldArray = Array($titleCol,'up');              // Setting the fields to display in the list (this is of course "pseudo fields" since this is the top!)
137
138
139                         // Filling in the pseudo data array:
140                 $theData = Array();
141                 $theData[$titleCol] = $this->widthGif;
142
143                         // Get users permissions for this row:
144                 $localCalcPerms = $GLOBALS['BE_USER']->calcPerms($row);
145
146                 $theData['up']=array();
147
148                         // Initialize control panel for currect page ($this->id):
149                         // Some of the controls are added only if $this->id is set - since they make sense only on a real page, not root level.
150                 $theCtrlPanel =array();
151
152                         // "View page" icon is added:
153                 $theCtrlPanel[]='<a href="#" onclick="'.htmlspecialchars(t3lib_BEfunc::viewOnClick($this->id,$this->backPath,t3lib_BEfunc::BEgetRootLine($this->id))).'">'.
154                                                 '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/zoom.gif','width="12" height="12"').' title="'.$LANG->sL('LLL:EXT:lang/locallang_core.php:labels.showPage',1).'" alt="" />'.
155                                                 '</a>';
156
157                         // If edit permissions are set (see class.t3lib_userauthgroup.php)
158                 if ($localCalcPerms&2)  {
159
160                                 // Adding "Edit page" icon:
161                         if ($this->id)  {
162                                 $params='&edit[pages]['.$row['uid'].']=edit';
163                                 $theCtrlPanel[]='<a href="#" onclick="'.htmlspecialchars(t3lib_BEfunc::editOnClick($params,$this->backPath,-1)).'">'.
164                                                                 '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/edit2.gif','width="11" height="12"').' title="'.$LANG->getLL('editPage',1).'" alt="" />'.
165                                                                 '</a>';
166                         }
167
168                                 // Adding "New record" icon:
169                         if (!$GLOBALS['SOBE']->modTSconfig['properties']['noCreateRecordsLink'])        {
170                                 $theCtrlPanel[]='<a href="#" onclick="'.htmlspecialchars('return jumpExt(\''.$this->backPath.'db_new.php?id='.$this->id.'\');').'">'.
171                                                                 '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/new_el.gif','width="11" height="12"').' title="'.$LANG->getLL('newRecordGeneral',1).'" alt="" />'.
172                                                                 '</a>';
173                         }
174
175                                 // Adding "Hide/Unhide" icon:
176                         if ($this->id)  {
177                                 if ($row['hidden'])     {
178                                         $params='&data[pages]['.$row['uid'].'][hidden]=0';
179                                         $theCtrlPanel[]='<a href="#" onclick="'.htmlspecialchars('return jumpToUrl(\''.$GLOBALS['SOBE']->doc->issueCommand($params,-1).'\');').'">'.
180                                                                         '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/button_unhide.gif','width="11" height="10"').' title="'.$LANG->getLL('unHidePage',1).'" alt="" />'.
181                                                                         '</a>';
182                                 } else {
183                                         $params='&data[pages]['.$row['uid'].'][hidden]=1';
184                                         $theCtrlPanel[]='<a href="#" onclick="'.htmlspecialchars('return jumpToUrl(\''.$GLOBALS['SOBE']->doc->issueCommand($params,-1).'\');').'">'.
185                                                                         '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/button_hide.gif','width="11" height="10"').' title="'.$LANG->getLL('hidePage',1).'" alt="" />'.
186                                                                         '</a>';
187                                 }
188                         }
189
190                                 // Adding "move page" button:
191                         if ($this->id)  {
192                                 $theCtrlPanel[]='<a href="#" onclick="'.htmlspecialchars('return jumpExt(\''.$this->backPath.'move_el.php?table=pages&uid='.$row['uid'].'\');').'">'.
193                                                                 '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/move_'.($this->table=='tt_content'?'record':'page').'.gif','width="11" height="12"').' title="'.$LANG->getLL('move_page',1).'" alt="" />'.
194                                                                 '</a>';
195                         }
196                 }
197
198                         // "Paste into page" link:
199                 if (($localCalcPerms&8) || ($localCalcPerms&16))        {
200                         $elFromTable = $this->clipObj->elFromTable('');
201                         if (count($elFromTable))        {
202                                 $theCtrlPanel[]='<a href="'.htmlspecialchars($this->clipObj->pasteUrl('',$this->id)).'" onclick="'.htmlspecialchars('return '.$this->clipObj->confirmMsg('pages',$this->pageRow,'into',$elFromTable)).'">'.
203                                                                 '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/clip_pasteafter.gif','width="12" height="12"').' title="'.$LANG->getLL('clip_paste',1).'" alt="" />'.
204                                                                 '</a>';
205                         }
206                 }
207
208                         // Finally, compile all elements of the control panel into table cells:
209                 if (count($theCtrlPanel))       {
210                         $theData['up'][]='
211
212                                 <!--
213                                         Control panel for page
214                                 -->
215                                 <table border="0" cellpadding="0" cellspacing="0" class="bgColor4" id="typo3-dblist-ctrltop">
216                                         <tr>
217                                                 <td>'.implode('</td>
218                                                 <td>',$theCtrlPanel).'</td>
219                                         </tr>
220                                 </table>';
221                 }
222
223
224                         // Add "clear-cache" link:
225                 $theData['up'][]='<a href="'.htmlspecialchars($this->listURL().'&clear_cache=1').'">'.
226                                                 '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/clear_cache.gif','width="14" height="14"').' title="'.$LANG->sL('LLL:EXT:lang/locallang_core.php:labels.clear_cache',1).'" alt="" />'.
227                                                 '</a>';
228
229                         // Add "CSV" link, if a specific table is shown:
230                 if ($this->table)       {
231                         $theData['up'][]='<a href="'.htmlspecialchars($this->listURL().'&csv=1').'">'.
232                                                         '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/csv.gif','width="27" height="14"').' title="'.$LANG->sL('LLL:EXT:lang/locallang_core.php:labels.csv',1).'" alt="" />'.
233                                                         '</a>';
234                 }
235
236                         // Add "Export" link, if a specific table is shown:
237                 if ($this->table && t3lib_extMgm::isLoaded('impexp'))   {
238                         $theData['up'][]='<a href="'.htmlspecialchars($this->backPath.'mod.php?M=xMOD_tximpexp&tx_impexp[action]=export&tx_impexp[list][]='.rawurlencode($this->table.':'.$this->id)).'">'.
239                                                         '<img'.t3lib_iconWorks::skinImg($this->backPath,t3lib_extMgm::extRelPath('impexp').'export.gif',' width="18" height="16"').' title="'.$LANG->sL('LLL:EXT:lang/locallang_core.php:rm.export',1).'" alt="" />'.
240                                                         '</a>';
241                 }
242
243                         // Add "refresh" link:
244                 $theData['up'][]='<a href="'.htmlspecialchars($this->listURL()).'">'.
245                                                 '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/refresh_n.gif','width="14" height="14"').' title="'.$LANG->sL('LLL:EXT:lang/locallang_core.php:labels.reload',1).'" alt="" />'.
246                                                 '</a>';
247
248
249                         // Add icon with clickmenu, etc:
250                 if ($this->id)  {       // If there IS a real page...:
251
252                                 // Setting title of page + the "Go up" link:
253                         $theData[$titleCol].='<br /><span title="'.htmlspecialchars($row['_thePathFull']).'">'.htmlspecialchars(t3lib_div::fixed_lgd_cs($row['_thePath'],-$this->fixedL)).'</span>';
254                         $theData['up'][]='<a href="'.htmlspecialchars($this->listURL($row['pid'])).'" onclick="setHighlight('.$row['pid'].')">'.
255                                                         '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/i/pages_up.gif','width="18" height="16"').' title="'.$LANG->sL('LLL:EXT:lang/locallang_core.php:labels.upOneLevel',1).'" alt="" />'.
256                                                         '</a>';
257
258                                 // Make Icon:
259                         $theIcon = $this->clickMenuEnabled ? $GLOBALS['SOBE']->doc->wrapClickMenuOnIcon($iconImg,'pages',$this->id) : $iconImg;
260                 } else {        // On root-level of page tree:
261
262                                 // Setting title of root (sitename):
263                         $theData[$titleCol].='<br />'.htmlspecialchars(t3lib_div::fixed_lgd_cs($GLOBALS['TYPO3_CONF_VARS']['SYS']['sitename'],-$this->fixedL));
264
265                                 // Make Icon:
266                         $theIcon = '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/i/_icon_website.gif','width="18" height="16"').' alt="" />';
267                 }
268
269                         // If there is a returnUrl given, add a back-link:
270                 if ($this->returnUrl)   {
271                         $theData['up'][]='<a href="'.htmlspecialchars(t3lib_div::linkThisUrl($this->returnUrl,array('id'=>$this->id))).'" class="typo3-goBack">'.
272                                                         '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/goback.gif','width="14" height="14"').' title="'.$LANG->sL('LLL:EXT:lang/locallang_core.php:labels.goBack',1).'" alt="" />'.
273                                                         '</a>';
274                 }
275
276                         // Finally, the "up" pseudo field is compiled into a table - has been accumulated in an array:
277                 $theData['up']='
278                         <table border="0" cellpadding="0" cellspacing="0">
279                                 <tr>
280                                         <td>'.implode('</td>
281                                         <td>',$theData['up']).'</td>
282                                 </tr>
283                         </table>';
284
285                         // ... and the element row is created:
286                 $out.=$this->addelement(1,$theIcon,$theData,'',$this->leftMargin);
287
288                         // ... and wrapped into a table and added to the internal ->HTMLcode variable:
289                 $this->HTMLcode.='
290
291
292                 <!--
293                         Page header for db_list:
294                 -->
295                         <table border="0" cellpadding="0" cellspacing="0" id="typo3-dblist-top">
296                                 '.$out.'
297                         </table>';
298         }
299
300         /**
301          * Creates the listing of records from a single table
302          *
303          * @param       string          Table name
304          * @param       integer         Page id
305          * @param       string          List of fields to show in the listing. Pseudo fields will be added including the record header.
306          * @return      string          HTML table with the listing for the record.
307          */
308         function getTable($table,$id,$rowlist)  {
309                 global $TCA, $TYPO3_CONF_VARS;
310
311                         // Loading all TCA details for this table:
312                 t3lib_div::loadTCA($table);
313
314                         // Init
315                 $addWhere = '';
316                 $titleCol = $TCA[$table]['ctrl']['label'];
317                 $thumbsCol = $TCA[$table]['ctrl']['thumbnail'];
318                 $l10nEnabled = $TCA[$table]['ctrl']['languageField'] && $TCA[$table]['ctrl']['transOrigPointerField'] && !$TCA[$table]['ctrl']['transOrigPointerTable'];
319
320                         // Cleaning rowlist for duplicates and place the $titleCol as the first column always!
321                 $this->fieldArray=array();
322                 $this->fieldArray[] = $titleCol;        // Add title column
323                 if ($this->localizationView && $l10nEnabled)    {
324                         $this->fieldArray[] = '_LOCALIZATION_';
325                         $this->fieldArray[] = '_LOCALIZATION_b';
326                         $addWhere.=' AND (
327                                 '.$TCA[$table]['ctrl']['languageField'].'<=0
328                                 OR
329                                 '.$TCA[$table]['ctrl']['transOrigPointerField'].' = 0
330                         )';
331                 }
332                 if (!t3lib_div::inList($rowlist,'_CONTROL_'))   {
333                         $this->fieldArray[] = '_CONTROL_';
334                 }
335                 if ($this->showClipboard)       {
336                         $this->fieldArray[] = '_CLIPBOARD_';
337                 }
338                 if (!$this->dontShowClipControlPanels)  {
339                         $this->fieldArray[]='_REF_';
340                 }
341                 if ($this->searchLevels)        {
342                         $this->fieldArray[]='_PATH_';
343                 }
344                         // Cleaning up:
345                 $this->fieldArray=array_unique(array_merge($this->fieldArray,t3lib_div::trimExplode(',',$rowlist,1)));
346                 if ($this->noControlPanels)     {
347                         $tempArray = array_flip($this->fieldArray);
348                         unset($tempArray['_CONTROL_']);
349                         unset($tempArray['_CLIPBOARD_']);
350                         $this->fieldArray = array_keys($tempArray);
351                 }
352
353                         // Creating the list of fields to include in the SQL query:
354                 $selectFields = $this->fieldArray;
355                 $selectFields[] = 'uid';
356                 $selectFields[] = 'pid';
357                 if ($thumbsCol) $selectFields[] = $thumbsCol;   // adding column for thumbnails
358                 if ($table=='pages')    {
359                         if (t3lib_extMgm::isLoaded('cms'))      {
360                                 $selectFields[] = 'module';
361                                 $selectFields[] = 'extendToSubpages';
362                         }
363                         $selectFields[] = 'doktype';
364                 }
365                 if (is_array($TCA[$table]['ctrl']['enablecolumns']))    {
366                         $selectFields = array_merge($selectFields,$TCA[$table]['ctrl']['enablecolumns']);
367                 }
368                 if ($TCA[$table]['ctrl']['type'])       {
369                         $selectFields[] = $TCA[$table]['ctrl']['type'];
370                 }
371                 if ($TCA[$table]['ctrl']['typeicon_column'])    {
372                         $selectFields[] = $TCA[$table]['ctrl']['typeicon_column'];
373                 }
374                 if ($TCA[$table]['ctrl']['versioningWS'])       {
375                         $selectFields[] = 't3ver_id';
376                         $selectFields[] = 't3ver_state';
377                         $selectFields[] = 't3ver_wsid';
378                         $selectFields[] = 't3ver_swapmode';             // Filtered out when pages in makeFieldList()
379                 }
380                 if ($l10nEnabled)       {
381                         $selectFields[] = $TCA[$table]['ctrl']['languageField'];
382                         $selectFields[] = $TCA[$table]['ctrl']['transOrigPointerField'];
383                 }
384                 if ($TCA[$table]['ctrl']['label_alt'])  {
385                         $selectFields = array_merge($selectFields,t3lib_div::trimExplode(',',$TCA[$table]['ctrl']['label_alt'],1));
386                 }
387                 $selectFields = array_unique($selectFields);            // Unique list!
388                 $selectFields = array_intersect($selectFields,$this->makeFieldList($table,1));          // Making sure that the fields in the field-list ARE in the field-list from TCA!
389                 $selFieldList = implode(',',$selectFields);             // implode it into a list of fields for the SQL-statement.
390
391                         // DB-List getTable-Hook
392                 if(is_array($TYPO3_CONF_VARS['SC_OPTIONS']['typo3/class.db_list_extra.inc']['getTable'])) {
393                         foreach($TYPO3_CONF_VARS['SC_OPTIONS']['typo3/class.db_list_extra.inc']['getTable'] as $classData) {
394                                 $hookObject = &t3lib_div::getUserObj($classData);
395
396                                 if(!($hookObject instanceof t3lib_localRecordListGetTableHook)) {
397                                         throw new UnexpectedValueException('$hookObject must implement interface t3lib_localRecordListGetTableHook', 1195114460);
398                                 }
399
400                                 $hookObject->getDBlistQuery($table, $id, $addWhere, $selFieldList, $this);
401                         }
402                 }
403
404                         // Create the SQL query for selecting the elements in the listing:
405                 $queryParts = $this->makeQueryArray($table, $id,$addWhere,$selFieldList);       // (API function from class.db_list.inc)
406                 $this->setTotalItems($queryParts);              // Finding the total amount of records on the page (API function from class.db_list.inc)
407
408                         // Init:
409                 $dbCount = 0;
410                 $out = '';
411
412                         // If the count query returned any number of records, we perform the real query, selecting records.
413                 if ($this->totalItems)  {
414                         $result = $GLOBALS['TYPO3_DB']->exec_SELECT_queryArray($queryParts);
415                         $dbCount = $GLOBALS['TYPO3_DB']->sql_num_rows($result);
416                 }
417
418                 $LOISmode = $this->listOnlyInSingleTableMode && !$this->table;
419
420                         // If any records was selected, render the list:
421                 if ($dbCount)   {
422
423                                 // Half line is drawn between tables:
424                         if (!$LOISmode) {
425                                 $theData = Array();
426                                 if (!$this->table && !$rowlist) {
427                                         $theData[$titleCol] = '<img src="clear.gif" width="'.($GLOBALS['SOBE']->MOD_SETTINGS['bigControlPanel']?'230':'350').'" height="1" alt="" />';
428                                         if (in_array('_CONTROL_',$this->fieldArray))    $theData['_CONTROL_']='';
429                                         if (in_array('_CLIPBOARD_',$this->fieldArray))  $theData['_CLIPBOARD_']='';
430                                 }
431                                 $out.=$this->addelement(0,'',$theData,'class="c-table-row-spacer"',$this->leftMargin);
432                         }
433
434                                 // Header line is drawn
435                         $theData = Array();
436                         if ($this->disableSingleTableView)      {
437                                 $theData[$titleCol] = '<span class="c-table">'.$GLOBALS['LANG']->sL($TCA[$table]['ctrl']['title'],1).'</span> ('.$this->totalItems.')';
438                         } else {
439                                 $theData[$titleCol] = $this->linkWrapTable($table,'<span class="c-table">'.$GLOBALS['LANG']->sL($TCA[$table]['ctrl']['title'],1).'</span> ('.$this->totalItems.') <img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/'.($this->table?'minus':'plus').'bullet_list.gif','width="18" height="12"').' hspace="10" class="absmiddle" title="'.$GLOBALS['LANG']->getLL(!$this->table?'expandView':'contractView',1).'" alt="" />');
440                         }
441
442                                 // CSH:
443                         $theData[$titleCol].= t3lib_BEfunc::cshItem($table,'',$this->backPath,'',FALSE,'margin-bottom:0px; white-space: normal;');
444
445                         if ($LOISmode)  {
446                                 $out.='
447                                         <tr>
448                                                 <td class="c-headLineTable" style="width:95%;">'.$theData[$titleCol].'</td>
449                                         </tr>';
450
451                                 if ($GLOBALS['BE_USER']->uc["edit_showFieldHelp"])      {
452                                         $GLOBALS['LANG']->loadSingleTableDescription($table);
453                                         if (isset($GLOBALS['TCA_DESCR'][$table]['columns']['']))        {
454                                                 $onClick = 'vHWin=window.open(\'view_help.php?tfID='.$table.'.\',\'viewFieldHelp\',\'height=400,width=600,status=0,menubar=0,scrollbars=1\');vHWin.focus();return false;';
455                                                 $out.='
456                                         <tr>
457                                                 <td class="c-tableDescription">'.t3lib_BEfunc::helpTextIcon($table,'',$this->backPath,TRUE).$GLOBALS['TCA_DESCR'][$table]['columns']['']['description'].'</td>
458                                         </tr>';
459                                         }
460                                 }
461                         } else {
462                                 $theUpIcon = ($table=='pages'&&$this->id&&isset($this->pageRow['pid'])) ? '<a href="'.htmlspecialchars($this->listURL($this->pageRow['pid'])).'" onclick="setHighlight('.$this->pageRow['pid'].')"><img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/i/pages_up.gif','width="18" height="16"').' title="'.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:labels.upOneLevel',1).'" alt="" /></a>':'';
463                                 $out.=$this->addelement(1,$theUpIcon,$theData,' class="c-headLineTable"','');
464                         }
465
466                         If (!$LOISmode) {
467                                         // Fixing a order table for sortby tables
468                                 $this->currentTable = array();
469                                 $currentIdList = array();
470                                 $doSort = ($TCA[$table]['ctrl']['sortby'] && !$this->sortField);
471
472                                 $prevUid = 0;
473                                 $prevPrevUid = 0;
474                                 $accRows = array();     // Accumulate rows here
475                                 while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($result))    {
476
477                                                 // In offline workspace, look for alternative record:
478                                         t3lib_BEfunc::workspaceOL($table, $row, $GLOBALS['BE_USER']->workspace, TRUE);
479
480                                         if (is_array($row))     {
481                                                 $accRows[] = $row;
482                                                 $currentIdList[] = $row['uid'];
483                                                 if ($doSort)    {
484                                                         if ($prevUid)   {
485                                                                 $this->currentTable['prev'][$row['uid']] = $prevPrevUid;
486                                                                 $this->currentTable['next'][$prevUid] = '-'.$row['uid'];
487                                                                 $this->currentTable['prevUid'][$row['uid']] = $prevUid;
488                                                         }
489                                                         $prevPrevUid = isset($this->currentTable['prev'][$row['uid']]) ? -$prevUid : $row['pid'];
490                                                         $prevUid=$row['uid'];
491                                                 }
492                                         }
493                                 }
494                                 $GLOBALS['TYPO3_DB']->sql_free_result($result);
495
496                                         // CSV initiated
497                                 if ($this->csvOutput) $this->initCSV();
498
499                                         // Render items:
500                                 $this->CBnames=array();
501                                 $this->duplicateStack=array();
502                                 $this->eCounter=$this->firstElementNumber;
503
504                                 $iOut = '';
505                                 $cc = 0;
506                                 foreach($accRows as $row)       {
507
508                                                 // Forward/Backwards navigation links:
509                                         list($flag,$code) = $this->fwd_rwd_nav($table);
510                                         $iOut.=$code;
511
512                                                 // If render item, increment counter and call function
513                                         if ($flag)      {
514                                                 $cc++;
515                                                 $iOut.= $this->renderListRow($table,$row,$cc,$titleCol,$thumbsCol);
516
517                                                         // If localization view is enabled it means that the selected records are either default or All language and here we will not select translations which point to the main record:
518                                                 if ($this->localizationView && $l10nEnabled)    {
519
520                                                                 // Look for translations of this record:
521                                                         $translations = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows(
522                                                                 $selFieldList,
523                                                                 $table,
524                                                                 'pid='.$row['pid'].
525                                                                         ' AND '.$TCA[$table]['ctrl']['languageField'].'>0'.
526                                                                         ' AND '.$TCA[$table]['ctrl']['transOrigPointerField'].'='.intval($row['uid']).
527                                                                         t3lib_BEfunc::deleteClause($table).
528                                                                         t3lib_BEfunc::versioningPlaceholderClause($table)
529                                                         );
530
531                                                                 // For each available translation, render the record:
532                                                         if (is_array($translations)) {
533                                                                 foreach($translations as $lRow) {
534                                                                                 // In offline workspace, look for alternative record:
535                                                                         t3lib_BEfunc::workspaceOL($table, $lRow, $GLOBALS['BE_USER']->workspace);
536
537                                                                         if (is_array($lRow) && $GLOBALS['BE_USER']->checkLanguageAccess($lRow[$TCA[$table]['ctrl']['languageField']]))  {
538                                                                                 $currentIdList[] = $lRow['uid'];
539                                                                                 $iOut.=$this->renderListRow($table,$lRow,$cc,$titleCol,$thumbsCol,18);
540                                                                         }
541                                                                 }
542                                                         }
543                                                 }
544                                         }
545
546                                                 // Counter of total rows incremented:
547                                         $this->eCounter++;
548                                 }
549
550                                         // The header row for the table is now created:
551                                 $out.=$this->renderListHeader($table,$currentIdList);
552                         }
553
554                                 // The list of records is added after the header:
555                         $out.=$iOut;
556
557                                 // ... and it is all wrapped in a table:
558                         $out='
559
560
561
562                         <!--
563                                 DB listing of elements: "'.htmlspecialchars($table).'"
564                         -->
565                                 <table border="0" cellpadding="0" cellspacing="0" class="typo3-dblist'.($LOISmode?' typo3-dblist-overview':'').'">
566                                         '.$out.'
567                                 </table>';
568
569                                 // Output csv if...
570                         if ($this->csvOutput)   $this->outputCSV($table);       // This ends the page with exit.
571                 }
572
573                         // Return content:
574                 return $out;
575         }
576
577         /**
578          * Rendering a single row for the list
579          *
580          * @param       string          Table name
581          * @param       array           Current record
582          * @param       integer         Counter, counting for each time an element is rendered (used for alternating colors)
583          * @param       string          Table field (column) where header value is found
584          * @param       string          Table field (column) where (possible) thumbnails can be found
585          * @param       integer         Indent from left.
586          * @return      string          Table row for the element
587          * @access private
588          * @see getTable()
589          */
590         function renderListRow($table,$row,$cc,$titleCol,$thumbsCol,$indent=0)  {
591                 $iOut = '';
592
593                 if (strlen($this->searchString))        {       // If in search mode, make sure the preview will show the correct page
594                         $id_orig = $this->id;
595                         $this->id = $row['pid'];
596                 }
597
598                 if (is_array($row))     {
599
600                                 // Background color, if any:
601                         $row_bgColor=
602                                 $this->alternateBgColors ?
603                                 (($cc%2)?'' :' class="db_list_alt"') :
604                                 '';
605
606                                 // Overriding with versions background color if any:
607                         $row_bgColor = $row['_CSSCLASS'] ? ' class="'.$row['_CSSCLASS'].'"' : $row_bgColor;
608
609                                 // Incr. counter.
610                         $this->counter++;
611
612                                 // The icon with link
613                         $alttext = t3lib_BEfunc::getRecordIconAltText($row,$table);
614                         $iconImg = t3lib_iconWorks::getIconImage($table,$row,$this->backPath,'title="'.htmlspecialchars($alttext).'"'.($indent ? ' style="margin-left: '.$indent.'px;"' : ''));
615                         $theIcon = $this->clickMenuEnabled ? $GLOBALS['SOBE']->doc->wrapClickMenuOnIcon($iconImg,$table,$row['uid']) : $iconImg;
616
617                                 // Preparing and getting the data-array
618                         $theData = Array();
619                         foreach($this->fieldArray as $fCol)     {
620                                 if ($fCol==$titleCol)   {
621                                         $recTitle = t3lib_BEfunc::getRecordTitle($table,$row,FALSE,TRUE);
622                                         $theData[$fCol] = $this->linkWrapItems($table,$row['uid'],$recTitle,$row);
623                                 } elseif ($fCol=='pid') {
624                                         $theData[$fCol]=$row[$fCol];
625                                 } elseif ($fCol=='_PATH_') {
626                                         $theData[$fCol]=$this->recPath($row['pid']);
627                                 } elseif ($fCol=='_REF_') {
628                                         $theData[$fCol]=$this->makeRef($table,$row['uid']);
629                                 } elseif ($fCol=='_CONTROL_') {
630                                         $theData[$fCol]=$this->makeControl($table,$row);
631                                 } elseif ($fCol=='_CLIPBOARD_') {
632                                         $theData[$fCol]=$this->makeClip($table,$row);
633         #                               $t3lib_transl8tools = new t3lib_transl8tools;
634         #                               $theData[$fCol].=t3lib_div::view_array($t3lib_transl8tools->translationInfo($table,$row['uid']));
635                                 } elseif ($fCol=='_LOCALIZATION_') {
636                                         list($lC1, $lC2) = $this->makeLocalizationPanel($table,$row);
637                                         $theData[$fCol] = $lC1;
638                                         $theData[$fCol.'b'] = $lC2;
639                                 } elseif ($fCol=='_LOCALIZATION_b') {
640                                         // Do nothing, has been done above.
641                                 } else {
642                                         $theData[$fCol] = $this->linkUrlMail(htmlspecialchars(t3lib_BEfunc::getProcessedValueExtra($table,$fCol,$row[$fCol],100,$row['uid'])),$row[$fCol]);
643                                 }
644                         }
645
646                         if (strlen($this->searchString))        {       // Reset the ID if it was overwritten
647                                 $this->id = $id_orig;
648                         }
649
650                                 // Add row to CSV list:
651                         if ($this->csvOutput) $this->addToCSV($row,$table);
652
653                                 // Create element in table cells:
654                         $iOut.=$this->addelement(1,$theIcon,$theData,$row_bgColor);
655
656                                 // Render thumbsnails if a thumbnail column exists and there is content in it:
657                         if ($this->thumbs && trim($row[$thumbsCol]))    {
658                                 $iOut.=$this->addelement(4,'', Array($titleCol=>$this->thumbCode($row,$table,$thumbsCol)),$row_bgColor);
659                         }
660
661                                 // Finally, return table row element:
662                         return $iOut;
663                 }
664         }
665
666         /**
667          * Rendering the header row for a table
668          *
669          * @param       string          Table name
670          * @param       array           Array of the currectly displayed uids of the table
671          * @return      string          Header table row
672          * @access private
673          * @see getTable()
674          */
675         function renderListHeader($table,$currentIdList)        {
676                 global $TCA, $LANG;
677
678                         // Init:
679                 $theData = Array();
680
681                         // Traverse the fields:
682                 foreach($this->fieldArray as $fCol)     {
683
684                                 // Calculate users permissions to edit records in the table:
685                         $permsEdit = $this->calcPerms & ($table=='pages'?2:16);
686
687                         switch((string)$fCol)   {
688                                 case '_PATH_':                  // Path
689                                         $theData[$fCol] = '<i>['.$LANG->sL('LLL:EXT:lang/locallang_core.php:labels._PATH_',1).']</i>';
690                                 break;
691                                 case '_REF_':                   // References
692                                         $theData[$fCol] = '<i>['.$LANG->sL('LLL:EXT:lang/locallang_mod_file_list.xml:c__REF_',1).']</i>';
693                                 break;
694                                 case '_LOCALIZATION_':                  // Path
695                                         $theData[$fCol] = '<i>['.$LANG->sL('LLL:EXT:lang/locallang_core.php:labels._LOCALIZATION_',1).']</i>';
696                                 break;
697                                 case '_LOCALIZATION_b':                 // Path
698                                         $theData[$fCol] = $LANG->getLL('Localize',1);
699                                 break;
700                                 case '_CLIPBOARD_':             // Clipboard:
701                                         $cells=array();
702
703                                                 // If there are elements on the clipboard for this table, then display the "paste into" icon:
704                                         $elFromTable = $this->clipObj->elFromTable($table);
705                                         if (count($elFromTable))        {
706                                                 $cells[]='<a href="'.htmlspecialchars($this->clipObj->pasteUrl($table,$this->id)).'" onclick="'.htmlspecialchars('return '.$this->clipObj->confirmMsg('pages',$this->pageRow,'into',$elFromTable)).'">'.
707                                                                 '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/clip_pasteafter.gif','width="12" height="12"').' title="'.$LANG->getLL('clip_paste',1).'" alt="" />'.
708                                                                 '</a>';
709                                         }
710
711                                                 // If the numeric clipboard pads are enabled, display the control icons for that:
712                                         if ($this->clipObj->current!='normal')  {
713
714                                                         // The "select" link:
715                                                 $cells[]=$this->linkClipboardHeaderIcon('<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/clip_copy.gif','width="12" height="12"').' title="'.$LANG->getLL('clip_selectMarked',1).'" alt="" />',$table,'setCB');
716
717                                                         // The "edit marked" link:
718                                                 $editIdList = implode(',',$currentIdList);
719                                                 $editIdList = "'+editList('".$table."','".$editIdList."')+'";
720                                                 $params='&edit['.$table.']['.$editIdList.']=edit&disHelp=1';
721                                                 $cells[]='<a href="#" onclick="'.htmlspecialchars(t3lib_BEfunc::editOnClick($params,$this->backPath,-1)).'">'.
722                                                                 '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/edit2.gif','width="11" height="12"').' title="'.$LANG->getLL('clip_editMarked',1).'" alt="" />'.
723                                                                 '</a>';
724
725                                                         // The "Delete marked" link:
726                                                 $cells[]=$this->linkClipboardHeaderIcon('<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/garbage.gif','width="11" height="12"').' title="'.$LANG->getLL('clip_deleteMarked',1).'" alt="" />',$table,'delete',sprintf($LANG->getLL('clip_deleteMarkedWarning'),$LANG->sL($TCA[$table]['ctrl']['title'])));
727
728                                                         // The "Select all" link:
729                                                 $cells[]='<a href="#" onclick="'.htmlspecialchars('checkOffCB(\''.implode(',',$this->CBnames).'\'); return false;').'">'.
730                                                                 '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/clip_select.gif','width="12" height="12"').' title="'.$LANG->getLL('clip_markRecords',1).'" alt="" />'.
731                                                                 '</a>';
732                                         } else {
733                                                 $cells[]='';
734                                         }
735                                         $theData[$fCol]=implode('',$cells);
736                                 break;
737                                 case '_CONTROL_':               // Control panel:
738                                         if (!$TCA[$table]['ctrl']['readOnly'])  {
739
740                                                         // If new records can be created on this page, add links:
741                                                 if ($this->calcPerms&($table=='pages'?8:16) && $this->showNewRecLink($table))   {
742                                                         if ($table=="tt_content" && $this->newWizards)  {
743                                                                         //  If mod.web_list.newContentWiz.overrideWithExtension is set, use that extension's create new content wizard instead:
744                                                                 $tmpTSc = t3lib_BEfunc::getModTSconfig($this->pageinfo['uid'],'mod.web_list');
745                                                                 $tmpTSc = $tmpTSc ['properties']['newContentWiz.']['overrideWithExtension'];
746                                                                 $newContentWizScriptPath = $this->backPath.t3lib_extMgm::isLoaded($tmpTSc) ? (t3lib_extMgm::extRelPath($tmpTSc).'mod1/db_new_content_el.php') : 'sysext/cms/layout/db_new_content_el.php';
747
748                                                                 $theData[$fCol]='<a href="#" onclick="'.htmlspecialchars('return jumpExt(\''.$newContentWizScriptPath.'?id='.$this->id.'\');').'">'.
749                                                                                                 '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/new_'.($table=='pages'?'page':'el').'.gif','width="'.($table=='pages'?13:11).'" height="12"').' title="'.$LANG->getLL('new',1).'" alt="" />'.
750                                                                                                 '</a>';
751                                                         } elseif ($table=='pages' && $this->newWizards) {
752                                                                 $theData[$fCol]='<a href="'.htmlspecialchars($this->backPath.'db_new.php?id='.$this->id.'&pagesOnly=1&returnUrl='.rawurlencode(t3lib_div::getIndpEnv('REQUEST_URI'))).'">'.
753                                                                                                 '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/new_'.($table=='pages'?'page':'el').'.gif','width="'.($table=='pages'?13:11).'" height="12"').' title="'.$LANG->getLL('new',1).'" alt="" />'.
754                                                                                                 '</a>';
755                                                         } else {
756                                                                 $params='&edit['.$table.']['.$this->id.']=new';
757                                                                 $theData[$fCol]='<a href="#" onclick="'.htmlspecialchars(t3lib_BEfunc::editOnClick($params,$this->backPath,-1)).'">'.
758                                                                                                 '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/new_'.($table=='pages'?'page':'el').'.gif','width="'.($table=='pages'?13:11).'" height="12"').' title="'.$LANG->getLL('new',1).'" alt="" />'.
759                                                                                                 '</a>';
760                                                         }
761                                                 }
762
763                                                         // If the table can be edited, add link for editing ALL SHOWN fields for all listed records:
764                                                 if ($permsEdit && $this->table && is_array($currentIdList))     {
765                                                         $editIdList = implode(',',$currentIdList);
766                                                         if ($this->clipNumPane()) $editIdList = "'+editList('".$table."','".$editIdList."')+'";
767                                                         $params='&edit['.$table.']['.$editIdList.']=edit&columnsOnly='.implode(',',$this->fieldArray).'&disHelp=1';
768                                                         $theData[$fCol].='<a href="#" onclick="'.htmlspecialchars(t3lib_BEfunc::editOnClick($params,$this->backPath,-1)).'">'.
769                                                                                         '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/edit2.gif','width="11" height="12"').' title="'.$LANG->getLL('editShownColumns',1).'" alt="" />'.
770                                                                                         '</a>';
771                                                 }
772                                         }
773                                 break;
774                                 default:                        // Regular fields header:
775                                         $theData[$fCol]='';
776                                         if ($this->table && is_array($currentIdList))   {
777
778                                                         // If the numeric clipboard pads are selected, show duplicate sorting link:
779                                                 if ($this->clipNumPane()) {
780                                                         $theData[$fCol].='<a href="'.htmlspecialchars($this->listURL('',-1).'&duplicateField='.$fCol).'">'.
781                                                                                         '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/select_duplicates.gif','width="11" height="11"').' title="'.$LANG->getLL('clip_duplicates',1).'" alt="" />'.
782                                                                                         '</a>';
783                                                 }
784
785                                                         // If the table can be edited, add link for editing THIS field for all listed records:
786                                                 if (!$TCA[$table]['ctrl']['readOnly'] && $permsEdit && $TCA[$table]['columns'][$fCol])  {
787                                                         $editIdList = implode(',',$currentIdList);
788                                                         if ($this->clipNumPane()) $editIdList = "'+editList('".$table."','".$editIdList."')+'";
789                                                         $params='&edit['.$table.']['.$editIdList.']=edit&columnsOnly='.$fCol.'&disHelp=1';
790                                                         $iTitle = sprintf($LANG->getLL('editThisColumn'),ereg_replace(':$','',trim($LANG->sL(t3lib_BEfunc::getItemLabel($table,$fCol)))));
791                                                         $theData[$fCol].='<a href="#" onclick="'.htmlspecialchars(t3lib_BEfunc::editOnClick($params,$this->backPath,-1)).'">'.
792                                                                                         '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/edit2.gif','width="11" height="12"').' title="'.htmlspecialchars($iTitle).'" alt="" />'.
793                                                                                         '</a>';
794                                                 }
795                                         }
796                                         $theData[$fCol].=$this->addSortLink($LANG->sL(t3lib_BEfunc::getItemLabel($table,$fCol,'<i>[|]</i>')),$fCol,$table);
797                                 break;
798                         }
799                 }
800
801                         // Create and return header table row:
802                 return $this->addelement(1,'',$theData,' class="c-headLine"','');
803         }
804
805
806
807
808
809
810         /*********************************
811          *
812          * Rendering of various elements
813          *
814          *********************************/
815
816         /**
817          * Creates the control panel for a single record in the listing.
818          *
819          * @param       string          The table
820          * @param       array           The record for which to make the control panel.
821          * @return      string          HTML table with the control panel (unless disabled)
822          */
823         function makeControl($table,$row)       {
824                 global $TCA, $LANG, $SOBE;
825                 if ($this->dontShowClipControlPanels)   return '';
826
827                         // Initialize:
828                 t3lib_div::loadTCA($table);
829                 $cells=array();
830
831                         // If the listed table is 'pages' we have to request the permission settings for each page:
832                 if ($table=='pages')    {
833                         $localCalcPerms = $GLOBALS['BE_USER']->calcPerms(t3lib_BEfunc::getRecord('pages',$row['uid']));
834                 }
835
836                         // This expresses the edit permissions for this particular element:
837                 $permsEdit = ($table=='pages' && ($localCalcPerms&2)) || ($table!='pages' && ($this->calcPerms&16));
838
839                         // "Show" link (only pages and tt_content elements)
840                 if ($table=='pages' || $table=='tt_content')    {
841                         $params='&edit['.$table.']['.$row['uid'].']=edit';
842                         $cells[]='<a href="#" onclick="'.htmlspecialchars(t3lib_BEfunc::viewOnClick($table=='tt_content'?$this->id.'#'.$row['uid']:$row['uid'], $this->backPath)).'">'.
843                                         '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/zoom.gif','width="12" height="12"').' title="'.$LANG->sL('LLL:EXT:lang/locallang_core.php:labels.showPage',1).'" alt="" />'.
844                                         '</a>';
845                 }
846
847                         // "Edit" link: ( Only if permissions to edit the page-record of the content of the parent page ($this->id)
848                 if ($permsEdit) {
849                         $params='&edit['.$table.']['.$row['uid'].']=edit';
850                         $cells[]='<a href="#" onclick="'.htmlspecialchars(t3lib_BEfunc::editOnClick($params,$this->backPath,-1)).'">'.
851                                         '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/edit2'.(!$TCA[$table]['ctrl']['readOnly']?'':'_d').'.gif','width="11" height="12"').' title="'.$LANG->getLL('edit',1).'" alt="" />'.
852                                         '</a>';
853                 }
854
855                         // "Move" wizard link for pages/tt_content elements:
856                 if (($table=="tt_content" && $permsEdit) || ($table=='pages'))  {
857                         $cells[]='<a href="#" onclick="'.htmlspecialchars('return jumpExt(\''.$this->backPath.'move_el.php?table='.$table.'&uid='.$row['uid'].'\');').'">'.
858                                         '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/move_'.($table=='tt_content'?'record':'page').'.gif','width="11" height="12"').' title="'.$LANG->getLL('move_'.($table=='tt_content'?'record':'page'),1).'" alt="" />'.
859                                         '</a>';
860                 }
861
862                         // If the extended control panel is enabled OR if we are seeing a single table:
863                 if ($SOBE->MOD_SETTINGS['bigControlPanel'] || $this->table)     {
864
865                                 // "Info": (All records)
866                         $cells[]='<a href="#" onclick="'.htmlspecialchars('top.launchView(\''.$table.'\', \''.$row['uid'].'\'); return false;').'">'.
867                                         '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/zoom2.gif','width="12" height="12"').' title="'.$LANG->getLL('showInfo',1).'" alt="" />'.
868                                         '</a>';
869
870                                 // If the table is NOT a read-only table, then show these links:
871                         if (!$TCA[$table]['ctrl']['readOnly'])  {
872
873                                         // "Revert" link (history/undo)
874                                 $cells[]='<a href="#" onclick="'.htmlspecialchars('return jumpExt(\''.$this->backPath.'show_rechis.php?element='.rawurlencode($table.':'.$row['uid']).'\',\'#latest\');').'">'.
875                                                 '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/history2.gif','width="13" height="12"').' title="'.$LANG->getLL('history',1).'" alt="" />'.
876                                                 '</a>';
877
878                                         // Versioning:
879                                 if (t3lib_extMgm::isLoaded('version'))  {
880                                         $vers = t3lib_BEfunc::selectVersionsOfRecord($table, $row['uid'], 'uid', $GLOBALS['BE_USER']->workspace);
881                                         if (is_array($vers))    {       // If table can be versionized.
882                                                 if (count($vers)>1)     {
883                                                         $st = 'background-color: #FFFF00; font-weight: bold;';
884                                                         $lab = count($vers)-1;
885                                                 } else {
886                                                         $st = 'background-color: #9999cc; font-weight: bold;';
887                                                         $lab = 'V';
888                                                 }
889
890                                                 $cells[]='<a href="'.htmlspecialchars($this->backPath.t3lib_extMgm::extRelPath('version')).'cm1/index.php?table='.rawurlencode($table).'&uid='.rawurlencode($row['uid']).'" title="'.$LANG->getLL('displayVersions',1).'" style="'.htmlspecialchars($st).'">'.
891                                                                 $lab.
892                                                                 '</a>';
893                                         }
894                                 }
895
896                                         // "Edit Perms" link:
897                                 if ($table=='pages' && $GLOBALS['BE_USER']->check('modules','web_perm'))        {
898                                         $cells[]='<a href="'.htmlspecialchars('mod/web/perm/index.php?id='.$row['uid'].'&return_id='.$row['uid'].'&edit=1').'">'.
899                                                         '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/perm.gif','width="7" height="12"').' title="'.$LANG->getLL('permissions',1).'" alt="" />'.
900                                                         '</a>';
901                                 }
902
903                                         // "New record after" link (ONLY if the records in the table are sorted by a "sortby"-row or if default values can depend on previous record):
904                                 if ($TCA[$table]['ctrl']['sortby'] || $TCA[$table]['ctrl']['useColumnsForDefaultValues'])       {
905                                         if (
906                                                 ($table!='pages' && ($this->calcPerms&16)) ||   // For NON-pages, must have permission to edit content on this parent page
907                                                 ($table=='pages' && ($this->calcPerms&8))               // For pages, must have permission to create new pages here.
908                                                 )       {
909                                                 if ($this->showNewRecLink($table))      {
910                                                         $params='&edit['.$table.']['.(-($row['_MOVE_PLH']?$row['_MOVE_PLH_uid']:$row['uid'])).']=new';
911                                                         $cells[]='<a href="#" onclick="'.htmlspecialchars(t3lib_BEfunc::editOnClick($params,$this->backPath,-1)).'">'.
912                                                                         '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/new_'.($table=='pages'?'page':'el').'.gif','width="'.($table=='pages'?13:11).'" height="12"').' title="'.$LANG->getLL('new'.($table=='pages'?'Page':'Record'),1).'" alt="" />'.
913                                                                         '</a>';
914                                                 }
915                                         }
916                                 }
917
918                                         // "Up/Down" links
919                                 if ($permsEdit && $TCA[$table]['ctrl']['sortby']  && !$this->sortField && !$this->searchLevels) {
920                                         if (isset($this->currentTable['prev'][$row['uid']]))    {       // Up
921                                                 $params='&cmd['.$table.']['.$row['uid'].'][move]='.$this->currentTable['prev'][$row['uid']];
922                                                 $cells[]='<a href="#" onclick="'.htmlspecialchars('return jumpToUrl(\''.$SOBE->doc->issueCommand($params,-1).'\');').'">'.
923                                                                 '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/button_up.gif','width="11" height="10"').' title="'.$LANG->getLL('moveUp',1).'" alt="" />'.
924                                                                 '</a>';
925                                         } else {
926                                                 $cells[]='<img src="clear.gif" '.t3lib_iconWorks::skinImg($this->backPath,'gfx/button_up.gif','width="11" height="10"',2).' alt="" />';
927                                         }
928                                         if ($this->currentTable['next'][$row['uid']])   {       // Down
929                                                 $params='&cmd['.$table.']['.$row['uid'].'][move]='.$this->currentTable['next'][$row['uid']];
930                                                 $cells[]='<a href="#" onclick="'.htmlspecialchars('return jumpToUrl(\''.$SOBE->doc->issueCommand($params,-1).'\');').'">'.
931                                                                 '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/button_down.gif','width="11" height="10"').' title="'.$LANG->getLL('moveDown',1).'" alt="" />'.
932                                                                 '</a>';
933                                         } else {
934                                                 $cells[]='<img src="clear.gif" '.t3lib_iconWorks::skinImg($this->backPath,'gfx/button_down.gif','width="11" height="10"',2).' alt="" />';
935                                         }
936                                 }
937
938                                         // "Hide/Unhide" links:
939                                 $hiddenField = $TCA[$table]['ctrl']['enablecolumns']['disabled'];
940                                 if ($permsEdit && $hiddenField && $TCA[$table]['columns'][$hiddenField] && (!$TCA[$table]['columns'][$hiddenField]['exclude'] || $GLOBALS['BE_USER']->check('non_exclude_fields',$table.':'.$hiddenField)))     {
941                                         if ($row[$hiddenField]) {
942                                                 $params='&data['.$table.']['.$row['uid'].']['.$hiddenField.']=0';
943                                                 $cells[]='<a href="#" onclick="'.htmlspecialchars('return jumpToUrl(\''.$SOBE->doc->issueCommand($params,-1).'\');').'">'.
944                                                                 '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/button_unhide.gif','width="11" height="10"').' title="'.$LANG->getLL('unHide'.($table=='pages'?'Page':''),1).'" alt="" />'.
945                                                                 '</a>';
946                                         } else {
947                                                 $params='&data['.$table.']['.$row['uid'].']['.$hiddenField.']=1';
948                                                 $cells[]='<a href="#" onclick="'.htmlspecialchars('return jumpToUrl(\''.$SOBE->doc->issueCommand($params,-1).'\');').'">'.
949                                                                 '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/button_hide.gif','width="11" height="10"').' title="'.$LANG->getLL('hide'.($table=='pages'?'Page':''),1).'" alt="" />'.
950                                                                 '</a>';
951                                         }
952                                 }
953
954                                         // "Delete" link:
955                                 if (
956                                         ($table=='pages' && ($localCalcPerms&4)) || ($table!='pages' && ($this->calcPerms&16))
957                                         )       {
958                                         $params='&cmd['.$table.']['.$row['uid'].'][delete]=1';
959                                         $cells[]='<a href="#" onclick="'.htmlspecialchars('if (confirm('.$LANG->JScharCode($LANG->getLL('deleteWarning').t3lib_BEfunc::referenceCount($table,$row['uid'],' (There are %s reference(s) to this record!)')).')) {jumpToUrl(\''.$SOBE->doc->issueCommand($params,-1).'\');} return false;').'">'.
960                                                         '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/garbage.gif','width="11" height="12"').' title="'.$LANG->getLL('delete',1).'" alt="" />'.
961                                                         '</a>';
962                                 }
963
964                                         // "Levels" links: Moving pages into new levels...
965                                 if ($permsEdit && $table=='pages' && !$this->searchLevels)      {
966
967                                                 // Up (Paste as the page right after the current parent page)
968                                         if ($this->calcPerms&8) {
969                                                 $params='&cmd['.$table.']['.$row['uid'].'][move]='.-$this->id;
970                                                 $cells[]='<a href="#" onclick="'.htmlspecialchars('return jumpToUrl(\''.$SOBE->doc->issueCommand($params,-1).'\');').'">'.
971                                                                 '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/button_left.gif','width="11" height="10"').' title="'.$LANG->getLL('prevLevel',1).'" alt="" />'.
972                                                                 '</a>';
973                                         }
974                                                 // Down (Paste as subpage to the page right above)
975                                         if ($this->currentTable['prevUid'][$row['uid']])        {
976                                                 $localCalcPerms = $GLOBALS['BE_USER']->calcPerms(t3lib_BEfunc::getRecord('pages',$this->currentTable['prevUid'][$row['uid']]));
977                                                 if ($localCalcPerms&8)  {
978                                                         $params='&cmd['.$table.']['.$row['uid'].'][move]='.$this->currentTable['prevUid'][$row['uid']];
979                                                         $cells[]='<a href="#" onclick="'.htmlspecialchars('return jumpToUrl(\''.$SOBE->doc->issueCommand($params,-1).'\');').'">'.
980                                                                         '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/button_right.gif','width="11" height="10"').' title="'.$LANG->getLL('nextLevel',1).'" alt="" />'.
981                                                                         '</a>';
982                                                 } else {
983                                                         $cells[]='<img src="clear.gif" '.t3lib_iconWorks::skinImg($this->backPath,'gfx/button_right.gif','width="11" height="10"',2).' alt="" />';
984                                                 }
985                                         } else {
986                                                 $cells[]='<img src="clear.gif" '.t3lib_iconWorks::skinImg($this->backPath,'gfx/button_right.gif','width="11" height="10"',2).' alt="" />';
987                                         }
988                                 }
989                         }
990                 }
991
992                         // If the record is edit-locked by another user, we will show a little warning sign:
993                 if ($lockInfo=t3lib_BEfunc::isRecordLocked($table,$row['uid'])) {
994                         $cells[] = '<a href="#" onclick="'.htmlspecialchars('alert('.$LANG->JScharCode($lockInfo['msg']).');return false;').'">'.
995                                         '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/recordlock_warning3.gif','width="17" height="12"').' title="'.htmlspecialchars($lockInfo['msg']).'" alt="" />'.
996                                         '</a>';
997                 }
998
999                         // Call stats information hook
1000                 if (is_array($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['GLOBAL']['recStatInfoHooks']))  {
1001                         $stat='';
1002                         $_params = array($table,$row['uid']);
1003                         foreach ($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['GLOBAL']['recStatInfoHooks'] as $_funcRef)  {
1004                                 $stat.=t3lib_div::callUserFunction($_funcRef,$_params,$this);
1005                         }
1006                         $cells[] = $stat;
1007                 }
1008
1009                         // Compile items into a DIV-element:
1010                 return '
1011                                                                                         <!-- CONTROL PANEL: '.$table.':'.$row['uid'].' -->
1012                                                                                         <div class="typo3-DBctrl">'.implode('',$cells).'</div>';
1013         }
1014
1015         /**
1016          * Creates the clipboard panel for a single record in the listing.
1017          *
1018          * @param       string          The table
1019          * @param       array           The record for which to make the clipboard panel.
1020          * @return      string          HTML table with the clipboard panel (unless disabled)
1021          */
1022         function makeClip($table,$row)  {
1023                 global $TCA, $LANG;
1024
1025                         // Return blank, if disabled:
1026                 if ($this->dontShowClipControlPanels)   return '';
1027                 $cells=array();
1028
1029
1030                         // Return blank, if disabled:
1031                         // Whether a numeric clipboard pad is active or the normal pad we will see different content of the panel:
1032                 if ($this->clipObj->current=='normal')  {       // For the "Normal" pad:
1033
1034                                 // Show copy/cut icons:
1035                         $isSel = (string)$this->clipObj->isSelected($table,$row['uid']);
1036                         $cells[]='<a href="#" onclick="'.htmlspecialchars('return jumpSelf(\''.$this->clipObj->selUrlDB($table,$row['uid'],1,($isSel=='copy'),array('returnUrl'=>'')).'\');').'">'.
1037                                         '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/clip_copy'.($isSel=='copy'?'_h':'').'.gif','width="12" height="12"').' title="'.$LANG->sL('LLL:EXT:lang/locallang_core.php:cm.copy',1).'" alt="" />'.
1038                                         '</a>';
1039                         $cells[]='<a href="#" onclick="'.htmlspecialchars('return jumpSelf(\''.$this->clipObj->selUrlDB($table,$row['uid'],0,($isSel=='cut'),array('returnUrl'=>'')).'\');').'">'.
1040                                         '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/clip_cut'.($isSel=='cut'?'_h':'').'.gif','width="12" height="12"').' title="'.$LANG->sL('LLL:EXT:lang/locallang_core.php:cm.cut',1).'" alt="" />'.
1041                                         '</a>';
1042
1043                 } else {        // For the numeric clipboard pads (showing checkboxes where one can select elements on/off)
1044
1045                                 // Setting name of the element in ->CBnames array:
1046                         $n=$table.'|'.$row['uid'];
1047                         $this->CBnames[]=$n;
1048
1049                                 // Check if the current element is selected and if so, prepare to set the checkbox as selected:
1050                         $checked = ($this->clipObj->isSelected($table,$row['uid'])?' checked="checked"':'');
1051
1052                                 // If the "duplicateField" value is set then select all elements which are duplicates...
1053                         if ($this->duplicateField && isset($row[$this->duplicateField]))        {
1054                                 $checked='';
1055                                 if (in_array($row[$this->duplicateField], $this->duplicateStack))       {
1056                                         $checked=' checked="checked"';
1057                                 }
1058                                 $this->duplicateStack[] = $row[$this->duplicateField];
1059                         }
1060
1061                                 // Adding the checkbox to the panel:
1062                         $cells[]='<input type="hidden" name="CBH['.$n.']" value="0" /><input type="checkbox" name="CBC['.$n.']" value="1" class="smallCheckboxes"'.$checked.' />';
1063                 }
1064
1065                         // Now, looking for selected elements from the current table:
1066                 $elFromTable = $this->clipObj->elFromTable($table);
1067                 if (count($elFromTable) && $TCA[$table]['ctrl']['sortby'])      {       // IF elements are found and they can be individually ordered, then add a "paste after" icon:
1068                         $cells[]='<a href="'.htmlspecialchars($this->clipObj->pasteUrl($table,-$row['uid'])).'" onclick="'.htmlspecialchars('return '.$this->clipObj->confirmMsg($table,$row,'after',$elFromTable)).'">'.
1069                                         '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/clip_pasteafter.gif','width="12" height="12"').' title="'.$LANG->getLL('clip_pasteAfter',1).'" alt="" />'.
1070                                         '</a>';
1071                 }
1072
1073                         // Now, looking for elements in general:
1074                 $elFromTable = $this->clipObj->elFromTable('');
1075                 if ($table=='pages' && count($elFromTable))     {
1076                         $cells[]='<a href="'.htmlspecialchars($this->clipObj->pasteUrl('',$row['uid'])).'" onclick="'.htmlspecialchars('return '.$this->clipObj->confirmMsg($table,$row,'into',$elFromTable)).'">'.
1077                                         '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/clip_pasteinto.gif','width="12" height="12"').' title="'.$LANG->getLL('clip_pasteInto',1).'" alt="" />'.
1078                                         '</a>';
1079                 }
1080
1081                         // Compile items into a DIV-element:
1082                 return '                                                        <!-- CLIPBOARD PANEL: '.$table.':'.$row['uid'].' -->
1083                                                                                         <div class="typo3-clipCtrl">'.implode('',$cells).'</div>';
1084         }
1085
1086         /**
1087          * Make reference count
1088          *
1089          * @param       string          Table name
1090          * @param       integer         UID of record
1091          * @return      string          HTML-table
1092          */
1093         function makeRef($table,$uid)   {
1094
1095                         // Look up the path:
1096                 $rows = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows(
1097                         '*',
1098                         'sys_refindex',
1099                         'ref_table='.$GLOBALS['TYPO3_DB']->fullQuoteStr($table,'sys_refindex').
1100                                 ' AND ref_uid='.intval($uid).
1101                                 ' AND deleted=0'
1102                 );
1103
1104                         // Compile information for title tag:
1105                 $infoData=array();
1106                 if (is_array($rows)) {
1107                         foreach($rows as $row)  {
1108                                 $infoData[]=$row['tablename'].':'.$row['recuid'].':'.$row['field'];
1109                         }
1110                 }
1111
1112                 return count($infoData) ? '<a href="#" onclick="'.htmlspecialchars('top.launchView(\''.$table.'\', \''.$uid.'\'); return false;').'" title="'.htmlspecialchars(t3lib_div::fixed_lgd(implode(' / ',$infoData),100)).'">'.count($infoData).'</a>' : '';
1113         }
1114
1115         /**
1116          * Creates the localization panel
1117          *
1118          * @param       string          The table
1119          * @param       array           The record for which to make the localization panel.
1120          * @return      array           Array with key 0/1 with content for column 1 and 2
1121          */
1122         function makeLocalizationPanel($table,$row)     {
1123                 global $TCA,$LANG;
1124
1125                 $out = array(
1126                         0 => '',
1127                         1 => '',
1128                 );
1129
1130                 $t8Tools = t3lib_div::makeInstance('t3lib_transl8tools');
1131                 $translations = $t8Tools->translationInfo($table,$row['uid']);
1132
1133                         // Language title and icon:
1134                 $out[0] = $this->languageFlag($row[$TCA[$table]['ctrl']['languageField']]);
1135
1136                 if (is_array($translations))    {
1137
1138                                 // Traverse page translations and add icon for each language that does NOT yet exist:
1139                         $lNew = '';
1140                         foreach($this->pageOverlays as $lUid_OnPage => $lsysRec)        {
1141                                 if (!isset($translations['translations'][$lUid_OnPage]) && $GLOBALS['BE_USER']->checkLanguageAccess($lUid_OnPage))      {
1142                                         $href = $GLOBALS['TBE_TEMPLATE']->issueCommand(
1143                                                 '&cmd['.$table.']['.$row['uid'].'][localize]='.$lUid_OnPage,
1144                                                 $this->listURL().'&justLocalized='.rawurlencode($table.':'.$row['uid'].':'.$lUid_OnPage)
1145                                         );
1146
1147                                         $lC = ($this->languageIconTitles[$lUid_OnPage]['flagIcon'] ? '<img src="'.$this->languageIconTitles[$lUid_OnPage]['flagIcon'].'" class="absmiddle" alt="" />' : $this->languageIconTitles[$lUid_OnPage]['title']);
1148                                         $lC = '<a href="'.htmlspecialchars($href).'">'.$lC.'</a> ';
1149
1150                                         $lNew.=$lC;
1151                                 }
1152                         }
1153
1154                         if ($lNew)      $out[1].= $lNew;
1155                 } else {
1156                         $out[0] = '&nbsp;&nbsp;&nbsp;&nbsp;'.$out[0];
1157                 }
1158
1159
1160                 return $out;
1161         }
1162
1163         /**
1164          * Create the selector box for selecting fields to display from a table:
1165          *
1166          * @param       string          Table name
1167          * @param       boolean         If true, form-fields will be wrapped around the table.
1168          * @return      string          HTML table with the selector box (name: displayFields['.$table.'][])
1169          */
1170         function fieldSelectBox($table,$formFields=1)   {
1171                 global $TCA, $LANG;
1172
1173                         // Init:
1174                 t3lib_div::loadTCA($table);
1175                 $formElements=array('','');
1176                 if ($formFields)        {
1177                         $formElements=array('<form action="'.htmlspecialchars($this->listURL()).'" method="post">','</form>');
1178                 }
1179
1180                         // Load already selected fields, if any:
1181                 $setFields=is_array($this->setFields[$table]) ? $this->setFields[$table] : array();
1182
1183                         // Request fields from table:
1184                 $fields = $this->makeFieldList($table);
1185
1186                         // Add pseudo "control" fields
1187                 $fields[]='tstamp';
1188                 $fields[]='crdate';
1189                 $fields[]='_PATH_';
1190                 $fields[]='_REF_';
1191                 $fields[]='_LOCALIZATION_';
1192                 $fields[]='_CONTROL_';
1193                 $fields[]='_CLIPBOARD_';
1194
1195                         // Create an option for each field:
1196                 $opt=array();
1197                 $opt[] = '<option value=""></option>';
1198                 foreach($fields as $fN) {
1199                         $fL = is_array($TCA[$table]['columns'][$fN]) ? ereg_replace(':$','',$LANG->sL($TCA[$table]['columns'][$fN]['label'])) : '['.$fN.']';    // Field label
1200                         $opt[] = '
1201                                                                                         <option value="'.$fN.'"'.(in_array($fN,$setFields)?' selected="selected"':'').'>'.htmlspecialchars($fL).'</option>';
1202                 }
1203
1204                         // Compile the options into a multiple selector box:
1205                 $lMenu = '
1206                                                                                 <select size="'.t3lib_div::intInRange(count($fields)+1,3,20).'" multiple="multiple" name="displayFields['.$table.'][]">'.implode('',$opt).'
1207                                                                                 </select>
1208                                 ';
1209
1210                         // Table with the field selector::
1211                 $content.= '
1212                         '.$formElements[0].'
1213
1214                                 <!--
1215                                         Field selector for extended table view:
1216                                 -->
1217                                 <table border="0" cellpadding="0" cellspacing="0" class="bgColor4" id="typo3-dblist-fieldSelect">
1218                                         <tr>
1219                                                 <td>'.$lMenu.'</td>
1220                                                 <td><input type="submit" name="search" value="'.$LANG->sL('LLL:EXT:lang/locallang_core.php:labels.setFields',1).'" /></td>
1221                                         </tr>
1222                                 </table>
1223                         '.$formElements[1];
1224                 return $content;
1225         }
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237         /*********************************
1238          *
1239          * Helper functions
1240          *
1241          *********************************/
1242
1243         /**
1244          * Creates a link around $string. The link contains an onclick action which submits the script with some clipboard action.
1245          * Currently, this is used for setting elements / delete elements.
1246          *
1247          * @param       string          The HTML content to link (image/text)
1248          * @param       string          Table name
1249          * @param       string          Clipboard command (eg. "setCB" or "delete")
1250          * @param       string          Warning text, if any ("delete" uses this for confirmation)
1251          * @return      string          <a> tag wrapped link.
1252          */
1253         function linkClipboardHeaderIcon($string,$table,$cmd,$warning='')       {
1254                 $onClickEvent = 'document.dblistForm.cmd.value=\''.$cmd.'\';document.dblistForm.cmd_table.value=\''.$table.'\';document.dblistForm.submit();';
1255                 if ($warning)   $onClickEvent = 'if (confirm('.$GLOBALS['LANG']->JScharCode($warning).')){'.$onClickEvent.'}';
1256                 return '<a href="#" onclick="'.htmlspecialchars($onClickEvent.'return false;').'">'.$string.'</a>';
1257         }
1258
1259         /**
1260          * Returns true if a numeric clipboard pad is selected/active
1261          *
1262          * @return      boolean
1263          */
1264         function clipNumPane()  {
1265                 return in_Array('_CLIPBOARD_',$this->fieldArray) && $this->clipObj->current!='normal';
1266         }
1267
1268         /**
1269          * Creates a sort-by link on the input string ($code).
1270          * It will automatically detect if sorting should be ascending or descending depending on $this->sortRev.
1271          * Also some fields will not be possible to sort (including if single-table-view is disabled).
1272          *
1273          * @param       string          The string to link (text)
1274          * @param       string          The fieldname represented by the title ($code)
1275          * @param       string          Table name
1276          * @return      string          Linked $code variable
1277          */
1278         function addSortLink($code,$field,$table)       {
1279
1280                         // Certain circumstances just return string right away (no links):
1281                 if ($field=='_CONTROL_' || $field=='_LOCALIZATION_' || $field=='_CLIPBOARD_' || $field=='_REF_' || $this->disableSingleTableView)       return $code;
1282
1283                         // If "_PATH_" (showing record path) is selected, force sorting by pid field (will at least group the records!)
1284                 if ($field=='_PATH_')   $field=pid;
1285
1286                         //       Create the sort link:
1287                 $sortUrl = $this->listURL('',-1,'sortField,sortRev,table').'&table='.$table.'&sortField='.$field.'&sortRev='.($this->sortRev || ($this->sortField!=$field)?0:1);
1288                 $sortArrow = ($this->sortField==$field?'<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/red'.($this->sortRev?'up':'down').'.gif','width="7" height="4"').' alt="" />':'');
1289
1290                         // Return linked field:
1291                 return '<a href="'.htmlspecialchars($sortUrl).'">'.$code.
1292                                 $sortArrow.
1293                                 '</a>';
1294         }
1295
1296         /**
1297          * Returns the path for a certain pid
1298          * The result is cached internally for the session, thus you can call this function as much as you like without performance problems.
1299          *
1300          * @param       integer         The page id for which to get the path
1301          * @return      string          The path.
1302          */
1303         function recPath($pid)  {
1304                 if (!isset($this->recPath_cache[$pid])) {
1305                         $this->recPath_cache[$pid] = t3lib_BEfunc::getRecordPath($pid,$this->perms_clause,20);
1306                 }
1307                 return $this->recPath_cache[$pid];
1308         }
1309
1310         /**
1311          * Returns true if a link for creating new records should be displayed for $table
1312          *
1313          * @param       string          Table name
1314          * @return      boolean
1315          */
1316         function showNewRecLink($table) {
1317                 return !count($this->allowedNewTables) || in_array($table,$this->allowedNewTables);
1318         }
1319
1320         /**
1321          * Creates the "&returnUrl" parameter for links - this is used when the script links to other scripts and passes its own URL with the link so other scripts can return to the listing again.
1322          * Uses REQUEST_URI as value.
1323          *
1324          * @return      string
1325          */
1326         function makeReturnUrl()        {
1327                 return '&returnUrl='.rawurlencode(t3lib_div::getIndpEnv('REQUEST_URI'));
1328         }
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340         /************************************
1341          *
1342          * CSV related functions
1343          *
1344          ************************************/
1345
1346         /**
1347          * Initializes internal csvLines array with the header of field names
1348          *
1349          * @return      void
1350          */
1351         function initCSV()      {
1352
1353                         // Reset:
1354                 $this->csvLines=array();
1355
1356                         // Getting header line with field names:
1357                 $csvRow=array();
1358                 foreach($this->fieldArray as $fN)       {
1359                         $csvRow[]=$fN;
1360                 }
1361
1362                         // Set the header + an empty row:
1363                 $this->setCsvRow($csvRow);
1364                 $this->csvLines[]='';
1365         }
1366
1367         /**
1368          * Adds the content of input array $row to the CSV list:
1369          *
1370          * @param       array           Record array, from which the values of fields found in $this->fieldArray will be listed in the CSV output.
1371          * @param       string          Table name
1372          * @return      void
1373          */
1374         function addToCSV($row,$table)  {
1375
1376                         // Traversing fields, adding values from $row:
1377                 $csvRow=array();
1378                 foreach($this->fieldArray as $fN)       {
1379                         if ($fN=='_PATH_')      {
1380                                 $csvRow[]=$this->recPath($row['pid']);
1381                         } elseif ($fN=='_REF_') {
1382                                 $csvRow[]=$this->makeRef($table, $row['uid']);
1383                         } else {
1384                                 $csvRow[]=$row[$fN];
1385                         }
1386                 }
1387
1388                         // Set the values in the CSV list
1389                 $this->setCsvRow($csvRow);
1390         }
1391
1392         /**
1393          * Adds input row of values to the internal csvLines array as a CSV formatted line
1394          *
1395          * @param       array           Array with values to be listed.
1396          * @return      void
1397          */
1398         function setCsvRow($csvRow)     {
1399                 $this->csvLines[] = t3lib_div::csvValues($csvRow);
1400         }
1401
1402         /**
1403          * Compiles the internal csvLines array to a csv-string and outputs it to the browser.
1404          * This function exits!
1405          *
1406          * @param       string          Filename prefix:
1407          * @return      void            EXITS php execusion!
1408          */
1409         function outputCSV($prefix)     {
1410
1411                         // Setting filename:
1412                 $filename=$prefix.'_'.date('dmy-Hi').'.csv';
1413
1414                         // Creating output header:
1415                 $mimeType = 'application/octet-stream';
1416                 Header('Content-Type: '.$mimeType);
1417                 Header('Content-Disposition: attachment; filename='.$filename);
1418
1419                         // Printing the content of the CSV lines:
1420                 echo implode(chr(13).chr(10),$this->csvLines);
1421
1422                         // Exits:
1423                 exit;
1424         }
1425 }
1426
1427
1428
1429 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['typo3/class.db_list_extra.inc'])   {
1430         include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['typo3/class.db_list_extra.inc']);
1431 }
1432 ?>