[BUGFIX] sysext recycler: Typo in language label
[Packages/TYPO3.CMS.git] / typo3 / show_item.php
1 <?php
2 /***************************************************************
3 * Copyright notice
4 *
5 * (c) 1999-2011 Kasper Skårhøj (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 * Shows information about a database or file item
29 *
30 * Revised for TYPO3 3.7 May/2004 by Kasper Skårhøj
31 *
32 * @author Kasper Skårhøj <kasperYYYY@typo3.com>
33 */
34 /**
35 * [CLASS/FUNCTION INDEX of SCRIPT]
36 *
37 *
38 *
39 * 84: class transferData extends t3lib_transferData
40 * 101: function regItem($table, $id, $field, $content)
41 *
42 *
43 * 135: class SC_show_item
44 * 160: function init()
45 * 225: function main()
46 * 273: function renderDBInfo()
47 * 327: function renderFileInfo($returnLinkTag)
48 * 449: function printContent()
49 * 462: function makeRef($table,$ref)
50 * 524: function makeRefFrom($table,$ref)
51 *
52 * TOTAL FUNCTIONS: 8
53 * (This index is automatically created/updated by the extension "extdeveval")
54 *
55 */
56
57
58 $BACK_PATH = '';
59 require($BACK_PATH.'init.php');
60 require($BACK_PATH.'template.php');
61
62
63
64
65
66
67
68
69
70
71
72
73 /**
74 * Extension of transfer data class
75 *
76 * @author Kasper Skårhøj <kasperYYYY@typo3.com>
77 * @package TYPO3
78 * @subpackage core
79 */
80 class transferData extends t3lib_transferData {
81
82 var $formname = 'loadform';
83 var $loading = 1;
84
85 // Extra for show_item.php:
86 var $theRecord = Array();
87
88 /**
89 * Register item function.
90 *
91 * @param string Table name
92 * @param integer Record uid
93 * @param string Field name
94 * @param string Content string.
95 * @return void
96 */
97 function regItem($table, $id, $field, $content) {
98 t3lib_div::loadTCA($table);
99 $config = $GLOBALS['TCA'][$table]['columns'][$field]['config'];
100 switch($config['type']) {
101 case 'input':
102 if (isset($config['checkbox']) && $content == $config['checkbox']) {
103 $content = '';
104 break;
105 }
106 if (t3lib_div::inList($config['eval'],'date')) {
107 $content = Date($GLOBALS['TYPO3_CONF_VARS']['SYS']['ddmmyy'], $content);
108 }
109 break;
110 case 'group':
111 break;
112 case 'select':
113 break;
114 }
115 $this->theRecord[$field]=$content;
116 }
117 }
118
119
120
121
122
123
124
125
126
127
128
129 /**
130 * Script Class for showing information about an item.
131 *
132 * @author Kasper Skårhøj <kasperYYYY@typo3.com>
133 * @package TYPO3
134 * @subpackage core
135 */
136 class SC_show_item {
137
138 // GET vars:
139 var $table; // Record table (or filename)
140 var $uid; // Record uid (or '' when filename)
141
142 // Internal, static:
143 var $perms_clause; // Page select clause
144 var $access; // If TRUE, access to element is granted
145 var $type; // Which type of element: "file" or "db"
146 var $doc; // Document Template Object
147
148 // Internal, dynamic:
149 var $content; // Content Accumulation
150 var $file; // For type "file": Filename
151 var $pageinfo; // For type "db": Set to page record of the parent page of the item set (if type="db")
152 var $row; // For type "db": The database record row.
153
154
155 /**
156 * Initialization of the class
157 * Will determine if table/uid GET vars are database record or a file and if the user has access to view information about the item.
158 *
159 * @return void
160 */
161 function init() {
162 global $BACK_PATH;
163
164 // Setting input variables.
165 $this->table = t3lib_div::_GET('table');
166 $this->uid = t3lib_div::_GET('uid');
167
168 // Initialize:
169 $this->perms_clause = $GLOBALS['BE_USER']->getPagePermsClause(1);
170 $this->access = 0; // Set to TRUE if there is access to the record / file.
171 $this->type = ''; // Sets the type, "db" or "file". If blank, nothing can be shown.
172
173 // Checking if the $table value is really a table and if the user has access to it.
174 if (isset($GLOBALS['TCA'][$this->table])) {
175 t3lib_div::loadTCA($this->table);
176 $this->type = 'db';
177 $this->uid = intval($this->uid);
178
179 // Check permissions and uid value:
180 if ($this->uid && $GLOBALS['BE_USER']->check('tables_select',$this->table)) {
181 if ((string)$this->table=='pages') {
182 $this->pageinfo = t3lib_BEfunc::readPageAccess($this->uid,$this->perms_clause);
183 $this->access = is_array($this->pageinfo) ? 1 : 0;
184 $this->row = $this->pageinfo;
185 } else {
186 $this->row = t3lib_BEfunc::getRecordWSOL($this->table, $this->uid);
187 if ($this->row) {
188 $this->pageinfo = t3lib_BEfunc::readPageAccess($this->row['pid'],$this->perms_clause);
189 $this->access = is_array($this->pageinfo) ? 1 : 0;
190 }
191 }
192
193 $treatData = t3lib_div::makeInstance('t3lib_transferData');
194 $treatData->renderRecord($this->table, $this->uid, 0, $this->row);
195 $cRow = $treatData->theRecord;
196 }
197 } else {
198 // if the filereference $this->file is relative, we correct the path
199 if (substr($this->table,0,3)=='../') {
200 $this->file = PATH_site.preg_replace('/^\.\.\//','',$this->table);
201 } else {
202 $this->file = $this->table;
203 }
204 if (@is_file($this->file) && t3lib_div::isAllowedAbsPath($this->file)) {
205 $this->type = 'file';
206 $this->access = 1;
207 }
208 }
209
210 // Initialize document template object:
211 $this->doc = t3lib_div::makeInstance('template');
212 $this->doc->backPath = $BACK_PATH;
213
214 // Starting the page by creating page header stuff:
215 $this->content.=$this->doc->startPage($GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:show_item.php.viewItem'));
216 $this->content.='<h3 class="t3-row-header">' . $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:show_item.php.viewItem') . '</h3>';
217 $this->content.=$this->doc->spacer(5);
218 }
219
220 /**
221 * Main function. Will generate the information to display for the item set internally.
222 *
223 * @return void
224 */
225 function main() {
226
227 if ($this->access) {
228 $returnLink = t3lib_div::sanitizeLocalUrl(t3lib_div::_GP('returnUrl'));
229 $returnLinkTag = $returnLink ? '<a href="' . $returnLink . '" class="typo3-goBack">' : '<a href="#" onclick="window.close();">';
230
231 // render type by user func
232 $typeRendered = FALSE;
233 if (is_array ($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['typo3/show_item.php']['typeRendering'])) {
234 foreach ($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['typo3/show_item.php']['typeRendering'] as $classRef) {
235 $typeRenderObj = t3lib_div::getUserObj($classRef);
236 if(is_object($typeRenderObj) && method_exists($typeRenderObj, 'isValid') && method_exists($typeRenderObj, 'render')) {
237 if ($typeRenderObj->isValid($this->type, $this)) {
238 $this->content .= $typeRenderObj->render($this->type, $this);
239 $typeRendered = TRUE;
240 break;
241 }
242 }
243 }
244 }
245
246 // if type was not rendered use default rendering functions
247 if(!$typeRendered) {
248 // Branch out based on type:
249 switch($this->type) {
250 case 'db':
251 $this->renderDBInfo();
252 break;
253 case 'file':
254 $this->renderFileInfo($returnLinkTag);
255 break;
256 }
257 }
258
259 // If return Url is set, output link to go back:
260 if (t3lib_div::sanitizeLocalUrl(t3lib_div::_GP('returnUrl'))) {
261 $this->content = $this->doc->section('',$returnLinkTag.'<strong>'.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:labels.goBack',1).'</strong></a><br /><br />').$this->content;
262
263 $this->content .= $this->doc->section('','<br />'.$returnLinkTag.'<strong>'.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:labels.goBack',1).'</strong></a>');
264 }
265 }
266 }
267
268 /**
269 * Main function. Will generate the information to display for the item set internally.
270 *
271 * @return void
272 */
273 function renderDBInfo() {
274
275 // Print header, path etc:
276 $code = $this->doc->getHeader($this->table,$this->row,$this->pageinfo['_thePath'],1).'<br />';
277 $this->content.= $this->doc->section('',$code);
278
279 // Initialize variables:
280 $tableRows = Array();
281 $i = 0;
282
283 // Traverse the list of fields to display for the record:
284 $fieldList = t3lib_div::trimExplode(',', $GLOBALS['TCA'][$this->table]['interface']['showRecordFieldList'], 1);
285 foreach ($fieldList as $name) {
286 $name = trim($name);
287 if ($GLOBALS['TCA'][$this->table]['columns'][$name]) {
288 if (!$GLOBALS['TCA'][$this->table]['columns'][$name]['exclude'] || $GLOBALS['BE_USER']->check('non_exclude_fields', $this->table . ':' . $name)) {
289 $i++;
290 $tableRows[] = '
291 <tr>
292 <td class="t3-col-header">' . $GLOBALS['LANG']->sL(t3lib_BEfunc::getItemLabel($this->table, $name), 1) . '</td>
293 <td>' . htmlspecialchars(t3lib_BEfunc::getProcessedValue($this->table, $name, $this->row[$name], 0, 0, FALSE, $this->row['uid'])) . '</td>
294 </tr>';
295 }
296 }
297 }
298
299 // Create table from the information:
300 $tableCode = '
301 <table border="0" cellpadding="0" cellspacing="0" id="typo3-showitem" class="t3-table-info">
302 '.implode('',$tableRows).'
303 </table>';
304 $this->content.=$this->doc->section('',$tableCode);
305
306 // Add path and table information in the bottom:
307 $code = '';
308 $code .= $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:labels.path') . ': ' . t3lib_div::fixed_lgd_cs($this->pageinfo['_thePath'], -48) . '<br />';
309 $code .= $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:labels.table') . ': ' . $GLOBALS['LANG']->sL($GLOBALS['TCA'][$this->table]['ctrl']['title']) . ' (' . $this->table . ') - UID: ' . $this->uid . '<br />';
310 $this->content.= $this->doc->section('', $code);
311
312 // References:
313 $this->content.= $this->doc->section($GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:show_item.php.referencesToThisItem'),$this->makeRef($this->table,$this->row['uid']));
314
315 // References:
316 $this->content.= $this->doc->section($GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:show_item.php.referencesFromThisItem'),$this->makeRefFrom($this->table,$this->row['uid']));
317 }
318
319 /**
320 * Main function. Will generate the information to display for the item set internally.
321 *
322 * @param string <a> tag closing/returning.
323 * @return void
324 */
325 function renderFileInfo($returnLinkTag) {
326
327 // Initialize object to work on the image:
328 $imgObj = t3lib_div::makeInstance('t3lib_stdGraphic');
329 $imgObj->init();
330 $imgObj->mayScaleUp = 0;
331 $imgObj->absPrefix = PATH_site;
332
333 // Read Image Dimensions (returns FALSE if file was not an image type, otherwise dimensions in an array)
334 $imgInfo = '';
335 $imgInfo = $imgObj->getImageDimensions($this->file);
336
337 // File information
338 $fI = t3lib_div::split_fileref($this->file);
339 $ext = $fI['fileext'];
340
341 $code = '';
342
343 // Setting header:
344 $fileName = t3lib_iconWorks::getSpriteIconForFile($ext) . '<strong>' . $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:show_item.php.file', TRUE) . ':</strong> ' . $fI['file'];
345 if (t3lib_div::isFirstPartOfStr($this->file,PATH_site)) {
346 $code.= '<a href="../'.substr($this->file,strlen(PATH_site)).'" target="_blank">'.$fileName.'</a>';
347 } else {
348 $code.= $fileName;
349 }
350 $code.=' &nbsp;&nbsp;<strong>'.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:show_item.php.filesize').':</strong> '.t3lib_div::formatSize(@filesize($this->file)).'<br />
351 ';
352 if (is_array($imgInfo)) {
353 $code.= '<strong>'.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:show_item.php.dimensions').':</strong> '.$imgInfo[0].'x'.$imgInfo[1].' '.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:show_item.php.pixels');
354 }
355 $this->content.=$this->doc->section('',$code);
356 $this->content.=$this->doc->divider(2);
357
358 // If the file was an image...:
359 if (is_array($imgInfo)) {
360
361 $imgInfo = $imgObj->imageMagickConvert($this->file,'web','346','200m','','','',1);
362 $imgInfo[3] = '../'.substr($imgInfo[3],strlen(PATH_site));
363 $code = '<br />
364 <div align="center">'.$returnLinkTag.$imgObj->imgTag($imgInfo).'</a></div>';
365 $this->content.= $this->doc->section('', $code);
366 } else {
367 $this->content.= $this->doc->spacer(10);
368 $lowerFilename = strtolower($this->file);
369
370 // Archive files:
371 if (TYPO3_OS!='WIN' && !$GLOBALS['TYPO3_CONF_VARS']['BE']['disable_exec_function']) {
372 if ($ext=='zip') {
373 $code = '';
374 $t = array();
375 t3lib_utility_Command::exec('unzip -l ' . $this->file, $t);
376 if (is_array($t)) {
377 reset($t);
378 next($t);
379 next($t);
380 next($t);
381 while(list(,$val)=each($t)) {
382 $parts = explode(' ',trim($val),7);
383 $code.= '
384 '.$parts[6].'<br />';
385 }
386 $code = '
387 <span class="nobr">'.$code.'
388 </span>
389 <br /><br />';
390 }
391 $this->content.= $this->doc->section('', $code);
392 } elseif($ext=='tar' || $ext=='tgz' || substr($lowerFilename,-6)=='tar.gz' || substr($lowerFilename,-5)=='tar.z') {
393 $code = '';
394 if ($ext=='tar') {
395 $compr = '';
396 } else {
397 $compr = 'z';
398 }
399 $t = array();
400 t3lib_utility_Command::exec('tar t' . $compr . 'f ' . $this->file, $t);
401 if (is_array($t)) {
402 foreach($t as $val) {
403 $code.='
404 '.$val.'<br />';
405 }
406
407 $code.='
408 -------<br/>
409 '.count($t).' '.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:show_item.php.files');
410
411 $code = '
412 <span class="nobr">'.$code.'
413 </span>
414 <br /><br />';
415 }
416 $this->content.= $this->doc->section('',$code);
417 }
418 } elseif ($GLOBALS['TYPO3_CONF_VARS']['BE']['disable_exec_function']) {
419 $this->content.= $this->doc->section('',$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:show_item.php.cannotDisplayArchive'));
420 }
421
422 // Font files:
423 if ($ext=='ttf') {
424 $thumbScript = 'thumbs.php';
425 $check = basename($this->file).':'.filemtime($this->file).':'.$GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey'];
426 $params = '&file='.rawurlencode($this->file);
427 $params.= '&md5sum='.t3lib_div::shortMD5($check);
428 $url = $thumbScript.'?&dummy='.$GLOBALS['EXEC_TIME'].$params;
429 $thumb = '<br />
430 <div align="center">'.$returnLinkTag.'<img src="'.htmlspecialchars($url).'" border="0" title="'.htmlspecialchars(trim($this->file)).'" alt="" /></a></div>';
431 $this->content.= $this->doc->section('',$thumb);
432 }
433 }
434
435
436 // References:
437 $this->content.= $this->doc->section($GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:show_item.php.referencesToThisItem'),$this->makeRef('_FILE',$this->file));
438 }
439
440 /**
441 * End page and print content
442 *
443 * @return void
444 */
445 function printContent() {
446 $this->content.= $this->doc->endPage();
447 $this->content = $this->doc->insertStylesAndJS($this->content);
448 echo $this->content;
449 }
450
451 /**
452 * Make reference display
453 *
454 * @param string Table name
455 * @param string Filename or uid
456 * @return string HTML
457 */
458 function makeRef($table,$ref) {
459
460 if ($table==='_FILE') {
461 // First, fit path to match what is stored in the refindex:
462 $fullIdent = $ref;
463
464 if (t3lib_div::isFirstPartOfStr($fullIdent,PATH_site)) {
465 $fullIdent = substr($fullIdent,strlen(PATH_site));
466 }
467
468 // Look up the path:
469 $rows = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows(
470 '*',
471 'sys_refindex',
472 'ref_table='.$GLOBALS['TYPO3_DB']->fullQuoteStr('_FILE','sys_refindex').
473 ' AND ref_string='.$GLOBALS['TYPO3_DB']->fullQuoteStr($fullIdent,'sys_refindex').
474 ' AND deleted=0'
475 );
476 } else {
477 // Look up the path:
478 $rows = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows(
479 '*',
480 'sys_refindex',
481 'ref_table='.$GLOBALS['TYPO3_DB']->fullQuoteStr($table,'sys_refindex').
482 ' AND ref_uid='.intval($ref).
483 ' AND deleted=0'
484 );
485 }
486
487 // Compile information for title tag:
488 $infoData = array();
489 if (count($rows)) {
490 $infoData[] = '<tr class="t3-row-header">' .
491 '<td>'.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:show_item.php.table').'</td>' .
492 '<td>'.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:show_item.php.uid').'</td>' .
493 '<td>'.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:show_item.php.field').'</td>'.
494 '<td>'.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:show_item.php.flexpointer').'</td>'.
495 '<td>'.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:show_item.php.softrefKey').'</td>'.
496 '<td>'.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:show_item.php.sorting').'</td>'.
497 '</tr>';
498 }
499 foreach($rows as $row) {
500 $infoData[] = '<tr class="bgColor4"">' .
501 '<td>'.$row['tablename'].'</td>' .
502 '<td>'.$row['recuid'].'</td>' .
503 '<td>'.$row['field'].'</td>'.
504 '<td>'.$row['flexpointer'].'</td>'.
505 '<td>'.$row['softref_key'].'</td>'.
506 '<td>'.$row['sorting'].'</td>'.
507 '</tr>';
508 }
509
510 return count($infoData) ? '<table border="0" cellpadding="0" cellspacing="0" class="typo3-dblist">' . implode('', $infoData) . '</table>' : '';
511 }
512
513 /**
514 * Make reference display (what this elements points to)
515 *
516 * @param string Table name
517 * @param string Filename or uid
518 * @return string HTML
519 */
520 function makeRefFrom($table,$ref) {
521
522 // Look up the path:
523 $rows = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows(
524 '*',
525 'sys_refindex',
526 'tablename='.$GLOBALS['TYPO3_DB']->fullQuoteStr($table,'sys_refindex').
527 ' AND recuid='.intval($ref)
528 );
529
530 // Compile information for title tag:
531 $infoData = array();
532 if (count($rows)) {
533 $infoData[] = '<tr class="t3-row-header">' .
534 '<td>'.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:show_item.php.field').'</td>'.
535 '<td>'.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:show_item.php.flexpointer').'</td>'.
536 '<td>'.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:show_item.php.softrefKey').'</td>'.
537 '<td>'.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:show_item.php.sorting').'</td>'.
538 '<td>'.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:show_item.php.refTable').'</td>' .
539 '<td>'.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:show_item.php.refUid').'</td>' .
540 '<td>'.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:show_item.php.refString').'</td>' .
541 '</tr>';
542 }
543 foreach($rows as $row) {
544 $infoData[] = '<tr class="bgColor4"">' .
545 '<td>'.$row['field'].'</td>'.
546 '<td>'.$row['flexpointer'].'</td>'.
547 '<td>'.$row['softref_key'].'</td>'.
548 '<td>'.$row['sorting'].'</td>'.
549 '<td>'.$row['ref_table'].'</td>' .
550 '<td>'.$row['ref_uid'].'</td>' .
551 '<td>'.$row['ref_string'].'</td>' .
552 '</tr>';
553 }
554
555 return count($infoData) ? '<table border="0" cellpadding="0" cellspacing="0" class="typo3-dblist">' . implode('', $infoData) . '</table>' : '';
556 }
557 }
558
559
560 if (defined('TYPO3_MODE') && isset($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS']['typo3/show_item.php'])) {
561 include_once($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS']['typo3/show_item.php']);
562 }
563
564
565
566 // Make instance:
567 $SOBE = t3lib_div::makeInstance('SC_show_item');
568 $SOBE->init();
569 $SOBE->main();
570 $SOBE->printContent();
571
572 ?>