Added hooks #6738: Hooks for Web>List module which allow modification/addition/remova...
[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                 /**
392                  * @hook                        DB-List getTable
393                  * @date                        2007-11-16
394                  * @request             Malte Jansen  <mail@maltejansen.de>
395                  */
396                 if(is_array($TYPO3_CONF_VARS['SC_OPTIONS']['typo3/class.db_list_extra.inc']['getTable'])) {
397                         foreach($TYPO3_CONF_VARS['SC_OPTIONS']['typo3/class.db_list_extra.inc']['getTable'] as $classData) {
398                                 $hookObject = &t3lib_div::getUserObj($classData);
399
400                                 if(!($hookObject instanceof t3lib_localRecordListGetTableHook)) {
401                                         throw new UnexpectedValueException('$hookObject must implement interface t3lib_localRecordListGetTableHook', 1195114460);
402                                 }
403
404                                 $hookObject->getDBlistQuery($table, $id, $addWhere, $selFieldList, $this);
405                         }
406                 }
407
408                         // Create the SQL query for selecting the elements in the listing:
409                 $queryParts = $this->makeQueryArray($table, $id,$addWhere,$selFieldList);       // (API function from class.db_list.inc)
410                 $this->setTotalItems($queryParts);              // Finding the total amount of records on the page (API function from class.db_list.inc)
411
412                         // Init:
413                 $dbCount = 0;
414                 $out = '';
415
416                         // If the count query returned any number of records, we perform the real query, selecting records.
417                 if ($this->totalItems)  {
418                         $result = $GLOBALS['TYPO3_DB']->exec_SELECT_queryArray($queryParts);
419                         $dbCount = $GLOBALS['TYPO3_DB']->sql_num_rows($result);
420                 }
421
422                 $LOISmode = $this->listOnlyInSingleTableMode && !$this->table;
423
424                         // If any records was selected, render the list:
425                 if ($dbCount)   {
426
427                                 // Half line is drawn between tables:
428                         if (!$LOISmode) {
429                                 $theData = Array();
430                                 if (!$this->table && !$rowlist) {
431                                         $theData[$titleCol] = '<img src="clear.gif" width="'.($GLOBALS['SOBE']->MOD_SETTINGS['bigControlPanel']?'230':'350').'" height="1" alt="" />';
432                                         if (in_array('_CONTROL_',$this->fieldArray))    $theData['_CONTROL_']='';
433                                         if (in_array('_CLIPBOARD_',$this->fieldArray))  $theData['_CLIPBOARD_']='';
434                                 }
435                                 $out.=$this->addelement(0,'',$theData,'class="c-table-row-spacer"',$this->leftMargin);
436                         }
437
438                                 // Header line is drawn
439                         $theData = Array();
440                         if ($this->disableSingleTableView)      {
441                                 $theData[$titleCol] = '<span class="c-table">'.$GLOBALS['LANG']->sL($TCA[$table]['ctrl']['title'],1).'</span> ('.$this->totalItems.')';
442                         } else {
443                                 $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="" />');
444                         }
445
446                                 // CSH:
447                         $theData[$titleCol].= t3lib_BEfunc::cshItem($table,'',$this->backPath,'',FALSE,'margin-bottom:0px; white-space: normal;');
448
449                         if ($LOISmode)  {
450                                 $out.='
451                                         <tr>
452                                                 <td class="c-headLineTable" style="width:95%;">'.$theData[$titleCol].'</td>
453                                         </tr>';
454
455                                 if ($GLOBALS['BE_USER']->uc["edit_showFieldHelp"])      {
456                                         $GLOBALS['LANG']->loadSingleTableDescription($table);
457                                         if (isset($GLOBALS['TCA_DESCR'][$table]['columns']['']))        {
458                                                 $onClick = 'vHWin=window.open(\'view_help.php?tfID='.$table.'.\',\'viewFieldHelp\',\'height=400,width=600,status=0,menubar=0,scrollbars=1\');vHWin.focus();return false;';
459                                                 $out.='
460                                         <tr>
461                                                 <td class="c-tableDescription">'.t3lib_BEfunc::helpTextIcon($table,'',$this->backPath,TRUE).$GLOBALS['TCA_DESCR'][$table]['columns']['']['description'].'</td>
462                                         </tr>';
463                                         }
464                                 }
465                         } else {
466                                 $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>':'';
467                                 $out.=$this->addelement(1,$theUpIcon,$theData,' class="c-headLineTable"','');
468                         }
469
470                         If (!$LOISmode) {
471                                         // Fixing a order table for sortby tables
472                                 $this->currentTable = array();
473                                 $currentIdList = array();
474                                 $doSort = ($TCA[$table]['ctrl']['sortby'] && !$this->sortField);
475
476                                 $prevUid = 0;
477                                 $prevPrevUid = 0;
478                                 $accRows = array();     // Accumulate rows here
479                                 while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($result))    {
480
481                                                 // In offline workspace, look for alternative record:
482                                         t3lib_BEfunc::workspaceOL($table, $row, $GLOBALS['BE_USER']->workspace, TRUE);
483
484                                         if (is_array($row))     {
485                                                 $accRows[] = $row;
486                                                 $currentIdList[] = $row['uid'];
487                                                 if ($doSort)    {
488                                                         if ($prevUid)   {
489                                                                 $this->currentTable['prev'][$row['uid']] = $prevPrevUid;
490                                                                 $this->currentTable['next'][$prevUid] = '-'.$row['uid'];
491                                                                 $this->currentTable['prevUid'][$row['uid']] = $prevUid;
492                                                         }
493                                                         $prevPrevUid = isset($this->currentTable['prev'][$row['uid']]) ? -$prevUid : $row['pid'];
494                                                         $prevUid=$row['uid'];
495                                                 }
496                                         }
497                                 }
498                                 $GLOBALS['TYPO3_DB']->sql_free_result($result);
499
500                                         // CSV initiated
501                                 if ($this->csvOutput) $this->initCSV();
502
503                                         // Render items:
504                                 $this->CBnames=array();
505                                 $this->duplicateStack=array();
506                                 $this->eCounter=$this->firstElementNumber;
507
508                                 $iOut = '';
509                                 $cc = 0;
510                                 foreach($accRows as $row)       {
511
512                                                 // Forward/Backwards navigation links:
513                                         list($flag,$code) = $this->fwd_rwd_nav($table);
514                                         $iOut.=$code;
515
516                                                 // If render item, increment counter and call function
517                                         if ($flag)      {
518                                                 $cc++;
519                                                 $iOut.= $this->renderListRow($table,$row,$cc,$titleCol,$thumbsCol);
520
521                                                         // 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:
522                                                 if ($this->localizationView && $l10nEnabled)    {
523
524                                                                 // Look for translations of this record:
525                                                         $translations = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows(
526                                                                 $selFieldList,
527                                                                 $table,
528                                                                 'pid='.$row['pid'].
529                                                                         ' AND '.$TCA[$table]['ctrl']['languageField'].'>0'.
530                                                                         ' AND '.$TCA[$table]['ctrl']['transOrigPointerField'].'='.intval($row['uid']).
531                                                                         t3lib_BEfunc::deleteClause($table).
532                                                                         t3lib_BEfunc::versioningPlaceholderClause($table)
533                                                         );
534
535                                                                 // For each available translation, render the record:
536                                                         if (is_array($translations)) {
537                                                                 foreach($translations as $lRow) {
538                                                                                 // In offline workspace, look for alternative record:
539                                                                         t3lib_BEfunc::workspaceOL($table, $lRow, $GLOBALS['BE_USER']->workspace);
540
541                                                                         if (is_array($lRow) && $GLOBALS['BE_USER']->checkLanguageAccess($lRow[$TCA[$table]['ctrl']['languageField']]))  {
542                                                                                 $currentIdList[] = $lRow['uid'];
543                                                                                 $iOut.=$this->renderListRow($table,$lRow,$cc,$titleCol,$thumbsCol,18);
544                                                                         }
545                                                                 }
546                                                         }
547                                                 }
548                                         }
549
550                                                 // Counter of total rows incremented:
551                                         $this->eCounter++;
552                                 }
553
554                                         // The header row for the table is now created:
555                                 $out.=$this->renderListHeader($table,$currentIdList);
556                         }
557
558                                 // The list of records is added after the header:
559                         $out.=$iOut;
560
561                                 // ... and it is all wrapped in a table:
562                         $out='
563
564
565
566                         <!--
567                                 DB listing of elements: "'.htmlspecialchars($table).'"
568                         -->
569                                 <table border="0" cellpadding="0" cellspacing="0" class="typo3-dblist'.($LOISmode?' typo3-dblist-overview':'').'">
570                                         '.$out.'
571                                 </table>';
572
573                                 // Output csv if...
574                         if ($this->csvOutput)   $this->outputCSV($table);       // This ends the page with exit.
575                 }
576
577                         // Return content:
578                 return $out;
579         }
580
581         /**
582          * Rendering a single row for the list
583          *
584          * @param       string          Table name
585          * @param       array           Current record
586          * @param       integer         Counter, counting for each time an element is rendered (used for alternating colors)
587          * @param       string          Table field (column) where header value is found
588          * @param       string          Table field (column) where (possible) thumbnails can be found
589          * @param       integer         Indent from left.
590          * @return      string          Table row for the element
591          * @access private
592          * @see getTable()
593          */
594         function renderListRow($table,$row,$cc,$titleCol,$thumbsCol,$indent=0)  {
595                 $iOut = '';
596
597                 if (strlen($this->searchString))        {       // If in search mode, make sure the preview will show the correct page
598                         $id_orig = $this->id;
599                         $this->id = $row['pid'];
600                 }
601
602                 if (is_array($row))     {
603
604                                 // Background color, if any:
605                         $row_bgColor=
606                                 $this->alternateBgColors ?
607                                 (($cc%2)?'' :' class="db_list_alt"') :
608                                 '';
609
610                                 // Overriding with versions background color if any:
611                         $row_bgColor = $row['_CSSCLASS'] ? ' class="'.$row['_CSSCLASS'].'"' : $row_bgColor;
612
613                                 // Incr. counter.
614                         $this->counter++;
615
616                                 // The icon with link
617                         $alttext = t3lib_BEfunc::getRecordIconAltText($row,$table);
618                         $iconImg = t3lib_iconWorks::getIconImage($table,$row,$this->backPath,'title="'.htmlspecialchars($alttext).'"'.($indent ? ' style="margin-left: '.$indent.'px;"' : ''));
619                         $theIcon = $this->clickMenuEnabled ? $GLOBALS['SOBE']->doc->wrapClickMenuOnIcon($iconImg,$table,$row['uid']) : $iconImg;
620
621                                 // Preparing and getting the data-array
622                         $theData = Array();
623                         foreach($this->fieldArray as $fCol)     {
624                                 if ($fCol==$titleCol)   {
625                                         $recTitle = t3lib_BEfunc::getRecordTitle($table,$row,FALSE,TRUE);
626                                         $theData[$fCol] = $this->linkWrapItems($table,$row['uid'],$recTitle,$row);
627                                 } elseif ($fCol=='pid') {
628                                         $theData[$fCol]=$row[$fCol];
629                                 } elseif ($fCol=='_PATH_') {
630                                         $theData[$fCol]=$this->recPath($row['pid']);
631                                 } elseif ($fCol=='_REF_') {
632                                         $theData[$fCol]=$this->makeRef($table,$row['uid']);
633                                 } elseif ($fCol=='_CONTROL_') {
634                                         $theData[$fCol]=$this->makeControl($table,$row);
635                                 } elseif ($fCol=='_CLIPBOARD_') {
636                                         $theData[$fCol]=$this->makeClip($table,$row);
637         #                               $t3lib_transl8tools = new t3lib_transl8tools;
638         #                               $theData[$fCol].=t3lib_div::view_array($t3lib_transl8tools->translationInfo($table,$row['uid']));
639                                 } elseif ($fCol=='_LOCALIZATION_') {
640                                         list($lC1, $lC2) = $this->makeLocalizationPanel($table,$row);
641                                         $theData[$fCol] = $lC1;
642                                         $theData[$fCol.'b'] = $lC2;
643                                 } elseif ($fCol=='_LOCALIZATION_b') {
644                                         // Do nothing, has been done above.
645                                 } else {
646                                         $theData[$fCol] = $this->linkUrlMail(htmlspecialchars(t3lib_BEfunc::getProcessedValueExtra($table,$fCol,$row[$fCol],100,$row['uid'])),$row[$fCol]);
647                                 }
648                         }
649
650                         if (strlen($this->searchString))        {       // Reset the ID if it was overwritten
651                                 $this->id = $id_orig;
652                         }
653
654                                 // Add row to CSV list:
655                         if ($this->csvOutput) $this->addToCSV($row,$table);
656
657                                 // Create element in table cells:
658                         $iOut.=$this->addelement(1,$theIcon,$theData,$row_bgColor);
659
660                                 // Render thumbsnails if a thumbnail column exists and there is content in it:
661                         if ($this->thumbs && trim($row[$thumbsCol]))    {
662                                 $iOut.=$this->addelement(4,'', Array($titleCol=>$this->thumbCode($row,$table,$thumbsCol)),$row_bgColor);
663                         }
664
665                                 // Finally, return table row element:
666                         return $iOut;
667                 }
668         }
669
670         /**
671          * Rendering the header row for a table
672          *
673          * @param       string          Table name
674          * @param       array           Array of the currently displayed uids of the table
675          * @return      string          Header table row
676          * @access private
677          * @see getTable()
678          */
679         function renderListHeader($table,$currentIdList)        {
680                 global $TCA, $LANG, $TYPO3_CONF_VARS;
681
682                         // Init:
683                 $theData = Array();
684
685                         // Traverse the fields:
686                 foreach($this->fieldArray as $fCol)     {
687
688                                 // Calculate users permissions to edit records in the table:
689                         $permsEdit = $this->calcPerms & ($table=='pages'?2:16);
690
691                         switch((string)$fCol)   {
692                                 case '_PATH_':                  // Path
693                                         $theData[$fCol] = '<i>['.$LANG->sL('LLL:EXT:lang/locallang_core.php:labels._PATH_',1).']</i>';
694                                 break;
695                                 case '_REF_':                   // References
696                                         $theData[$fCol] = '<i>['.$LANG->sL('LLL:EXT:lang/locallang_mod_file_list.xml:c__REF_',1).']</i>';
697                                 break;
698                                 case '_LOCALIZATION_':                  // Path
699                                         $theData[$fCol] = '<i>['.$LANG->sL('LLL:EXT:lang/locallang_core.php:labels._LOCALIZATION_',1).']</i>';
700                                 break;
701                                 case '_LOCALIZATION_b':                 // Path
702                                         $theData[$fCol] = $LANG->getLL('Localize',1);
703                                 break;
704                                 case '_CLIPBOARD_':             // Clipboard:
705                                         $cells=array();
706
707                                                 // If there are elements on the clipboard for this table, then display the "paste into" icon:
708                                         $elFromTable = $this->clipObj->elFromTable($table);
709                                         if (count($elFromTable))        {
710                                                 $cells['pasteAfter']='<a href="'.htmlspecialchars($this->clipObj->pasteUrl($table,$this->id)).'" onclick="'.htmlspecialchars('return '.$this->clipObj->confirmMsg('pages',$this->pageRow,'into',$elFromTable)).'">'.
711                                                                 '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/clip_pasteafter.gif','width="12" height="12"').' title="'.$LANG->getLL('clip_paste',1).'" alt="" />'.
712                                                                 '</a>';
713                                         }
714
715                                                 // If the numeric clipboard pads are enabled, display the control icons for that:
716                                         if ($this->clipObj->current!='normal')  {
717
718                                                         // The "select" link:
719                                                 $cells['copyMarked']=$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');
720
721                                                         // The "edit marked" link:
722                                                 $editIdList = implode(',',$currentIdList);
723                                                 $editIdList = "'+editList('".$table."','".$editIdList."')+'";
724                                                 $params='&edit['.$table.']['.$editIdList.']=edit&disHelp=1';
725                                                 $cells['edit']='<a href="#" onclick="'.htmlspecialchars(t3lib_BEfunc::editOnClick($params,$this->backPath,-1)).'">'.
726                                                                 '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/edit2.gif','width="11" height="12"').' title="'.$LANG->getLL('clip_editMarked',1).'" alt="" />'.
727                                                                 '</a>';
728
729                                                         // The "Delete marked" link:
730                                                 $cells['delete']=$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'])));
731
732                                                         // The "Select all" link:
733                                                 $cells['markAll']='<a href="#" onclick="'.htmlspecialchars('checkOffCB(\''.implode(',',$this->CBnames).'\'); return false;').'">'.
734                                                                 '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/clip_select.gif','width="12" height="12"').' title="'.$LANG->getLL('clip_markRecords',1).'" alt="" />'.
735                                                                 '</a>';
736                                         } else {
737                                                 $cells['empty']='';
738                                         }
739                                         /**
740                                          * @hook                        renderListHeaderActions: Allows to change the clipboard icons of the Web>List table headers
741                                          * @date                        2007-11-20
742                                          * @request             Bernhard Kraft  <krafbt@kraftb.at>
743                                          * @usage               Above each listed table in Web>List a header row is shown. This hook allows to modify the icons responsible for the clipboard functions (shown above the clipboard checkboxes when a clipboard other than "Normal" is selected), or other "Action" functions which perform operations on the listed records.
744                                          */
745                                         if(is_array($TYPO3_CONF_VARS['SC_OPTIONS']['typo3/class.db_list_extra.inc']['actions']))        {
746                                                 foreach($TYPO3_CONF_VARS['SC_OPTIONS']['typo3/class.db_list_extra.inc']['actions'] as $classData)       {
747                                                         $hookObject = &t3lib_div::getUserObj($classData);
748                                                         if(!($hookObject instanceof localRecordList_actionsHook))       {
749                                                                 throw new UnexpectedValueException('$hookObject must implement interface localRecordList_actionsHook', 1195567850);
750                                                         }
751                                                         $cells = $hookObject->renderListHeaderActions($table, $currentIdList, $cells, $this);
752                                                 }
753                                         }
754                                         $theData[$fCol]=implode('',$cells);
755                                 break;
756                                 case '_CONTROL_':               // Control panel:
757                                         if (!$TCA[$table]['ctrl']['readOnly'])  {
758
759                                                         // If new records can be created on this page, add links:
760                                                 if ($this->calcPerms&($table=='pages'?8:16) && $this->showNewRecLink($table))   {
761                                                         if ($table=="tt_content" && $this->newWizards)  {
762                                                                         //  If mod.web_list.newContentWiz.overrideWithExtension is set, use that extension's create new content wizard instead:
763                                                                 $tmpTSc = t3lib_BEfunc::getModTSconfig($this->pageinfo['uid'],'mod.web_list');
764                                                                 $tmpTSc = $tmpTSc ['properties']['newContentWiz.']['overrideWithExtension'];
765                                                                 $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';
766
767                                                                 $theData[$fCol]='<a href="#" onclick="'.htmlspecialchars('return jumpExt(\''.$newContentWizScriptPath.'?id='.$this->id.'\');').'">'.
768                                                                                                 '<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="" />'.
769                                                                                                 '</a>';
770                                                         } elseif ($table=='pages' && $this->newWizards) {
771                                                                 $theData[$fCol]='<a href="'.htmlspecialchars($this->backPath.'db_new.php?id='.$this->id.'&pagesOnly=1&returnUrl='.rawurlencode(t3lib_div::getIndpEnv('REQUEST_URI'))).'">'.
772                                                                                                 '<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="" />'.
773                                                                                                 '</a>';
774                                                         } else {
775                                                                 $params='&edit['.$table.']['.$this->id.']=new';
776                                                                 $theData[$fCol]='<a href="#" onclick="'.htmlspecialchars(t3lib_BEfunc::editOnClick($params,$this->backPath,-1)).'">'.
777                                                                                                 '<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="" />'.
778                                                                                                 '</a>';
779                                                         }
780                                                 }
781
782                                                         // If the table can be edited, add link for editing ALL SHOWN fields for all listed records:
783                                                 if ($permsEdit && $this->table && is_array($currentIdList))     {
784                                                         $editIdList = implode(',',$currentIdList);
785                                                         if ($this->clipNumPane()) $editIdList = "'+editList('".$table."','".$editIdList."')+'";
786                                                         $params='&edit['.$table.']['.$editIdList.']=edit&columnsOnly='.implode(',',$this->fieldArray).'&disHelp=1';
787                                                         $theData[$fCol].='<a href="#" onclick="'.htmlspecialchars(t3lib_BEfunc::editOnClick($params,$this->backPath,-1)).'">'.
788                                                                                         '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/edit2.gif','width="11" height="12"').' title="'.$LANG->getLL('editShownColumns',1).'" alt="" />'.
789                                                                                         '</a>';
790                                                 }
791                                         }
792                                 break;
793                                 default:                        // Regular fields header:
794                                         $theData[$fCol]='';
795                                         if ($this->table && is_array($currentIdList))   {
796
797                                                         // If the numeric clipboard pads are selected, show duplicate sorting link:
798                                                 if ($this->clipNumPane()) {
799                                                         $theData[$fCol].='<a href="'.htmlspecialchars($this->listURL('',-1).'&duplicateField='.$fCol).'">'.
800                                                                                         '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/select_duplicates.gif','width="11" height="11"').' title="'.$LANG->getLL('clip_duplicates',1).'" alt="" />'.
801                                                                                         '</a>';
802                                                 }
803
804                                                         // If the table can be edited, add link for editing THIS field for all listed records:
805                                                 if (!$TCA[$table]['ctrl']['readOnly'] && $permsEdit && $TCA[$table]['columns'][$fCol])  {
806                                                         $editIdList = implode(',',$currentIdList);
807                                                         if ($this->clipNumPane()) $editIdList = "'+editList('".$table."','".$editIdList."')+'";
808                                                         $params='&edit['.$table.']['.$editIdList.']=edit&columnsOnly='.$fCol.'&disHelp=1';
809                                                         $iTitle = sprintf($LANG->getLL('editThisColumn'),ereg_replace(':$','',trim($LANG->sL(t3lib_BEfunc::getItemLabel($table,$fCol)))));
810                                                         $theData[$fCol].='<a href="#" onclick="'.htmlspecialchars(t3lib_BEfunc::editOnClick($params,$this->backPath,-1)).'">'.
811                                                                                         '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/edit2.gif','width="11" height="12"').' title="'.htmlspecialchars($iTitle).'" alt="" />'.
812                                                                                         '</a>';
813                                                 }
814                                         }
815                                         $theData[$fCol].=$this->addSortLink($LANG->sL(t3lib_BEfunc::getItemLabel($table,$fCol,'<i>[|]</i>')),$fCol,$table);
816                                 break;
817                         }
818
819
820                 }
821
822                 /**
823                  * @hook                        renderListHeader: Allows to change the contents of columns/cells of the Web>List table headers
824                  * @date                        2007-11-20
825                  * @request             Bernhard Kraft  <krafbt@kraftb.at>
826                  * @usage               Above each listed table in Web>List a header row is shown. Containing the labels of all shown fields and additional icons to create new records for this table or perform special clipboard tasks like mark and copy all listed records to clipboard, etc.
827                  */
828                 if(is_array($TYPO3_CONF_VARS['SC_OPTIONS']['typo3/class.db_list_extra.inc']['actions']))        {
829                         foreach($TYPO3_CONF_VARS['SC_OPTIONS']['typo3/class.db_list_extra.inc']['actions'] as $classData)       {
830                                 $hookObject = &t3lib_div::getUserObj($classData);
831                                 if(!($hookObject instanceof localRecordList_actionsHook))       {
832                                         throw new UnexpectedValueException('$hookObject must implement interface localRecordList_actionsHook', 1195567855);
833                                 }
834                                 $theData = $hookObject->renderListHeader($table, $currentIdList, $theData, $this);
835                         }
836                 }
837
838                         // Create and return header table row:
839                 return $this->addelement(1,'',$theData,' class="c-headLine"','');
840         }
841
842
843
844
845
846
847         /*********************************
848          *
849          * Rendering of various elements
850          *
851          *********************************/
852
853         /**
854          * Creates the control panel for a single record in the listing.
855          *
856          * @param       string          The table
857          * @param       array           The record for which to make the control panel.
858          * @return      string          HTML table with the control panel (unless disabled)
859          */
860         function makeControl($table,$row)       {
861                 global $TCA, $LANG, $SOBE, $TYPO3_CONF_VARS;
862                 if ($this->dontShowClipControlPanels)   return '';
863
864                         // Initialize:
865                 t3lib_div::loadTCA($table);
866                 $cells=array();
867
868                         // If the listed table is 'pages' we have to request the permission settings for each page:
869                 if ($table=='pages')    {
870                         $localCalcPerms = $GLOBALS['BE_USER']->calcPerms(t3lib_BEfunc::getRecord('pages',$row['uid']));
871                 }
872
873                         // This expresses the edit permissions for this particular element:
874                 $permsEdit = ($table=='pages' && ($localCalcPerms&2)) || ($table!='pages' && ($this->calcPerms&16));
875
876                         // "Show" link (only pages and tt_content elements)
877                 if ($table=='pages' || $table=='tt_content')    {
878                         $params='&edit['.$table.']['.$row['uid'].']=edit';
879                         $cells['view']='<a href="#" onclick="'.htmlspecialchars(t3lib_BEfunc::viewOnClick($table=='tt_content'?$this->id.'#'.$row['uid']:$row['uid'], $this->backPath)).'">'.
880                                         '<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="" />'.
881                                         '</a>';
882                 }
883
884                         // "Edit" link: ( Only if permissions to edit the page-record of the content of the parent page ($this->id)
885                 if ($permsEdit) {
886                         $params='&edit['.$table.']['.$row['uid'].']=edit';
887                         $cells['edit']='<a href="#" onclick="'.htmlspecialchars(t3lib_BEfunc::editOnClick($params,$this->backPath,-1)).'">'.
888                                         '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/edit2'.(!$TCA[$table]['ctrl']['readOnly']?'':'_d').'.gif','width="11" height="12"').' title="'.$LANG->getLL('edit',1).'" alt="" />'.
889                                         '</a>';
890                 }
891
892                         // "Move" wizard link for pages/tt_content elements:
893                 if (($table=="tt_content" && $permsEdit) || ($table=='pages'))  {
894                         $cells['move']='<a href="#" onclick="'.htmlspecialchars('return jumpExt(\''.$this->backPath.'move_el.php?table='.$table.'&uid='.$row['uid'].'\');').'">'.
895                                         '<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="" />'.
896                                         '</a>';
897                 }
898
899                         // If the extended control panel is enabled OR if we are seeing a single table:
900                 if ($SOBE->MOD_SETTINGS['bigControlPanel'] || $this->table)     {
901
902                                 // "Info": (All records)
903                         $cells['viewBig']='<a href="#" onclick="'.htmlspecialchars('top.launchView(\''.$table.'\', \''.$row['uid'].'\'); return false;').'">'.
904                                         '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/zoom2.gif','width="12" height="12"').' title="'.$LANG->getLL('showInfo',1).'" alt="" />'.
905                                         '</a>';
906
907                                 // If the table is NOT a read-only table, then show these links:
908                         if (!$TCA[$table]['ctrl']['readOnly'])  {
909
910                                         // "Revert" link (history/undo)
911                                 $cells['history']='<a href="#" onclick="'.htmlspecialchars('return jumpExt(\''.$this->backPath.'show_rechis.php?element='.rawurlencode($table.':'.$row['uid']).'\',\'#latest\');').'">'.
912                                                 '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/history2.gif','width="13" height="12"').' title="'.$LANG->getLL('history',1).'" alt="" />'.
913                                                 '</a>';
914
915                                         // Versioning:
916                                 if (t3lib_extMgm::isLoaded('version'))  {
917                                         $vers = t3lib_BEfunc::selectVersionsOfRecord($table, $row['uid'], 'uid', $GLOBALS['BE_USER']->workspace);
918                                         if (is_array($vers))    {       // If table can be versionized.
919                                                 if (count($vers)>1)     {
920                                                         $st = 'background-color: #FFFF00; font-weight: bold;';
921                                                         $lab = count($vers)-1;
922                                                 } else {
923                                                         $st = 'background-color: #9999cc; font-weight: bold;';
924                                                         $lab = 'V';
925                                                 }
926
927                                                 $cells['version']='<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).'">'.
928                                                                 $lab.
929                                                                 '</a>';
930                                         }
931                                 }
932
933                                         // "Edit Perms" link:
934                                 if ($table=='pages' && $GLOBALS['BE_USER']->check('modules','web_perm'))        {
935                                         $cells['perms']='<a href="'.htmlspecialchars('mod/web/perm/index.php?id='.$row['uid'].'&return_id='.$row['uid'].'&edit=1').'">'.
936                                                         '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/perm.gif','width="7" height="12"').' title="'.$LANG->getLL('permissions',1).'" alt="" />'.
937                                                         '</a>';
938                                 }
939
940                                         // "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):
941                                 if ($TCA[$table]['ctrl']['sortby'] || $TCA[$table]['ctrl']['useColumnsForDefaultValues'])       {
942                                         if (
943                                                 ($table!='pages' && ($this->calcPerms&16)) ||   // For NON-pages, must have permission to edit content on this parent page
944                                                 ($table=='pages' && ($this->calcPerms&8))               // For pages, must have permission to create new pages here.
945                                                 )       {
946                                                 if ($this->showNewRecLink($table))      {
947                                                         $params='&edit['.$table.']['.(-($row['_MOVE_PLH']?$row['_MOVE_PLH_uid']:$row['uid'])).']=new';
948                                                         $cells['new']='<a href="#" onclick="'.htmlspecialchars(t3lib_BEfunc::editOnClick($params,$this->backPath,-1)).'">'.
949                                                                         '<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="" />'.
950                                                                         '</a>';
951                                                 }
952                                         }
953                                 }
954
955                                         // "Up/Down" links
956                                 if ($permsEdit && $TCA[$table]['ctrl']['sortby']  && !$this->sortField && !$this->searchLevels) {
957                                         if (isset($this->currentTable['prev'][$row['uid']]))    {       // Up
958                                                 $params='&cmd['.$table.']['.$row['uid'].'][move]='.$this->currentTable['prev'][$row['uid']];
959                                                 $cells['moveUp']='<a href="#" onclick="'.htmlspecialchars('return jumpToUrl(\''.$SOBE->doc->issueCommand($params,-1).'\');').'">'.
960                                                                 '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/button_up.gif','width="11" height="10"').' title="'.$LANG->getLL('moveUp',1).'" alt="" />'.
961                                                                 '</a>';
962                                         } else {
963                                                 $cells['moveUp']='<img src="clear.gif" '.t3lib_iconWorks::skinImg($this->backPath,'gfx/button_up.gif','width="11" height="10"',2).' alt="" />';
964                                         }
965                                         if ($this->currentTable['next'][$row['uid']])   {       // Down
966                                                 $params='&cmd['.$table.']['.$row['uid'].'][move]='.$this->currentTable['next'][$row['uid']];
967                                                 $cells['moveDown']='<a href="#" onclick="'.htmlspecialchars('return jumpToUrl(\''.$SOBE->doc->issueCommand($params,-1).'\');').'">'.
968                                                                 '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/button_down.gif','width="11" height="10"').' title="'.$LANG->getLL('moveDown',1).'" alt="" />'.
969                                                                 '</a>';
970                                         } else {
971                                                 $cells['moveDown']='<img src="clear.gif" '.t3lib_iconWorks::skinImg($this->backPath,'gfx/button_down.gif','width="11" height="10"',2).' alt="" />';
972                                         }
973                                 }
974
975                                         // "Hide/Unhide" links:
976                                 $hiddenField = $TCA[$table]['ctrl']['enablecolumns']['disabled'];
977                                 if ($permsEdit && $hiddenField && $TCA[$table]['columns'][$hiddenField] && (!$TCA[$table]['columns'][$hiddenField]['exclude'] || $GLOBALS['BE_USER']->check('non_exclude_fields',$table.':'.$hiddenField)))     {
978                                         if ($row[$hiddenField]) {
979                                                 $params='&data['.$table.']['.$row['uid'].']['.$hiddenField.']=0';
980                                                 $cells['hide']='<a href="#" onclick="'.htmlspecialchars('return jumpToUrl(\''.$SOBE->doc->issueCommand($params,-1).'\');').'">'.
981                                                                 '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/button_unhide.gif','width="11" height="10"').' title="'.$LANG->getLL('unHide'.($table=='pages'?'Page':''),1).'" alt="" />'.
982                                                                 '</a>';
983                                         } else {
984                                                 $params='&data['.$table.']['.$row['uid'].']['.$hiddenField.']=1';
985                                                 $cells['hide']='<a href="#" onclick="'.htmlspecialchars('return jumpToUrl(\''.$SOBE->doc->issueCommand($params,-1).'\');').'">'.
986                                                                 '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/button_hide.gif','width="11" height="10"').' title="'.$LANG->getLL('hide'.($table=='pages'?'Page':''),1).'" alt="" />'.
987                                                                 '</a>';
988                                         }
989                                 }
990
991                                         // "Delete" link:
992                                 if (
993                                         ($table=='pages' && ($localCalcPerms&4)) || ($table!='pages' && ($this->calcPerms&16))
994                                         )       {
995                                         $params='&cmd['.$table.']['.$row['uid'].'][delete]=1';
996                                         $cells['delete']='<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;').'">'.
997                                                         '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/garbage.gif','width="11" height="12"').' title="'.$LANG->getLL('delete',1).'" alt="" />'.
998                                                         '</a>';
999                                 }
1000
1001                                         // "Levels" links: Moving pages into new levels...
1002                                 if ($permsEdit && $table=='pages' && !$this->searchLevels)      {
1003
1004                                                 // Up (Paste as the page right after the current parent page)
1005                                         if ($this->calcPerms&8) {
1006                                                 $params='&cmd['.$table.']['.$row['uid'].'][move]='.-$this->id;
1007                                                 $cells['moveLeft']='<a href="#" onclick="'.htmlspecialchars('return jumpToUrl(\''.$SOBE->doc->issueCommand($params,-1).'\');').'">'.
1008                                                                 '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/button_left.gif','width="11" height="10"').' title="'.$LANG->getLL('prevLevel',1).'" alt="" />'.
1009                                                                 '</a>';
1010                                         }
1011                                                 // Down (Paste as subpage to the page right above)
1012                                         if ($this->currentTable['prevUid'][$row['uid']])        {
1013                                                 $localCalcPerms = $GLOBALS['BE_USER']->calcPerms(t3lib_BEfunc::getRecord('pages',$this->currentTable['prevUid'][$row['uid']]));
1014                                                 if ($localCalcPerms&8)  {
1015                                                         $params='&cmd['.$table.']['.$row['uid'].'][move]='.$this->currentTable['prevUid'][$row['uid']];
1016                                                         $cells['moveRight']='<a href="#" onclick="'.htmlspecialchars('return jumpToUrl(\''.$SOBE->doc->issueCommand($params,-1).'\');').'">'.
1017                                                                         '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/button_right.gif','width="11" height="10"').' title="'.$LANG->getLL('nextLevel',1).'" alt="" />'.
1018                                                                         '</a>';
1019                                                 } else {
1020                                                         $cells['moveRight']='<img src="clear.gif" '.t3lib_iconWorks::skinImg($this->backPath,'gfx/button_right.gif','width="11" height="10"',2).' alt="" />';
1021                                                 }
1022                                         } else {
1023                                                 $cells['moveRight']='<img src="clear.gif" '.t3lib_iconWorks::skinImg($this->backPath,'gfx/button_right.gif','width="11" height="10"',2).' alt="" />';
1024                                         }
1025                                 }
1026                         }
1027                 }
1028
1029                         // If the record is edit-locked by another user, we will show a little warning sign:
1030                 if ($lockInfo=t3lib_BEfunc::isRecordLocked($table,$row['uid'])) {
1031                         $cells['locked'] = '<a href="#" onclick="'.htmlspecialchars('alert('.$LANG->JScharCode($lockInfo['msg']).');return false;').'">'.
1032                                         '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/recordlock_warning3.gif','width="17" height="12"').' title="'.htmlspecialchars($lockInfo['msg']).'" alt="" />'.
1033                                         '</a>';
1034                 }
1035
1036                 /**
1037                  * @hook                        recStatInfoHooks: Allows to insert HTML before record icons on various places
1038                  * @date                        2007-09-22
1039                  * @request             Kasper Skaarhoj  <kasper2007@typo3.com>
1040                  */
1041                 if (is_array($TYPO3_CONF_VARS['SC_OPTIONS']['GLOBAL']['recStatInfoHooks']))     {
1042                         $stat='';
1043                         $_params = array($table,$row['uid']);
1044                         foreach ($TYPO3_CONF_VARS['SC_OPTIONS']['GLOBAL']['recStatInfoHooks'] as $_funcRef)     {
1045                                 $stat.=t3lib_div::callUserFunction($_funcRef,$_params,$this);
1046                         }
1047                         $cells['stat'] = $stat;
1048                 }
1049                 /**
1050                  * @hook                        makeControl: Allows to change control icons of records in list-module
1051                  * @date                        2007-11-20
1052                  * @request             Bernhard Kraft  <krafbt@kraftb.at>
1053                  * @usage               This hook method gets passed the current $cells array as third parameter. This array contains values for the icons/actions generated for each record in Web>List. Each array entry is accesible by an index-key. The order of the icons is dependend on the order of those array entries.
1054                  */
1055                 if(is_array($TYPO3_CONF_VARS['SC_OPTIONS']['typo3/class.db_list_extra.inc']['actions'])) {
1056                         foreach($TYPO3_CONF_VARS['SC_OPTIONS']['typo3/class.db_list_extra.inc']['actions'] as $classData) {
1057                                 $hookObject = &t3lib_div::getUserObj($classData);
1058                                 if(!($hookObject instanceof localRecordList_actionsHook))       {
1059                                         throw new UnexpectedValueException('$hookObject must implement interface localRecordList_actionsHook', 1195567840);
1060                                 }
1061                                 $cells = $hookObject->makeControl($table, $row, $cells, $this);
1062                         }
1063                 }
1064
1065                         // Compile items into a DIV-element:
1066                 return '
1067                                                                                         <!-- CONTROL PANEL: '.$table.':'.$row['uid'].' -->
1068                                                                                         <div class="typo3-DBctrl">'.implode('',$cells).'</div>';
1069         }
1070
1071         /**
1072          * Creates the clipboard panel for a single record in the listing.
1073          *
1074          * @param       string          The table
1075          * @param       array           The record for which to make the clipboard panel.
1076          * @return      string          HTML table with the clipboard panel (unless disabled)
1077          */
1078         function makeClip($table,$row)  {
1079                 global $TCA, $LANG, $TYPO3_CONF_VARS;
1080
1081                         // Return blank, if disabled:
1082                 if ($this->dontShowClipControlPanels)   return '';
1083                 $cells=array();
1084
1085
1086                         // Return blank, if disabled:
1087                         // Whether a numeric clipboard pad is active or the normal pad we will see different content of the panel:
1088                 if ($this->clipObj->current=='normal')  {       // For the "Normal" pad:
1089
1090                                 // Show copy/cut icons:
1091                         $isSel = (string)$this->clipObj->isSelected($table,$row['uid']);
1092                         $cells['copy']='<a href="#" onclick="'.htmlspecialchars('return jumpSelf(\''.$this->clipObj->selUrlDB($table,$row['uid'],1,($isSel=='copy'),array('returnUrl'=>'')).'\');').'">'.
1093                                         '<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="" />'.
1094                                         '</a>';
1095                         $cells['cut']='<a href="#" onclick="'.htmlspecialchars('return jumpSelf(\''.$this->clipObj->selUrlDB($table,$row['uid'],0,($isSel=='cut'),array('returnUrl'=>'')).'\');').'">'.
1096                                         '<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="" />'.
1097                                         '</a>';
1098
1099                 } else {        // For the numeric clipboard pads (showing checkboxes where one can select elements on/off)
1100
1101                                 // Setting name of the element in ->CBnames array:
1102                         $n=$table.'|'.$row['uid'];
1103                         $this->CBnames[]=$n;
1104
1105                                 // Check if the current element is selected and if so, prepare to set the checkbox as selected:
1106                         $checked = ($this->clipObj->isSelected($table,$row['uid'])?' checked="checked"':'');
1107
1108                                 // If the "duplicateField" value is set then select all elements which are duplicates...
1109                         if ($this->duplicateField && isset($row[$this->duplicateField]))        {
1110                                 $checked='';
1111                                 if (in_array($row[$this->duplicateField], $this->duplicateStack))       {
1112                                         $checked=' checked="checked"';
1113                                 }
1114                                 $this->duplicateStack[] = $row[$this->duplicateField];
1115                         }
1116
1117                                 // Adding the checkbox to the panel:
1118                         $cells['select']='<input type="hidden" name="CBH['.$n.']" value="0" /><input type="checkbox" name="CBC['.$n.']" value="1" class="smallCheckboxes"'.$checked.' />';
1119                 }
1120
1121                         // Now, looking for selected elements from the current table:
1122                 $elFromTable = $this->clipObj->elFromTable($table);
1123                 if (count($elFromTable) && $TCA[$table]['ctrl']['sortby'])      {       // IF elements are found and they can be individually ordered, then add a "paste after" icon:
1124                         $cells['pasteAfter']='<a href="'.htmlspecialchars($this->clipObj->pasteUrl($table,-$row['uid'])).'" onclick="'.htmlspecialchars('return '.$this->clipObj->confirmMsg($table,$row,'after',$elFromTable)).'">'.
1125                                         '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/clip_pasteafter.gif','width="12" height="12"').' title="'.$LANG->getLL('clip_pasteAfter',1).'" alt="" />'.
1126                                         '</a>';
1127                 }
1128
1129                         // Now, looking for elements in general:
1130                 $elFromTable = $this->clipObj->elFromTable('');
1131                 if ($table=='pages' && count($elFromTable))     {
1132                         $cells['pasteInto']='<a href="'.htmlspecialchars($this->clipObj->pasteUrl('',$row['uid'])).'" onclick="'.htmlspecialchars('return '.$this->clipObj->confirmMsg($table,$row,'into',$elFromTable)).'">'.
1133                                         '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/clip_pasteinto.gif','width="12" height="12"').' title="'.$LANG->getLL('clip_pasteInto',1).'" alt="" />'.
1134                                         '</a>';
1135                 }
1136                         
1137                 /*
1138                  * @hook                        makeClip: Allows to change clip-icons of records in list-module
1139                  * @date                        2007-11-20
1140                  * @request             Bernhard Kraft  <krafbt@kraftb.at>
1141                  * @usage               This hook method gets passed the current $cells array as third parameter. This array contains values for the clipboard icons generated for each record in Web>List. Each array entry is accesible by an index-key. The order of the icons is dependend on the order of those array entries.
1142                  */
1143                 if(is_array($TYPO3_CONF_VARS['SC_OPTIONS']['typo3/class.db_list_extra.inc']['actions'])) {
1144                         foreach($TYPO3_CONF_VARS['SC_OPTIONS']['typo3/class.db_list_extra.inc']['actions'] as $classData) {
1145                                 $hookObject = &t3lib_div::getUserObj($classData);
1146                                 if(!($hookObject instanceof localRecordList_actionsHook))       {
1147                                         throw new UnexpectedValueException('$hookObject must implement interface localRecordList_actionsHook', 1195567845);
1148                                 }
1149                                 $cells = $hookObject->makeClip($table, $row, $cells, $this);
1150                         }
1151                 }
1152
1153                         // Compile items into a DIV-element:
1154                 return '                                                        <!-- CLIPBOARD PANEL: '.$table.':'.$row['uid'].' -->
1155                                                                                         <div class="typo3-clipCtrl">'.implode('',$cells).'</div>';
1156         }
1157
1158         /**
1159          * Make reference count
1160          *
1161          * @param       string          Table name
1162          * @param       integer         UID of record
1163          * @return      string          HTML-table
1164          */
1165         function makeRef($table,$uid)   {
1166
1167                         // Look up the path:
1168                 $rows = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows(
1169                         '*',
1170                         'sys_refindex',
1171                         'ref_table='.$GLOBALS['TYPO3_DB']->fullQuoteStr($table,'sys_refindex').
1172                                 ' AND ref_uid='.intval($uid).
1173                                 ' AND deleted=0'
1174                 );
1175
1176                         // Compile information for title tag:
1177                 $infoData=array();
1178                 if (is_array($rows)) {
1179                         foreach($rows as $row)  {
1180                                 $infoData[]=$row['tablename'].':'.$row['recuid'].':'.$row['field'];
1181                         }
1182                 }
1183
1184                 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>' : '';
1185         }
1186
1187         /**
1188          * Creates the localization panel
1189          *
1190          * @param       string          The table
1191          * @param       array           The record for which to make the localization panel.
1192          * @return      array           Array with key 0/1 with content for column 1 and 2
1193          */
1194         function makeLocalizationPanel($table,$row)     {
1195                 global $TCA,$LANG;
1196
1197                 $out = array(
1198                         0 => '',
1199                         1 => '',
1200                 );
1201
1202                 $t8Tools = t3lib_div::makeInstance('t3lib_transl8tools');
1203                 $translations = $t8Tools->translationInfo($table,$row['uid']);
1204
1205                         // Language title and icon:
1206                 $out[0] = $this->languageFlag($row[$TCA[$table]['ctrl']['languageField']]);
1207
1208                 if (is_array($translations))    {
1209
1210                                 // Traverse page translations and add icon for each language that does NOT yet exist:
1211                         $lNew = '';
1212                         foreach($this->pageOverlays as $lUid_OnPage => $lsysRec)        {
1213                                 if (!isset($translations['translations'][$lUid_OnPage]) && $GLOBALS['BE_USER']->checkLanguageAccess($lUid_OnPage))      {
1214                                         $href = $GLOBALS['TBE_TEMPLATE']->issueCommand(
1215                                                 '&cmd['.$table.']['.$row['uid'].'][localize]='.$lUid_OnPage,
1216                                                 $this->listURL().'&justLocalized='.rawurlencode($table.':'.$row['uid'].':'.$lUid_OnPage)
1217                                         );
1218
1219                                         $lC = ($this->languageIconTitles[$lUid_OnPage]['flagIcon'] ? '<img src="'.$this->languageIconTitles[$lUid_OnPage]['flagIcon'].'" class="absmiddle" alt="" />' : $this->languageIconTitles[$lUid_OnPage]['title']);
1220                                         $lC = '<a href="'.htmlspecialchars($href).'">'.$lC.'</a> ';
1221
1222                                         $lNew.=$lC;
1223                                 }
1224                         }
1225
1226                         if ($lNew)      $out[1].= $lNew;
1227                 } else {
1228                         $out[0] = '&nbsp;&nbsp;&nbsp;&nbsp;'.$out[0];
1229                 }
1230
1231
1232                 return $out;
1233         }
1234
1235         /**
1236          * Create the selector box for selecting fields to display from a table:
1237          *
1238          * @param       string          Table name
1239          * @param       boolean         If true, form-fields will be wrapped around the table.
1240          * @return      string          HTML table with the selector box (name: displayFields['.$table.'][])
1241          */
1242         function fieldSelectBox($table,$formFields=1)   {
1243                 global $TCA, $LANG;
1244
1245                         // Init:
1246                 t3lib_div::loadTCA($table);
1247                 $formElements=array('','');
1248                 if ($formFields)        {
1249                         $formElements=array('<form action="'.htmlspecialchars($this->listURL()).'" method="post">','</form>');
1250                 }
1251
1252                         // Load already selected fields, if any:
1253                 $setFields=is_array($this->setFields[$table]) ? $this->setFields[$table] : array();
1254
1255                         // Request fields from table:
1256                 $fields = $this->makeFieldList($table);
1257
1258                         // Add pseudo "control" fields
1259                 $fields[]='tstamp';
1260                 $fields[]='crdate';
1261                 $fields[]='_PATH_';
1262                 $fields[]='_REF_';
1263                 $fields[]='_LOCALIZATION_';
1264                 $fields[]='_CONTROL_';
1265                 $fields[]='_CLIPBOARD_';
1266
1267                         // Create an option for each field:
1268                 $opt=array();
1269                 $opt[] = '<option value=""></option>';
1270                 foreach($fields as $fN) {
1271                         $fL = is_array($TCA[$table]['columns'][$fN]) ? ereg_replace(':$','',$LANG->sL($TCA[$table]['columns'][$fN]['label'])) : '['.$fN.']';    // Field label
1272                         $opt[] = '
1273                                                                                         <option value="'.$fN.'"'.(in_array($fN,$setFields)?' selected="selected"':'').'>'.htmlspecialchars($fL).'</option>';
1274                 }
1275
1276                         // Compile the options into a multiple selector box:
1277                 $lMenu = '
1278                                                                                 <select size="'.t3lib_div::intInRange(count($fields)+1,3,20).'" multiple="multiple" name="displayFields['.$table.'][]">'.implode('',$opt).'
1279                                                                                 </select>
1280                                 ';
1281
1282                         // Table with the field selector::
1283                 $content.= '
1284                         '.$formElements[0].'
1285
1286                                 <!--
1287                                         Field selector for extended table view:
1288                                 -->
1289                                 <table border="0" cellpadding="0" cellspacing="0" class="bgColor4" id="typo3-dblist-fieldSelect">
1290                                         <tr>
1291                                                 <td>'.$lMenu.'</td>
1292                                                 <td><input type="submit" name="search" value="'.$LANG->sL('LLL:EXT:lang/locallang_core.php:labels.setFields',1).'" /></td>
1293                                         </tr>
1294                                 </table>
1295                         '.$formElements[1];
1296                 return $content;
1297         }
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309         /*********************************
1310          *
1311          * Helper functions
1312          *
1313          *********************************/
1314
1315         /**
1316          * Creates a link around $string. The link contains an onclick action which submits the script with some clipboard action.
1317          * Currently, this is used for setting elements / delete elements.
1318          *
1319          * @param       string          The HTML content to link (image/text)
1320          * @param       string          Table name
1321          * @param       string          Clipboard command (eg. "setCB" or "delete")
1322          * @param       string          Warning text, if any ("delete" uses this for confirmation)
1323          * @return      string          <a> tag wrapped link.
1324          */
1325         function linkClipboardHeaderIcon($string,$table,$cmd,$warning='')       {
1326                 $onClickEvent = 'document.dblistForm.cmd.value=\''.$cmd.'\';document.dblistForm.cmd_table.value=\''.$table.'\';document.dblistForm.submit();';
1327                 if ($warning)   $onClickEvent = 'if (confirm('.$GLOBALS['LANG']->JScharCode($warning).')){'.$onClickEvent.'}';
1328                 return '<a href="#" onclick="'.htmlspecialchars($onClickEvent.'return false;').'">'.$string.'</a>';
1329         }
1330
1331         /**
1332          * Returns true if a numeric clipboard pad is selected/active
1333          *
1334          * @return      boolean
1335          */
1336         function clipNumPane()  {
1337                 return in_Array('_CLIPBOARD_',$this->fieldArray) && $this->clipObj->current!='normal';
1338         }
1339
1340         /**
1341          * Creates a sort-by link on the input string ($code).
1342          * It will automatically detect if sorting should be ascending or descending depending on $this->sortRev.
1343          * Also some fields will not be possible to sort (including if single-table-view is disabled).
1344          *
1345          * @param       string          The string to link (text)
1346          * @param       string          The fieldname represented by the title ($code)
1347          * @param       string          Table name
1348          * @return      string          Linked $code variable
1349          */
1350         function addSortLink($code,$field,$table)       {
1351
1352                         // Certain circumstances just return string right away (no links):
1353                 if ($field=='_CONTROL_' || $field=='_LOCALIZATION_' || $field=='_CLIPBOARD_' || $field=='_REF_' || $this->disableSingleTableView)       return $code;
1354
1355                         // If "_PATH_" (showing record path) is selected, force sorting by pid field (will at least group the records!)
1356                 if ($field=='_PATH_')   $field=pid;
1357
1358                         //       Create the sort link:
1359                 $sortUrl = $this->listURL('',-1,'sortField,sortRev,table').'&table='.$table.'&sortField='.$field.'&sortRev='.($this->sortRev || ($this->sortField!=$field)?0:1);
1360                 $sortArrow = ($this->sortField==$field?'<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/red'.($this->sortRev?'up':'down').'.gif','width="7" height="4"').' alt="" />':'');
1361
1362                         // Return linked field:
1363                 return '<a href="'.htmlspecialchars($sortUrl).'">'.$code.
1364                                 $sortArrow.
1365                                 '</a>';
1366         }
1367
1368         /**
1369          * Returns the path for a certain pid
1370          * The result is cached internally for the session, thus you can call this function as much as you like without performance problems.
1371          *
1372          * @param       integer         The page id for which to get the path
1373          * @return      string          The path.
1374          */
1375         function recPath($pid)  {
1376                 if (!isset($this->recPath_cache[$pid])) {
1377                         $this->recPath_cache[$pid] = t3lib_BEfunc::getRecordPath($pid,$this->perms_clause,20);
1378                 }
1379                 return $this->recPath_cache[$pid];
1380         }
1381
1382         /**
1383          * Returns true if a link for creating new records should be displayed for $table
1384          *
1385          * @param       string          Table name
1386          * @return      boolean
1387          */
1388         function showNewRecLink($table) {
1389                 return !count($this->allowedNewTables) || in_array($table,$this->allowedNewTables);
1390         }
1391
1392         /**
1393          * 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.
1394          * Uses REQUEST_URI as value.
1395          *
1396          * @return      string
1397          */
1398         function makeReturnUrl()        {
1399                 return '&returnUrl='.rawurlencode(t3lib_div::getIndpEnv('REQUEST_URI'));
1400         }
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412         /************************************
1413          *
1414          * CSV related functions
1415          *
1416          ************************************/
1417
1418         /**
1419          * Initializes internal csvLines array with the header of field names
1420          *
1421          * @return      void
1422          */
1423         function initCSV()      {
1424
1425                         // Reset:
1426                 $this->csvLines=array();
1427
1428                         // Getting header line with field names:
1429                 $csvRow=array();
1430                 foreach($this->fieldArray as $fN)       {
1431                         $csvRow[]=$fN;
1432                 }
1433
1434                         // Set the header + an empty row:
1435                 $this->setCsvRow($csvRow);
1436                 $this->csvLines[]='';
1437         }
1438
1439         /**
1440          * Adds the content of input array $row to the CSV list:
1441          *
1442          * @param       array           Record array, from which the values of fields found in $this->fieldArray will be listed in the CSV output.
1443          * @param       string          Table name
1444          * @return      void
1445          */
1446         function addToCSV($row,$table)  {
1447
1448                         // Traversing fields, adding values from $row:
1449                 $csvRow=array();
1450                 foreach($this->fieldArray as $fN)       {
1451                         if ($fN=='_PATH_')      {
1452                                 $csvRow[]=$this->recPath($row['pid']);
1453                         } elseif ($fN=='_REF_') {
1454                                 $csvRow[]=$this->makeRef($table, $row['uid']);
1455                         } else {
1456                                 $csvRow[]=$row[$fN];
1457                         }
1458                 }
1459
1460                         // Set the values in the CSV list
1461                 $this->setCsvRow($csvRow);
1462         }
1463
1464         /**
1465          * Adds input row of values to the internal csvLines array as a CSV formatted line
1466          *
1467          * @param       array           Array with values to be listed.
1468          * @return      void
1469          */
1470         function setCsvRow($csvRow)     {
1471                 $this->csvLines[] = t3lib_div::csvValues($csvRow);
1472         }
1473
1474         /**
1475          * Compiles the internal csvLines array to a csv-string and outputs it to the browser.
1476          * This function exits!
1477          *
1478          * @param       string          Filename prefix:
1479          * @return      void            EXITS php execusion!
1480          */
1481         function outputCSV($prefix)     {
1482
1483                         // Setting filename:
1484                 $filename=$prefix.'_'.date('dmy-Hi').'.csv';
1485
1486                         // Creating output header:
1487                 $mimeType = 'application/octet-stream';
1488                 Header('Content-Type: '.$mimeType);
1489                 Header('Content-Disposition: attachment; filename='.$filename);
1490
1491                         // Printing the content of the CSV lines:
1492                 echo implode(chr(13).chr(10),$this->csvLines);
1493
1494                         // Exits:
1495                 exit;
1496         }
1497 }
1498
1499
1500
1501 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['typo3/class.db_list_extra.inc'])   {
1502         include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['typo3/class.db_list_extra.inc']);
1503 }
1504 ?>