* Merging all changes from TYPO3_4-0 branch back into HEAD
[Packages/TYPO3.CMS.git] / typo3 / db_list.php
1 <?php
2 /***************************************************************
3 * Copyright notice
4 *
5 * (c) 1999-2005 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 * Module: Web>List
29 *
30 * Listing database records from the tables configured in $TCA as they are related to the current page or root.
31 *
32 * Notice: This module and Web>Page (db_layout.php) module has a special status since they
33 * are NOT located in their actual module directories (fx. mod/web/list/) but in the
34 * backend root directory. This has some historical and practical causes.
35 *
36 * $Id$
37 * Revised for TYPO3 3.6 November/2003 by Kasper Skaarhoj
38 * XHTML compliant
39 *
40 * @author Kasper Skaarhoj <kasperYYYY@typo3.com>
41 */
42 /**
43 * [CLASS/FUNCTION INDEX of SCRIPT]
44 *
45 *
46 *
47 * 89: class SC_db_list
48 * 125: function init()
49 * 160: function menuConfig()
50 * 181: function clearCache()
51 * 195: function main()
52 * 451: function printContent()
53 *
54 * TOTAL FUNCTIONS: 5
55 * (This index is automatically created/updated by the extension "extdeveval")
56 *
57 */
58
59
60 unset($MCONF);
61 require ('mod/web/list/conf.php');
62 require ('init.php');
63 require ('template.php');
64 $LANG->includeLLFile('EXT:lang/locallang_mod_web_list.xml');
65 require_once (PATH_t3lib.'class.t3lib_page.php');
66 require_once (PATH_t3lib.'class.t3lib_pagetree.php');
67 require_once (PATH_t3lib.'class.t3lib_recordlist.php');
68 require_once (PATH_t3lib.'class.t3lib_clipboard.php');
69 require_once ('class.db_list.inc');
70 require_once ('class.db_list_extra.inc');
71 $BE_USER->modAccess($MCONF,1);
72
73 t3lib_BEfunc::lockRecords();
74
75
76
77
78
79
80
81
82 /**
83 * Script Class for the Web > List module; rendering the listing of records on a page
84 *
85 * @author Kasper Skaarhoj <kasperYYYY@typo3.com>
86 * @package TYPO3
87 * @subpackage core
88 */
89 class SC_db_list {
90
91 // Internal, GPvars:
92 var $id; // Page Id for which to make the listing
93 var $pointer; // Pointer - for browsing list of records.
94 var $imagemode; // Thumbnails or not
95 var $table; // Which table to make extended listing for
96 var $search_field; // Search-fields
97 var $search_levels; // Search-levels
98 var $showLimit; // Show-limit
99 var $returnUrl; // Return URL
100
101 var $clear_cache; // Clear-cache flag - if set, clears page cache for current id.
102 var $cmd; // Command: Eg. "delete" or "setCB" (for TCEmain / clipboard operations)
103 var $cmd_table; // Table on which the cmd-action is performed.
104
105 // Internal, static:
106 var $perms_clause; // Page select perms clause
107 var $modTSconfig; // Module TSconfig
108 var $pageinfo; // Current ids page record
109 var $doc; // Document template object
110
111 var $MCONF=array(); // Module configuration
112 var $MOD_MENU=array(); // Menu configuration
113 var $MOD_SETTINGS=array(); // Module settings (session variable)
114 var $include_once=array(); // Array, where files to include is accumulated in the init() function
115
116 // Internal, dynamic:
117 var $content; // Module output accumulation
118
119
120 /**
121 * Initializing the module
122 *
123 * @return void
124 */
125 function init() {
126 global $BE_USER;
127
128 // Setting module configuration / page select clause
129 $this->MCONF = $GLOBALS['MCONF'];
130 $this->perms_clause = $BE_USER->getPagePermsClause(1);
131
132 // GPvars:
133 $this->id = t3lib_div::_GP('id');
134 $this->pointer = t3lib_div::_GP('pointer');
135 $this->imagemode = t3lib_div::_GP('imagemode');
136 $this->table = t3lib_div::_GP('table');
137 $this->search_field = t3lib_div::_GP('search_field');
138 $this->search_levels = t3lib_div::_GP('search_levels');
139 $this->showLimit = t3lib_div::_GP('showLimit');
140 $this->returnUrl = t3lib_div::_GP('returnUrl');
141
142 $this->clear_cache = t3lib_div::_GP('clear_cache');
143 $this->cmd = t3lib_div::_GP('cmd');
144 $this->cmd_table = t3lib_div::_GP('cmd_table');
145
146 // Initialize menu
147 $this->menuConfig();
148
149 // Inclusions?
150 if ($this->clear_cache || $this->cmd=='delete') {
151 $this->include_once[]=PATH_t3lib.'class.t3lib_tcemain.php';
152 }
153 }
154
155 /**
156 * Initialize function menu array
157 *
158 * @return void
159 */
160 function menuConfig() {
161
162 // MENU-ITEMS:
163 $this->MOD_MENU = array(
164 'bigControlPanel' => '',
165 'clipBoard' => '',
166 'localization' => ''
167 );
168
169 // Loading module configuration:
170 $this->modTSconfig = t3lib_BEfunc::getModTSconfig($this->id,'mod.'.$this->MCONF['name']);
171
172 // Clean up settings:
173 $this->MOD_SETTINGS = t3lib_BEfunc::getModuleData($this->MOD_MENU, t3lib_div::_GP('SET'), $this->MCONF['name']);
174 }
175
176 /**
177 * Clears page cache for the current id, $this->id
178 *
179 * @return void
180 */
181 function clearCache() {
182 if ($this->clear_cache) {
183 $tce = t3lib_div::makeInstance('t3lib_TCEmain');
184 $tce->stripslashes_values=0;
185 $tce->start(Array(),Array());
186 $tce->clear_cacheCmd($this->id);
187 }
188 }
189
190 /**
191 * Main function, starting the rendering of the list.
192 *
193 * @return void
194 */
195 function main() {
196 global $BE_USER,$LANG,$BACK_PATH,$CLIENT;
197
198 // Start document template object:
199 $this->doc = t3lib_div::makeInstance('template');
200 $this->doc->backPath = $BACK_PATH;
201 $this->doc->docType='xhtml_trans';
202
203 // Loading current page record and checking access:
204 $this->pageinfo = t3lib_BEfunc::readPageAccess($this->id,$this->perms_clause);
205 $access = is_array($this->pageinfo) ? 1 : 0;
206
207 // Initialize the dblist object:
208 $dblist = t3lib_div::makeInstance('localRecordList');
209 $dblist->backPath = $BACK_PATH;
210 $dblist->calcPerms = $BE_USER->calcPerms($this->pageinfo);
211 $dblist->thumbs = $BE_USER->uc['thumbnailsByDefault'];
212 $dblist->returnUrl=$this->returnUrl;
213 $dblist->allFields = ($this->MOD_SETTINGS['bigControlPanel'] || $this->table) ? 1 : 0;
214 $dblist->localizationView = $this->MOD_SETTINGS['localization'];
215 $dblist->showClipboard = 1;
216 $dblist->disableSingleTableView = $this->modTSconfig['properties']['disableSingleTableView'];
217 $dblist->listOnlyInSingleTableMode = $this->modTSconfig['properties']['listOnlyInSingleTableView'];
218 $dblist->hideTables = $this->modTSconfig['properties']['hideTables'];
219 $dblist->clickTitleMode = $this->modTSconfig['properties']['clickTitleMode'];
220 $dblist->alternateBgColors=$this->modTSconfig['properties']['alternateBgColors']?1:0;
221 $dblist->allowedNewTables = t3lib_div::trimExplode(',',$this->modTSconfig['properties']['allowedNewTables'],1);
222 $dblist->newWizards=$this->modTSconfig['properties']['newWizards']?1:0;
223
224
225
226 // Clipboard is initialized:
227 $dblist->clipObj = t3lib_div::makeInstance('t3lib_clipboard'); // Start clipboard
228 $dblist->clipObj->initializeClipboard(); // Initialize - reads the clipboard content from the user session
229
230 // Clipboard actions are handled:
231 $CB = t3lib_div::_GET('CB'); // CB is the clipboard command array
232 if ($this->cmd=='setCB') {
233 // CBH is all the fields selected for the clipboard, CBC is the checkbox fields which were checked. By merging we get a full array of checked/unchecked elements
234 // This is set to the 'el' array of the CB after being parsed so only the table in question is registered.
235 $CB['el'] = $dblist->clipObj->cleanUpCBC(array_merge((array)t3lib_div::_POST('CBH'),(array)t3lib_div::_POST('CBC')),$this->cmd_table);
236 }
237 if (!$this->MOD_SETTINGS['clipBoard']) $CB['setP']='normal'; // If the clipboard is NOT shown, set the pad to 'normal'.
238 $dblist->clipObj->setCmd($CB); // Execute commands.
239 $dblist->clipObj->cleanCurrent(); // Clean up pad
240 $dblist->clipObj->endClipboard(); // Save the clipboard content
241
242 // This flag will prevent the clipboard panel in being shown.
243 // It is set, if the clickmenu-layer is active AND the extended view is not enabled.
244 $dblist->dontShowClipControlPanels = $CLIENT['FORMSTYLE'] && !$this->MOD_SETTINGS['bigControlPanel'] && $dblist->clipObj->current=='normal' && !$BE_USER->uc['disableCMlayers'] && !$this->modTSconfig['properties']['showClipControlPanelsDespiteOfCMlayers'];
245
246
247
248 // If there is access to the page, then render the list contents and set up the document template object:
249 if ($access) {
250
251 // Deleting records...:
252 // Has not to do with the clipboard but is simply the delete action. The clipboard object is used to clean up the submitted entries to only the selected table.
253 if ($this->cmd=='delete') {
254 $items = $dblist->clipObj->cleanUpCBC(t3lib_div::_POST('CBC'),$this->cmd_table,1);
255 if (count($items)) {
256 $cmd=array();
257 reset($items);
258 while(list($iK)=each($items)) {
259 $iKParts = explode('|',$iK);
260 $cmd[$iKParts[0]][$iKParts[1]]['delete']=1;
261 }
262 $tce = t3lib_div::makeInstance('t3lib_TCEmain');
263 $tce->stripslashes_values=0;
264 $tce->start(array(),$cmd);
265 $tce->process_cmdmap();
266
267 if (isset($cmd['pages'])) {
268 t3lib_BEfunc::getSetUpdateSignal('updatePageTree');
269 }
270
271 $tce->printLogErrorMessages(t3lib_div::getIndpEnv('REQUEST_URI'));
272 }
273 }
274
275 // Initialize the listing object, dblist, for rendering the list:
276 $this->pointer = t3lib_div::intInRange($this->pointer,0,100000);
277 $dblist->start($this->id,$this->table,$this->pointer,$this->search_field,$this->search_levels,$this->showLimit);
278 $dblist->setDispFields();
279
280 // Render the page header:
281 $dblist->writeTop($this->pageinfo);
282
283 // Render versioning selector:
284 $dblist->HTMLcode.= $this->doc->getVersionSelector($this->id);
285
286 // Render the list of tables:
287 $dblist->generateList();
288
289 // Write the bottom of the page:
290 $dblist->writeBottom();
291
292 // Add JavaScript functions to the page:
293 $this->doc->JScode=$this->doc->wrapScriptTags('
294 function jumpToUrl(URL) { //
295 window.location.href = URL;
296 return false;
297 }
298 function jumpExt(URL,anchor) { //
299 var anc = anchor?anchor:"";
300 window.location.href = URL+(T3_THIS_LOCATION?"&returnUrl="+T3_THIS_LOCATION:"")+anc;
301 return false;
302 }
303 function jumpSelf(URL) { //
304 window.location.href = URL+(T3_RETURN_URL?"&returnUrl="+T3_RETURN_URL:"");
305 return false;
306 }
307
308 function setHighlight(id) { //
309 top.fsMod.recentIds["web"]=id;
310 top.fsMod.navFrameHighlightedID["web"]="pages"+id+"_"+top.fsMod.currentBank; // For highlighting
311
312 if (top.content && top.content.nav_frame && top.content.nav_frame.refresh_nav) {
313 top.content.nav_frame.refresh_nav();
314 }
315 }
316 '.$this->doc->redirectUrls($dblist->listURL()).'
317 '.$dblist->CBfunctions().'
318 function editRecords(table,idList,addParams,CBflag) { //
319 window.location.href="'.$BACK_PATH.'alt_doc.php?returnUrl='.rawurlencode(t3lib_div::getIndpEnv('REQUEST_URI')).
320 '&edit["+table+"]["+idList+"]=edit"+addParams;
321 }
322 function editList(table,idList) { //
323 var list="";
324
325 // Checking how many is checked, how many is not
326 var pointer=0;
327 var pos = idList.indexOf(",");
328 while (pos!=-1) {
329 if (cbValue(table+"|"+idList.substr(pointer,pos-pointer))) {
330 list+=idList.substr(pointer,pos-pointer)+",";
331 }
332 pointer=pos+1;
333 pos = idList.indexOf(",",pointer);
334 }
335 if (cbValue(table+"|"+idList.substr(pointer))) {
336 list+=idList.substr(pointer)+",";
337 }
338
339 return list ? list : idList;
340 }
341
342 if (top.fsMod) top.fsMod.recentIds["web"] = '.intval($this->id).';
343 ');
344
345 // Setting up the context sensitive menu:
346 $CMparts=$this->doc->getContextMenuCode();
347 $this->doc->bodyTagAdditions = $CMparts[1];
348 $this->doc->JScode.=$CMparts[0];
349 $this->doc->postCode.= $CMparts[2];
350 } // access
351
352
353
354 // Begin to compile the whole page, starting out with page header:
355 $this->content='';
356 $this->content.=$this->doc->startPage('DB list');
357 $this->content.= '<form action="'.htmlspecialchars($dblist->listURL()).'" method="post" name="dblistForm">';
358
359 // List Module CSH:
360 if (!strlen($this->id)) {
361 $this->content.= t3lib_BEfunc::cshItem('xMOD_csh_corebe', 'list_module_noId', $GLOBALS['BACK_PATH'],'<br/>|');
362 } elseif (!$this->id) { // zero...:
363 $this->content.= t3lib_BEfunc::cshItem('xMOD_csh_corebe', 'list_module_root', $GLOBALS['BACK_PATH'],'<br/>|');
364 }
365
366 // Add listing HTML code:
367 $this->content.= $dblist->HTMLcode;
368 $this->content.= '<input type="hidden" name="cmd_table" /><input type="hidden" name="cmd" /></form>';
369
370 // List Module CSH:
371 if ($this->id) {
372 $this->content.= t3lib_BEfunc::cshItem('xMOD_csh_corebe', 'list_module', $GLOBALS['BACK_PATH'],'<br/>|');
373 }
374
375
376 // If a listing was produced, create the page footer with search form etc:
377 if ($dblist->HTMLcode) {
378
379 // Making field select box (when extended view for a single table is enabled):
380 if ($dblist->table) {
381 $this->content.=$dblist->fieldSelectBox($dblist->table);
382 }
383
384 // Adding checkbox options for extended listing and clipboard display:
385 $this->content.='
386
387 <!--
388 Listing options for clipboard and thumbnails
389 -->
390 <div id="typo3-listOptions">
391 <form action="" method="post">';
392
393 $this->content.=t3lib_BEfunc::getFuncCheck($this->id,'SET[bigControlPanel]',$this->MOD_SETTINGS['bigControlPanel'],'db_list.php',($this->table?'&table='.$this->table:'')).' '.$LANG->getLL('largeControl',1).'<br />';
394 if ($dblist->showClipboard) {
395 $this->content.=t3lib_BEfunc::getFuncCheck($this->id,'SET[clipBoard]',$this->MOD_SETTINGS['clipBoard'],'db_list.php',($this->table?'&table='.$this->table:'')).' '.$LANG->getLL('showClipBoard',1).'<br />';
396 }
397 $this->content.=t3lib_BEfunc::getFuncCheck($this->id,'SET[localization]',$this->MOD_SETTINGS['localization'],'db_list.php',($this->table?'&table='.$this->table:'')).' '.$LANG->getLL('localization',1).'<br />';
398 $this->content.='
399 </form>
400 </div>';
401 $this->content.= t3lib_BEfunc::cshItem('xMOD_csh_corebe', 'list_options', $GLOBALS['BACK_PATH']);
402
403 // Printing clipboard if enabled:
404 if ($this->MOD_SETTINGS['clipBoard'] && $dblist->showClipboard) {
405 $this->content.= $dblist->clipObj->printClipboard();
406 $this->content.= t3lib_BEfunc::cshItem('xMOD_csh_corebe', 'list_clipboard', $GLOBALS['BACK_PATH']);
407 }
408
409 // Link for creating new records:
410 if (!$this->modTSconfig['properties']['noCreateRecordsLink']) {
411 $this->content.='
412
413 <!--
414 Link for creating a new record:
415 -->
416 <div id="typo3-newRecordLink">
417 <a href="'.htmlspecialchars('db_new.php?id='.$this->id.'&returnUrl='.rawurlencode(t3lib_div::getIndpEnv('REQUEST_URI'))).'">'.
418 '<img'.t3lib_iconWorks::skinImg($this->doc->backPath,'gfx/new_el.gif','width="11" height="12"').' alt="" />'.
419 $LANG->getLL('newRecordGeneral',1).
420 '</a>
421 </div>';
422 }
423
424 // Search box:
425 $this->content.=$dblist->getSearchBox();
426
427 // Display sys-notes, if any are found:
428 $this->content.=$dblist->showSysNotesForPage();
429
430 // ShortCut:
431 if ($BE_USER->mayMakeShortcut()) {
432 $this->content.='<br/>'.$this->doc->makeShortcutIcon('id,imagemode,pointer,table,search_field,search_levels,showLimit,sortField,sortRev',implode(',',array_keys($this->MOD_MENU)),$this->MCONF['name']);
433 }
434 }
435
436 // Finally, close off the page:
437 $this->content.= $this->doc->endPage();
438 }
439
440 /**
441 * Outputting the accumulated content to screen
442 *
443 * @return void
444 */
445 function printContent() {
446 echo $this->content;
447 }
448 }
449
450 // Include extension?
451 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['typo3/db_list.php']) {
452 include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['typo3/db_list.php']);
453 }
454
455
456
457
458
459
460
461
462
463
464
465
466 // Make instance:
467 $SOBE = t3lib_div::makeInstance('SC_db_list');
468 $SOBE->init();
469
470 // Include files?
471 foreach($SOBE->include_once as $INC_FILE) include_once($INC_FILE);
472
473 $SOBE->clearCache();
474 $SOBE->main();
475 $SOBE->printContent();
476 ?>