Non-functional changes...
[Packages/TYPO3.CMS.git] / typo3 / class.browse_links.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 * Displays the page/file tree for browsing database records or files.
29 * Used from TCEFORMS an other elements
30 * In other words: This is the ELEMENT BROWSER!
31 *
32 * $Id$
33 * Revised for TYPO3 3.6 November/2003 by Kasper Skaarhoj
34 * XHTML compliant
35 *
36 * @author Kasper Skaarhoj <kasperYYYY@typo3.com>
37 */
38 /**
39 * [CLASS/FUNCTION INDEX of SCRIPT]
40 *
41 *
42 *
43 * 155: class TBE_browser_recordList extends localRecordList
44 * 163: function TBE_browser_recordList ()
45 * 175: function listURL($altId='',$table=-1,$exclList='')
46 * 194: function ext_addP()
47 * 211: function linkWrapItems($table,$uid,$code,$row)
48 * 244: function linkWrapTable($table,$code)
49 *
50 *
51 * 261: class localPageTree extends t3lib_browseTree
52 * 268: function localPageTree()
53 * 284: function wrapTitle($title,$v,$ext_pArrPages='')
54 * 299: function printTree($treeArr='')
55 * 350: function ext_isLinkable($doktype,$uid)
56 * 364: function PM_ATagWrap($icon,$cmd,$bMark='')
57 * 381: function wrapIcon($icon,$row)
58 *
59 *
60 * 400: class rtePageTree extends localPageTree
61 *
62 *
63 * 417: class TBE_PageTree extends localPageTree
64 * 426: function ext_isLinkable($doktype,$uid)
65 * 438: function wrapTitle($title,$v,$ext_pArrPages)
66 *
67 *
68 * 464: class localFolderTree extends t3lib_folderTree
69 * 473: function localFolderTree()
70 * 485: function wrapTitle($title,$v)
71 * 500: function ext_isLinkable($v)
72 * 517: function PM_ATagWrap($icon,$cmd,$bMark='')
73 * 532: function printTree($treeArr='')
74 *
75 *
76 * 599: class rteFolderTree extends localFolderTree
77 *
78 *
79 * 615: class TBE_FolderTree extends localFolderTree
80 * 624: function ext_isLinkable($v)
81 * 637: function wrapTitle($title,$v)
82 *
83 *
84 * 658: class browse_links
85 * 764: function init()
86 * 1034: function processSessionData($data)
87 *
88 * SECTION: Main functions
89 * 1077: function main_rte($wiz=0)
90 * 1379: function main_db()
91 * 1424: function main_file()
92 *
93 * SECTION: Record listing
94 * 1534: function expandPage()
95 * 1615: function TBE_expandPage($tables)
96 *
97 * SECTION: File listing
98 * 1708: function expandFolder($expandFolder=0,$extensionList='')
99 * 1778: function TBE_expandFolder($expandFolder=0,$extensionList='',$noThumbs=0)
100 * 1801: function fileList($files, $folderName='', $noThumbs=0)
101 * 1918: function TBE_dragNDrop($expandFolder=0,$extensionList='')
102 *
103 * SECTION: Miscellaneous functions
104 * 2046: function isWebFolder($folder)
105 * 2057: function checkFolder($folder)
106 * 2070: function barheader($str)
107 * 2087: function getMsgBox($in_msg,$icon='icon_note')
108 * 2111: function printCurrentUrl($str)
109 * 2131: function parseCurUrl($href,$siteUrl)
110 * 2193: function uploadForm($path)
111 * 2247: function createFolder($path)
112 *
113 * TOTAL FUNCTIONS: 39
114 * (This index is automatically created/updated by the extension "extdeveval")
115 *
116 */
117
118 require_once (PATH_t3lib.'class.t3lib_browsetree.php');
119 require_once (PATH_t3lib.'class.t3lib_foldertree.php');
120 require_once (PATH_t3lib.'class.t3lib_stdgraphic.php');
121 require_once (PATH_t3lib.'class.t3lib_basicfilefunc.php');
122
123
124 // Include classes
125 require_once (PATH_t3lib.'class.t3lib_page.php');
126 require_once (PATH_t3lib.'class.t3lib_recordlist.php');
127 require_once (PATH_typo3.'/class.db_list.inc');
128 require_once (PATH_typo3.'/class.db_list_extra.inc');
129 require_once (PATH_t3lib.'/class.t3lib_pagetree.php');
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149 /**
150 * Local version of the record list.
151 *
152 * @author Kasper Skaarhoj <kasperYYYY@typo3.com>
153 * @package TYPO3
154 * @subpackage core
155 */
156 class TBE_browser_recordList extends localRecordList {
157 var $thisScript = 'browse_links.php';
158
159 /**
160 * Initializes the script path
161 *
162 * @return void
163 */
164 function TBE_browser_recordList () {
165 $this->thisScript = t3lib_div::getIndpEnv('SCRIPT_NAME');
166 }
167
168 /**
169 * Creates the URL for links
170 *
171 * @param mixed If not blank string, this is used instead of $this->id as the id value.
172 * @param string If this is "-1" then $this->table is used, otherwise the value of the input variable.
173 * @param string Commalist of fields NOT to pass as parameters (currently "sortField" and "sortRev")
174 * @return string Query-string for URL
175 */
176 function listURL($altId='',$table=-1,$exclList='') {
177 return $this->thisScript.
178 '?id='.(strcmp($altId,'')?$altId:$this->id).
179 '&table='.rawurlencode($table==-1?$this->table:$table).
180 ($this->thumbs?'&imagemode='.$this->thumbs:'').
181 ($this->searchString?'&search_field='.rawurlencode($this->searchString):'').
182 ($this->searchLevels?'&search_levels='.rawurlencode($this->searchLevels):'').
183 ((!$exclList || !t3lib_div::inList($exclList,'sortField')) && $this->sortField?'&sortField='.rawurlencode($this->sortField):'').
184 ((!$exclList || !t3lib_div::inList($exclList,'sortRev')) && $this->sortRev?'&sortRev='.rawurlencode($this->sortRev):'').
185 // extra:
186 $this->ext_addP()
187 ;
188 }
189
190 /**
191 * Returns additional, local GET parameters to include in the links of the record list.
192 *
193 * @return string
194 */
195 function ext_addP() {
196 $str = '&act='.$GLOBALS['SOBE']->browser->act.
197 '&mode='.$GLOBALS['SOBE']->browser->mode.
198 '&expandPage='.$GLOBALS['SOBE']->browser->expandPage.
199 '&bparams='.rawurlencode($GLOBALS['SOBE']->browser->bparams);
200 return $str;
201 }
202
203 /**
204 * Returns the title (based on $code) of a record (from table $table) with the proper link around (that is for "pages"-records a link to the level of that record...)
205 *
206 * @param string Table name
207 * @param integer UID (not used here)
208 * @param string Title string
209 * @param array Records array (from table name)
210 * @return string
211 */
212 function linkWrapItems($table,$uid,$code,$row) {
213 global $TCA, $BACK_PATH;
214
215 if (!$code) {
216 $code = '<i>['.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:labels.no_title',1).']</i>';
217 } else {
218 $code = htmlspecialchars(t3lib_div::fixed_lgd_cs($code,$this->fixedL));
219 }
220
221 $title = t3lib_BEfunc::getRecordTitle($table,$row);
222 $ficon = t3lib_iconWorks::getIcon($table,$row);
223 $aOnClick = "return insertElement('".$table."', '".$row['uid']."', 'db', ".t3lib_div::quoteJSvalue($title).", '', '', '".$ficon."');";
224 $ATag = '<a href="#" onclick="'.$aOnClick.'">';
225 $ATag_alt = substr($ATag,0,-4).',\'\',1);">';
226 $ATag_e = '</a>';
227
228 return $ATag.
229 '<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/plusbullet2.gif','width="18" height="16"').' title="'.$GLOBALS['LANG']->getLL('addToList',1).'" alt="" />'.
230 $ATag_e.
231 $ATag_alt.
232 $code.
233 $ATag_e;
234 }
235
236 /**
237 * Returns the title (based on $code) of a table ($table) without a link
238 *
239 * @param string Table name
240 * @param string Table label
241 * @return string The linked table label
242 */
243 function linkWrapTable($table,$code) {
244 return $code;
245 }
246 }
247
248
249
250
251
252
253 /**
254 * Class which generates the page tree
255 *
256 * @author Kasper Skaarhoj <kasperYYYY@typo3.com>
257 * @package TYPO3
258 * @subpackage core
259 */
260 class localPageTree extends t3lib_browseTree {
261
262 /**
263 * Constructor. Just calling init()
264 *
265 * @return void
266 */
267 function localPageTree() {
268 $this->thisScript = t3lib_div::getIndpEnv('SCRIPT_NAME');
269
270 $this->init();
271
272 $this->clause = ' AND doktype!=255'.$this->clause;
273 }
274
275 /**
276 * Wrapping the title in a link, if applicable.
277 *
278 * @param string Title, (must be ready for output, that means it must be htmlspecialchars()'ed).
279 * @param array The record
280 * @param boolean (Ignore)
281 * @return string Wrapping title string.
282 */
283 function wrapTitle($title,$v,$ext_pArrPages='') {
284 if ($this->ext_isLinkable($v['doktype'],$v['uid'])) {
285 $aOnClick = "return link_typo3Page('".$v['uid']."');";
286 return '<a href="#" onclick="'.htmlspecialchars($aOnClick).'">'.$title.'</a>';
287 } else {
288 return '<span style="color: #666666;">'.$title.'</span>';
289 }
290 }
291
292 /**
293 * Create the page navigation tree in HTML
294 *
295 * @param array Tree array
296 * @return string HTML output.
297 */
298 function printTree($treeArr='') {
299 global $BACK_PATH;
300 $titleLen=intval($GLOBALS['BE_USER']->uc['titleLen']);
301 if (!is_array($treeArr)) $treeArr=$this->tree;
302
303 $out='';
304 $c=0;
305
306 foreach($treeArr as $k => $v) {
307 $c++;
308 $bgColorClass = ($c+1)%2 ? 'bgColor' : 'bgColor-10';
309 if ($GLOBALS['SOBE']->browser->curUrlInfo['act']=='page' && $GLOBALS['SOBE']->browser->curUrlInfo['pageid']==$v['row']['uid'] && $GLOBALS['SOBE']->browser->curUrlInfo['pageid']) {
310 $arrCol='<td><img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/blinkarrow_right.gif','width="5" height="9"').' class="c-blinkArrowR" alt="" /></td>';
311 $bgColorClass='bgColor4';
312 } else {
313 $arrCol='<td></td>';
314 }
315
316 $aOnClick = 'return jumpToUrl(\''.$this->thisScript.'?act='.$GLOBALS['SOBE']->browser->act.'&mode='.$GLOBALS['SOBE']->browser->mode.'&expandPage='.$v['row']['uid'].'\');';
317 $cEbullet = $this->ext_isLinkable($v['row']['doktype'],$v['row']['uid']) ?
318 '<a href="#" onclick="'.htmlspecialchars($aOnClick).'"><img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/ol/arrowbullet.gif','width="18" height="16"').' alt="" /></a>' :
319 '';
320 $out.='
321 <tr class="'.$bgColorClass.'">
322 <td nowrap="nowrap"'.($v['row']['_CSSCLASS'] ? ' class="'.$v['row']['_CSSCLASS'].'"' : '').'>'.
323 $v['HTML'].
324 $this->wrapTitle($this->getTitleStr($v['row'],$titleLen),$v['row'],$this->ext_pArrPages).
325 '</td>'.
326 $arrCol.
327 '<td>'.$cEbullet.'</td>
328 </tr>';
329 }
330 $out='
331
332
333 <!--
334 Navigation Page Tree:
335 -->
336 <table border="0" cellpadding="0" cellspacing="0" id="typo3-tree">
337 '.$out.'
338 </table>';
339 return $out;
340 }
341
342 /**
343 * Returns true if a doktype can be linked.
344 *
345 * @param integer Doktype value to test
346 * @param integer uid to test.
347 * @return boolean
348 */
349 function ext_isLinkable($doktype,$uid) {
350 if ($uid && $doktype<199) {
351 return true;
352 }
353 }
354
355 /**
356 * Wrap the plus/minus icon in a link
357 *
358 * @param string HTML string to wrap, probably an image tag.
359 * @param string Command for 'PM' get var
360 * @param boolean If set, the link will have a anchor point (=$bMark) and a name attribute (=$bMark)
361 * @return string Link-wrapped input string
362 */
363 function PM_ATagWrap($icon,$cmd,$bMark='') {
364 if ($bMark) {
365 $anchor = '#'.$bMark;
366 $name=' name="'.$bMark.'"';
367 }
368 $aOnClick = "return jumpToUrl('".$this->thisScript.'?PM='.$cmd."','".$anchor."');";
369
370 return '<a href="#"'.$name.' onclick="'.htmlspecialchars($aOnClick).'">'.$icon.'</a>';
371 }
372
373 /**
374 * Wrapping the image tag, $icon, for the row, $row
375 *
376 * @param string The image tag for the icon
377 * @param array The row for the current element
378 * @return string The processed icon input value.
379 */
380 function wrapIcon($icon,$row) {
381 return $this->addTagAttributes($icon,' title="id='.$row['uid'].'"');
382 }
383 }
384
385
386
387
388
389
390
391
392 /**
393 * Page tree for the RTE - totally the same, no changes needed. (Just for the sake of beauty - or confusion... :-)
394 *
395 * @author Kasper Skaarhoj <kasperYYYY@typo3.com>
396 * @package TYPO3
397 * @subpackage core
398 */
399 class rtePageTree extends localPageTree {
400 }
401
402
403
404
405
406
407
408
409 /**
410 * For TBE record browser
411 *
412 * @author Kasper Skaarhoj <kasperYYYY@typo3.com>
413 * @package TYPO3
414 * @subpackage core
415 */
416 class TBE_PageTree extends localPageTree {
417
418 /**
419 * Returns true if a doktype can be linked (which is always the case here).
420 *
421 * @param integer Doktype value to test
422 * @param integer uid to test.
423 * @return boolean
424 */
425 function ext_isLinkable($doktype,$uid) {
426 return true;
427 }
428
429 /**
430 * Wrapping the title in a link, if applicable.
431 *
432 * @param string Title, ready for output.
433 * @param array The record
434 * @param boolean If set, pages clicked will return immediately, otherwise reload page.
435 * @return string Wrapping title string.
436 */
437 function wrapTitle($title,$v,$ext_pArrPages) {
438 if ($ext_pArrPages) {
439 $ficon=t3lib_iconWorks::getIcon('pages',$v);
440 $onClick = "return insertElement('pages', '".$v['uid']."', 'db', ".t3lib_div::quoteJSvalue($v['title']).", '', '', '".$ficon."','',1);";
441 } else {
442 $onClick = htmlspecialchars('return jumpToUrl(\''.$this->thisScript.'?act='.$GLOBALS['SOBE']->browser->act.'&mode='.$GLOBALS['SOBE']->browser->mode.'&expandPage='.$v['uid'].'\');');
443 }
444 return '<a href="#" onclick="'.$onClick.'">'.$title.'</a>';
445 }
446 }
447
448
449
450
451
452
453
454
455 /**
456 * Base extension class which generates the folder tree.
457 * Used directly by the RTE.
458 *
459 * @author Kasper Skaarhoj <kasperYYYY@typo3.com>
460 * @package TYPO3
461 * @subpackage core
462 */
463 class localFolderTree extends t3lib_folderTree {
464 var $ext_IconMode=1;
465
466
467 /**
468 * Initializes the script path
469 *
470 * @return void
471 */
472 function localFolderTree() {
473 $this->thisScript = t3lib_div::getIndpEnv('SCRIPT_NAME');
474 $this->t3lib_folderTree();
475 }
476
477 /**
478 * Wrapping the title in a link, if applicable.
479 *
480 * @param string Title, ready for output.
481 * @param array The "record"
482 * @return string Wrapping title string.
483 */
484 function wrapTitle($title,$v) {
485 if ($this->ext_isLinkable($v)) {
486 $aOnClick = 'return jumpToUrl(\''.$this->thisScript.'?act='.$GLOBALS['SOBE']->browser->act.'&mode='.$GLOBALS['SOBE']->browser->mode.'&expandFolder='.rawurlencode($v['path']).'\');';
487 return '<a href="#" onclick="'.htmlspecialchars($aOnClick).'">'.$title.'</a>';
488 } else {
489 return '<span class="typo3-dimmed">'.$title.'</span>';
490 }
491 }
492
493 /**
494 * Returns true if the input "record" contains a folder which can be linked.
495 *
496 * @param array Array with information about the folder element. Contains keys like title, uid, path, _title
497 * @return boolean True is returned if the path is found in the web-part of the server and is NOT a recycler or temp folder
498 */
499 function ext_isLinkable($v) {
500 $webpath=t3lib_BEfunc::getPathType_web_nonweb($v['path']); // Checking, if the input path is a web-path.
501 if (strstr($v['path'],'_recycler_') || strstr($v['path'],'_temp_') || $webpath!='web') {
502 return 0;
503 }
504 return 1;
505 }
506
507 /**
508 * Wrap the plus/minus icon in a link
509 *
510 * @param string HTML string to wrap, probably an image tag.
511 * @param string Command for 'PM' get var
512 * @param boolean If set, the link will have a anchor point (=$bMark) and a name attribute (=$bMark)
513 * @return string Link-wrapped input string
514 * @access private
515 */
516 function PM_ATagWrap($icon,$cmd,$bMark='') {
517 if ($bMark) {
518 $anchor = '#'.$bMark;
519 $name=' name="'.$bMark.'"';
520 }
521 $aOnClick = 'return jumpToUrl(\''.$this->thisScript.'?PM='.$cmd.'\',\''.$anchor.'\');';
522 return '<a href="#"'.$name.' onclick="'.htmlspecialchars($aOnClick).'">'.$icon.'</a>';
523 }
524
525 /**
526 * Create the folder navigation tree in HTML
527 *
528 * @param mixed Input tree array. If not array, then $this->tree is used.
529 * @return string HTML output of the tree.
530 */
531 function printTree($treeArr='') {
532 global $BACK_PATH;
533 $titleLen=intval($GLOBALS['BE_USER']->uc['titleLen']);
534
535 if (!is_array($treeArr)) $treeArr=$this->tree;
536
537 $out='';
538 $c=0;
539
540 // Preparing the current-path string (if found in the listing we will see a red blinking arrow).
541 if (!$GLOBALS['SOBE']->browser->curUrlInfo['value']) {
542 $cmpPath='';
543 } else if (substr(trim($GLOBALS['SOBE']->browser->curUrlInfo['info']),-1)!='/') {
544 $cmpPath=PATH_site.dirname($GLOBALS['SOBE']->browser->curUrlInfo['info']).'/';
545 } else {
546 $cmpPath=PATH_site.$GLOBALS['SOBE']->browser->curUrlInfo['info'];
547 }
548
549 // Traverse rows for the tree and print them into table rows:
550 foreach($treeArr as $k => $v) {
551 $c++;
552 $bgColorClass=($c+1)%2 ? 'bgColor' : 'bgColor-10';
553
554 // Creating blinking arrow, if applicable:
555 if ($GLOBALS['SOBE']->browser->curUrlInfo['act']=='file' && $cmpPath==$v['row']['path']) {
556 $arrCol='<td><img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/blinkarrow_right.gif','width="5" height="9"').' class="c-blinkArrowR" alt="" /></td>';
557 $bgColorClass='bgColor4';
558 } else {
559 $arrCol='<td></td>';
560 }
561 // Create arrow-bullet for file listing (if folder path is linkable):
562 $aOnClick = 'return jumpToUrl(\''.$this->thisScript.'?act='.$GLOBALS['SOBE']->browser->act.'&mode='.$GLOBALS['SOBE']->browser->mode.'&expandFolder='.rawurlencode($v['row']['path']).'\');';
563 $cEbullet = $this->ext_isLinkable($v['row']) ? '<a href="#" onclick="'.htmlspecialchars($aOnClick).'"><img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/ol/arrowbullet.gif','width="18" height="16"').' alt="" /></a>' : '';
564
565 // Put table row with folder together:
566 $out.='
567 <tr class="'.$bgColorClass.'">
568 <td nowrap="nowrap">'.$v['HTML'].$this->wrapTitle(t3lib_div::fixed_lgd_cs($v['row']['title'],$titleLen),$v['row']).'</td>
569 '.$arrCol.'
570 <td>'.$cEbullet.'</td>
571 </tr>';
572 }
573
574 $out='
575
576 <!--
577 Folder tree:
578 -->
579 <table border="0" cellpadding="0" cellspacing="0" id="typo3-tree">
580 '.$out.'
581 </table>';
582 return $out;
583 }
584 }
585
586
587
588
589
590
591 /**
592 * Folder tree for the RTE - totally the same, no changes needed. (Just for the sake of beauty - or confusion... :-)
593 *
594 * @author Kasper Skaarhoj <kasperYYYY@typo3.com>
595 * @package TYPO3
596 * @subpackage core
597 */
598 class rteFolderTree extends localFolderTree {
599 }
600
601
602
603
604
605
606
607 /**
608 * For TBE File Browser
609 *
610 * @author Kasper Skaarhoj <kasperYYYY@typo3.com>
611 * @package TYPO3
612 * @subpackage core
613 */
614 class TBE_FolderTree extends localFolderTree {
615 var $ext_noTempRecyclerDirs=0; // If file-drag mode is set, temp and recycler folders are filtered out.
616
617 /**
618 * Returns true if the input "record" contains a folder which can be linked.
619 *
620 * @param array Array with information about the folder element. Contains keys like title, uid, path, _title
621 * @return boolean True is returned if the path is NOT a recycler or temp folder AND if ->ext_noTempRecyclerDirs is not set.
622 */
623 function ext_isLinkable($v) {
624 if ($this->ext_noTempRecyclerDirs && (substr($v['path'],-7)=='_temp_/' || substr($v['path'],-11)=='_recycler_/')) {
625 return 0;
626 } return 1;
627 }
628
629 /**
630 * Wrapping the title in a link, if applicable.
631 *
632 * @param string Title, ready for output.
633 * @param array The 'record'
634 * @return string Wrapping title string.
635 */
636 function wrapTitle($title,$v) {
637 if ($this->ext_isLinkable($v)) {
638 $aOnClick = 'return jumpToUrl(\''.$this->thisScript.'?act='.$GLOBALS['SOBE']->browser->act.'&mode='.$GLOBALS['SOBE']->browser->mode.'&expandFolder='.rawurlencode($v['path']).'\');';
639 return '<a href="#" onclick="'.htmlspecialchars($aOnClick).'">'.$title.'</a>';
640 } else {
641 return '<span class="typo3-dimmed">'.$title.'</span>';
642 }
643 }
644 }
645
646
647
648
649
650 /**
651 * class for the Element Browser window.
652 *
653 * @author Kasper Skaarhoj <kasperYYYY@typo3.com>
654 * @package TYPO3
655 * @subpackage core
656 */
657 class browse_links {
658
659 // Internal, static:
660 var $siteURL; // Current site URL (Frontend)
661 var $thisScript; // the script to link to
662 var $thisConfig; // RTE specific TSconfig
663 var $setTarget; // Target (RTE specific)
664 var $setTitle; // title (RTE specific)
665 var $doc; // Backend template object
666
667 // GPvars: (Input variables from outside)
668 /**
669 * The mode determines the main kind of output from the element browser.
670 * There are these options for values: rte, db, file, filedrag, wizard.
671 * "rte" will show the link selector for the Rich Text Editor (see main_rte())
672 * "db" will allow you to browse for pages or records in the page tree (for TCEforms, see main_db())
673 * "file"/"filedrag" will allow you to browse for files or folders in the folder mounts (for TCEforms, main_file())
674 * "wizard" will allow you to browse for links (like "rte") which are passed back to TCEforms (see main_rte(1))
675 *
676 * @see main()
677 */
678 var $mode;
679
680 /**
681 * Link selector action.
682 * page,file,url,mail,spec are allowed values.
683 * These are only important with the link selector function and in that case they switch between the various menu options.
684 */
685 var $act;
686
687 /**
688 * When you click a page title/expand icon to see the content of a certain page, this value will contain that value (the ID of the expanded page). If the value is NOT set, then it will be restored from the module session data (see main(), mode="db")
689 */
690 var $expandPage;
691
692 /**
693 * When you click a folder name/expand icon to see the content of a certain file folder, this value will contain that value (the path of the expanded file folder). If the value is NOT set, then it will be restored from the module session data (see main(), mode="file"/"filedrag"). Example value: "/www/htdocs/typo3/32/3dsplm/fileadmin/css/"
694 */
695 var $expandFolder;
696
697
698
699 /**
700 * TYPO3 Element Browser, wizard mode parameters. There is a heap of parameters there, better debug() them out if you need something... :-)
701 */
702 var $P;
703
704 /**
705 * Active with TYPO3 Element Browser: Contains the name of the form field for which this window opens - thus allows us to make references back to the main window in which the form is.
706 * Example value: "data[pages][39][bodytext]|||tt_content|" or "data[tt_content][NEW3fba56fde763d][image]|||gif,jpg,jpeg,tif,bmp,pcx,tga,png,pdf,ai|"
707 *
708 * Values:
709 * 0: form field name reference
710 * 1: old/unused?
711 * 2: old/unused?
712 * 3: allowed types. Eg. "tt_content" or "gif,jpg,jpeg,tif,bmp,pcx,tga,png,pdf,ai"
713 *
714 * $pArr = explode('|',$this->bparams);
715 * $formFieldName = $pArr[0];
716 * $allowedTablesOrFileTypes = $pArr[3];
717 */
718 var $bparams;
719
720 /**
721 * Used with the Rich Text Editor.
722 * Example value: "tt_content:NEW3fba58c969f5c:bodytext:23:text:23:"
723 */
724 var $RTEtsConfigParams;
725
726
727
728
729 /**
730 * Plus/Minus icon value. Used by the tree class to open/close notes on the trees.
731 */
732 var $PM;
733
734 /**
735 * Pointer, used when browsing a long list of records etc.
736 */
737 var $pointer;
738
739
740
741
742 /**
743 * Used with the link selector: Contains the GET input information about the CURRENT link in the RTE/TCEform field. This consists of "href", "target" and "title" keys. This information is passed around in links.
744 */
745 var $curUrlArray;
746
747 /**
748 * Used with the link selector: Contains a processed version of the input values from curUrlInfo. This is splitted into pageid, content element id, label value etc. This is used for the internal processing of that information.
749 */
750 var $curUrlInfo;
751
752
753
754
755
756
757 /**
758 * Constructor:
759 * Initializes a lot of variables, setting JavaScript functions in header etc.
760 *
761 * @return void
762 */
763 function init() {
764 global $BE_USER,$BACK_PATH;
765
766 // Main GPvars:
767 $this->pointer = t3lib_div::_GP('pointer');
768 $this->bparams = t3lib_div::_GP('bparams');
769 $this->P = t3lib_div::_GP('P');
770 $this->RTEtsConfigParams = t3lib_div::_GP('RTEtsConfigParams');
771 $this->expandPage = t3lib_div::_GP('expandPage');
772 $this->expandFolder = t3lib_div::_GP('expandFolder');
773 $this->PM = t3lib_div::_GP('PM');
774
775 // Find "mode"
776 $this->mode=t3lib_div::_GP('mode');
777 if (!$this->mode) {
778 $this->mode='rte';
779 }
780
781 // Site URL
782 $this->siteURL = t3lib_div::getIndpEnv('TYPO3_SITE_URL'); // Current site url
783
784 // the script to link to
785 $this->thisScript = t3lib_div::getIndpEnv('SCRIPT_NAME');
786
787 // CurrentUrl - the current link url must be passed around if it exists
788 if ($this->mode=='wizard') {
789 $currentLinkParts = t3lib_div::trimExplode(' ',$this->P['currentValue']);
790 $this->curUrlArray = array(
791 'target' => $currentLinkParts[1]
792 );
793 $this->curUrlInfo=$this->parseCurUrl($this->siteURL.'?id='.$currentLinkParts[0],$this->siteURL);
794 } else {
795 $this->curUrlArray = t3lib_div::_GP('curUrl');
796 if ($this->curUrlArray['all']) {
797 $this->curUrlArray=t3lib_div::get_tag_attributes($this->curUrlArray['all']);
798 }
799 $this->curUrlInfo=$this->parseCurUrl($this->curUrlArray['href'],$this->siteURL);
800 }
801
802 // Determine nature of current url:
803 $this->act=t3lib_div::_GP('act');
804 if (!$this->act) {
805 $this->act=$this->curUrlInfo['act'];
806 }
807
808 // Rich Text Editor specific configuration:
809 $addPassOnParams='';
810 if ((string)$this->mode=='rte') {
811 $RTEtsConfigParts = explode(':',$this->RTEtsConfigParams);
812 $addPassOnParams.='&RTEtsConfigParams='.rawurlencode($this->RTEtsConfigParams);
813 $RTEsetup = $GLOBALS['BE_USER']->getTSConfig('RTE',t3lib_BEfunc::getPagesTSconfig($RTEtsConfigParts[5]));
814 $this->thisConfig = t3lib_BEfunc::RTEsetup($RTEsetup['properties'],$RTEtsConfigParts[0],$RTEtsConfigParts[2],$RTEtsConfigParts[4]);
815 }
816
817 // Initializing the target value (RTE)
818 $this->setTarget = $this->curUrlArray['target'];
819 if ($this->thisConfig['defaultLinkTarget'] && !isset($this->curUrlArray['target'])) {
820 $this->setTarget=$this->thisConfig['defaultLinkTarget'];
821 }
822
823 // Initializing the title value (RTE)
824 $this->setTitle = $this->curUrlArray['title'];
825
826
827
828 // Creating backend template object:
829 $this->doc = t3lib_div::makeInstance('template');
830 $this->doc->docType= 'xhtml_trans';
831 $this->doc->backPath = $BACK_PATH;
832
833 // BEGIN accumulation of header JavaScript:
834 $JScode = '';
835 $JScode.= '
836 // This JavaScript is primarily for RTE/Link. jumpToUrl is used in the other cases as well...
837 var add_href="'.($this->curUrlArray['href']?'&curUrl[href]='.rawurlencode($this->curUrlArray['href']):'').'";
838 var add_target="'.($this->setTarget?'&curUrl[target]='.rawurlencode($this->setTarget):'').'";
839 var add_title="'.($this->setTitle?'&curUrl[title]='.rawurlencode($this->setTitle):'').'";
840 var add_params="'.($this->bparams?'&bparams='.rawurlencode($this->bparams):'').'";
841
842 var cur_href="'.($this->curUrlArray['href']?$this->curUrlArray['href']:'').'";
843 var cur_target="'.($this->setTarget?$this->setTarget:'').'";
844 var cur_title="'.($this->setTitle?$this->setTitle:'').'";
845
846 function setTarget(target) { //
847 cur_target=target;
848 add_target="&curUrl[target]="+escape(target);
849 }
850 function setTitle(title) { //
851 cur_title=title;
852 add_title="&curUrl[title]="+escape(title);
853 }
854 function setValue(value) { //
855 cur_href=value;
856 add_href="&curUrl[href]="+value;
857 }
858 ';
859
860
861 if ($this->mode=='wizard') { // Functions used, if the link selector is in wizard mode (= TCEforms fields)
862 unset($this->P['fieldChangeFunc']['alert']);
863 reset($this->P['fieldChangeFunc']);
864 $update='';
865 while(list($k,$v)=each($this->P['fieldChangeFunc'])) {
866 $update.= '
867 window.opener.'.$v;
868 }
869
870 $P2=array();
871 $P2['itemName']=$this->P['itemName'];
872 $P2['formName']=$this->P['formName'];
873 $P2['fieldChangeFunc']=$this->P['fieldChangeFunc'];
874 $addPassOnParams.=t3lib_div::implodeArrayForUrl('P',$P2);
875
876 $JScode.='
877 function link_typo3Page(id,anchor) { //
878 updateValueInMainForm(id+(anchor?anchor:"")+" "+cur_target);
879 close();
880 return false;
881 }
882 function link_folder(folder) { //
883 updateValueInMainForm(folder+" "+cur_target);
884 close();
885 return false;
886 }
887 function link_current() { //
888 if (cur_href!="http://" && cur_href!="mailto:") {
889 var setValue = cur_href+" "+cur_target+" "+cur_title;
890 if (setValue.substr(0,7)=="http://") setValue = setValue.substr(7);
891 if (setValue.substr(0,7)=="mailto:") setValue = setValue.substr(7);
892 updateValueInMainForm(setValue);
893 close();
894 }
895 return false;
896 }
897 function checkReference() { //
898 if (window.opener && window.opener.document && window.opener.document.'.$this->P['formName'].' && window.opener.document.'.$this->P['formName'].'["'.$this->P['itemName'].'"] ) {
899 return window.opener.document.'.$this->P['formName'].'["'.$this->P['itemName'].'"];
900 } else {
901 close();
902 }
903 }
904 function updateValueInMainForm(input) { //
905 var field = checkReference();
906 if (field) {
907 field.value = input;
908 '.$update.'
909 }
910 }
911 ';
912 } else { // Functions used, if the link selector is in RTE mode:
913 $JScode.='
914 function link_typo3Page(id,anchor) { //
915 var theLink = \''.$this->siteURL.'?id=\'+id+(anchor?anchor:"");
916 self.parent.parent.renderPopup_addLink(theLink,cur_target,cur_title);
917 return false;
918 }
919 function link_folder(folder) { //
920 var theLink = \''.$this->siteURL.'\'+folder;
921 self.parent.parent.renderPopup_addLink(theLink,cur_target,cur_title);
922 return false;
923 }
924 function link_spec(theLink) { //
925 self.parent.parent.renderPopup_addLink(theLink,cur_target,cur_title);
926 return false;
927 }
928 function link_current() { //
929 if (cur_href!="http://" && cur_href!="mailto:") {
930 self.parent.parent.renderPopup_addLink(cur_href,cur_target,cur_title);
931 }
932 return false;
933 }
934 ';
935 }
936
937 // General "jumpToUrl" function:
938 $JScode.='
939 function jumpToUrl(URL,anchor) { //
940 var add_act = URL.indexOf("act=")==-1 ? "&act='.$this->act.'" : "";
941 var add_mode = URL.indexOf("mode=")==-1 ? "&mode='.$this->mode.'" : "";
942 var theLocation = URL+add_act+add_mode+add_href+add_target+add_title+add_params'.($addPassOnParams?'+"'.$addPassOnParams.'"':'').'+(anchor?anchor:"");
943 window.location.href = theLocation;
944 return false;
945 }
946 ';
947
948
949 // This is JavaScript especially for the TBE Element Browser!
950 $pArr = explode('|',$this->bparams);
951 $formFieldName = 'data['.$pArr[0].']['.$pArr[1].']['.$pArr[2].']';
952 $JScode.='
953 var elRef="";
954 var targetDoc="";
955
956 function launchView(url) { //
957 var thePreviewWindow="";
958 thePreviewWindow = window.open("'.$BACK_PATH.'show_item.php?table="+url,"ShowItem","height=300,width=410,status=0,menubar=0,resizable=0,location=0,directories=0,scrollbars=1,toolbar=0");
959 if (thePreviewWindow && thePreviewWindow.focus) {
960 thePreviewWindow.focus();
961 }
962 }
963 function setReferences() { //
964 if (parent.window.opener
965 && parent.window.opener.content
966 && parent.window.opener.content.document.editform
967 && parent.window.opener.content.document.editform["'.$formFieldName.'"]
968 ) {
969 targetDoc = parent.window.opener.content.document;
970 elRef = targetDoc.editform["'.$formFieldName.'"];
971 return true;
972 } else {
973 return false;
974 }
975 }
976 function insertElement(table, uid, type, filename,fp,filetype,imagefile,action, close) { //
977 if (1=='.($pArr[0]&&!$pArr[1]&&!$pArr[2] ? 1 : 0).') {
978 addElement(filename,table+"_"+uid,fp,close);
979 } else {
980 if (setReferences()) {
981 parent.window.opener.group_change("add","'.$pArr[0].'","'.$pArr[1].'","'.$pArr[2].'",elRef,targetDoc);
982 } else {
983 alert("Error - reference to main window is not set properly!");
984 }
985 if (close) {
986 parent.window.opener.focus();
987 parent.close();
988 }
989 }
990 return false;
991 }
992 function addElement(elName,elValue,altElValue,close) { //
993 if (parent.window.opener && parent.window.opener.setFormValueFromBrowseWin) {
994 parent.window.opener.setFormValueFromBrowseWin("'.$pArr[0].'",altElValue?altElValue:elValue,elName);
995 if (close) {
996 parent.window.opener.focus();
997 parent.close();
998 }
999 } else {
1000 alert("Error - reference to main window is not set properly!");
1001 parent.close();
1002 }
1003 }
1004 ';
1005
1006 // Finally, add the accumulated JavaScript to the template object:
1007 $this->doc->JScode = $this->doc->wrapScriptTags($JScode);
1008
1009 // Debugging:
1010 if (FALSE) debug(array(
1011 'pointer' => $this->pointer,
1012 'act' => $this->act,
1013 'mode' => $this->mode,
1014 'curUrlInfo' => $this->curUrlInfo,
1015 'curUrlArray' => $this->curUrlArray,
1016 'P' => $this->P,
1017 'bparams' => $this->bparams,
1018 'RTEtsConfigParams' => $this->RTEtsConfigParams,
1019 'expandPage' => $this->expandPage,
1020 'expandFolder' => $this->expandFolder,
1021 'PM' => $this->PM,
1022 ),'Internal variables of Script Class:');
1023 }
1024
1025
1026 /**
1027 * Session data for this class can be set from outside with this method.
1028 * Call after init()
1029 *
1030 * @param array Session data array
1031 * @return array Session data and boolean which indicates that data needs to be stored in session because it's changed
1032 */
1033 function processSessionData($data) {
1034 $store = false;
1035
1036 switch((string)$this->mode) {
1037 case 'db':
1038 if (isset($this->expandPage)) {
1039 $data['expandPage']=$this->expandPage;
1040 $store = true;
1041 } else {
1042 $this->expandPage=$data['expandPage'];
1043 }
1044 break;
1045 case 'file':
1046 case 'filedrag':
1047 if (isset($this->expandFolder)) {
1048 $data['expandFolder']=$this->expandFolder;
1049 $store = true;
1050 } else {
1051 $this->expandFolder=$data['expandFolder'];
1052 }
1053 break;
1054 }
1055
1056 return array($data, $store);
1057 }
1058
1059
1060
1061
1062 /******************************************************************
1063 *
1064 * Main functions
1065 *
1066 ******************************************************************/
1067
1068 /**
1069 * Rich Text Editor (RTE) link selector (MAIN function)
1070 * Generates the link selector for the Rich Text Editor.
1071 * Can also be used to select links for the TCEforms (see $wiz)
1072 *
1073 * @param boolean If set, the "remove link" is not shown in the menu: Used for the "Select link" wizard which is used by the TCEforms
1074 * @return string Modified content variable.
1075 */
1076 function main_rte($wiz=0) {
1077 global $LANG, $BACK_PATH;
1078
1079 // Starting content:
1080 $content=$this->doc->startPage('RTE link');
1081
1082 // Initializing the action value, possibly removing blinded values etc:
1083 $allowedItems = array_diff(explode(',','page,file,url,mail,spec'),t3lib_div::trimExplode(',',$this->thisConfig['blindLinkOptions'],1));
1084 reset($allowedItems);
1085 if (!in_array($this->act,$allowedItems)) $this->act = current($allowedItems);
1086
1087 // Making menu in top:
1088 $menuDef = array();
1089 if (!$wiz) {
1090 $menuDef['removeLink']['isActive'] = $this->act=='removeLink';
1091 $menuDef['removeLink']['label'] = $LANG->getLL('removeLink',1);
1092 $menuDef['removeLink']['url'] = '#';
1093 $menuDef['removeLink']['addParams'] = 'onclick="self.parent.parent.renderPopup_unLink();return false;"';
1094 }
1095 if (in_array('page',$allowedItems)) {
1096 $menuDef['page']['isActive'] = $this->act=='page';
1097 $menuDef['page']['label'] = $LANG->getLL('page',1);
1098 $menuDef['page']['url'] = '#';
1099 $menuDef['page']['addParams'] = 'onclick="jumpToUrl(\'?act=page\');return false;"';
1100 }
1101 if (in_array('file',$allowedItems)){
1102 $menuDef['file']['isActive'] = $this->act=='file';
1103 $menuDef['file']['label'] = $LANG->getLL('file',1);
1104 $menuDef['file']['url'] = '#';
1105 $menuDef['file']['addParams'] = 'onclick="jumpToUrl(\'?act=file\');return false;"';
1106 }
1107 if (in_array('url',$allowedItems)) {
1108 $menuDef['url']['isActive'] = $this->act=='url';
1109 $menuDef['url']['label'] = $LANG->getLL('extUrl',1);
1110 $menuDef['url']['url'] = '#';
1111 $menuDef['url']['addParams'] = 'onclick="jumpToUrl(\'?act=url\');return false;"';
1112 }
1113 if (in_array('mail',$allowedItems)) {
1114 $menuDef['mail']['isActive'] = $this->act=='mail';
1115 $menuDef['mail']['label'] = $LANG->getLL('email',1);
1116 $menuDef['mail']['url'] = '#';
1117 $menuDef['mail']['addParams'] = 'onclick="jumpToUrl(\'?act=mail\');return false;"';
1118 }
1119 if (is_array($this->thisConfig['userLinks.']) && in_array('spec',$allowedItems)) {
1120 $menuDef['spec']['isActive'] = $this->act=='spec';
1121 $menuDef['spec']['label'] = $LANG->getLL('special',1);
1122 $menuDef['spec']['url'] = '#';
1123 $menuDef['spec']['addParams'] = 'onclick="jumpToUrl(\'?act=spec\');return false;"';
1124 }
1125 $content .= $this->doc->getTabMenuRaw($menuDef);
1126
1127 // Adding the menu and header to the top of page:
1128 $content.=$this->printCurrentUrl($this->curUrlInfo['info']).'<br />';
1129
1130
1131 // Depending on the current action we will create the actual module content for selecting a link:
1132 switch($this->act) {
1133 case 'mail':
1134 $extUrl='
1135
1136 <!--
1137 Enter mail address:
1138 -->
1139 <form action="" name="lurlform" id="lurlform">
1140 <table border="0" cellpadding="2" cellspacing="1" id="typo3-linkMail">
1141 <tr>
1142 <td>'.$GLOBALS['LANG']->getLL('emailAddress',1).':</td>
1143 <td><input type="text" name="lemail"'.$this->doc->formWidth(20).' value="'.htmlspecialchars($this->curUrlInfo['act']=='mail'?$this->curUrlInfo['info']:'').'" /> '.
1144 '<input type="submit" value="'.$GLOBALS['LANG']->getLL('setLink',1).'" onclick="setTarget(\'\');setValue(\'mailto:\'+document.lurlform.lemail.value); return link_current();" /></td>
1145 </tr>
1146 </table>
1147 </form>';
1148 $content.=$extUrl;
1149 break;
1150 case 'url':
1151 $extUrl='
1152
1153 <!--
1154 Enter External URL:
1155 -->
1156 <form action="" name="lurlform" id="lurlform">
1157 <table border="0" cellpadding="2" cellspacing="1" id="typo3-linkURL">
1158 <tr>
1159 <td>URL:</td>
1160 <td><input type="text" name="lurl"'.$this->doc->formWidth(20).' value="'.htmlspecialchars($this->curUrlInfo['act']=='url'?$this->curUrlInfo['info']:'http://').'" /> '.
1161 '<input type="submit" value="'.$GLOBALS['LANG']->getLL('setLink',1).'" onclick="setValue(document.lurlform.lurl.value); return link_current();" /></td>
1162 </tr>
1163 </table>
1164 </form>';
1165 $content.=$extUrl;
1166 break;
1167 case 'file':
1168 $foldertree = t3lib_div::makeInstance('rteFolderTree');
1169 $foldertree->thisScript = $this->thisScript;
1170 $tree=$foldertree->getBrowsableTree();
1171
1172 if (!$this->curUrlInfo['value'] || $this->curUrlInfo['act']!='file') {
1173 $cmpPath='';
1174 } elseif (substr(trim($this->curUrlInfo['info']),-1)!='/') {
1175 $cmpPath=PATH_site.dirname($this->curUrlInfo['info']).'/';
1176 if (!isset($this->expandFolder)) $this->expandFolder = $cmpPath;
1177 } else {
1178 $cmpPath=PATH_site.$this->curUrlInfo['info'];
1179 }
1180
1181 list(,,$specUid) = explode('_',$this->PM);
1182 $files = $this->expandFolder($foldertree->specUIDmap[$specUid]);
1183
1184 $content.= '
1185
1186 <!--
1187 Wrapper table for folder tree / file list:
1188 -->
1189 <table border="0" cellpadding="0" cellspacing="0" id="typo3-linkFiles">
1190 <tr>
1191 <td class="c-wCell" valign="top">'.$this->barheader($GLOBALS['LANG']->getLL('folderTree').':').$tree.'</td>
1192 <td class="c-wCell" valign="top">'.$files.'</td>
1193 </tr>
1194 </table>
1195 ';
1196 break;
1197 case 'spec':
1198 if (is_array($this->thisConfig['userLinks.'])) {
1199 $subcats=array();
1200 $v=$this->thisConfig['userLinks.'];
1201 reset($v);
1202 while(list($k2)=each($v)) {
1203 $k2i = intval($k2);
1204 if (substr($k2,-1)=='.' && is_array($v[$k2i.'.'])) {
1205
1206 // Title:
1207 $title = trim($v[$k2i]);
1208 if (!$title) {
1209 $title=$v[$k2i.'.']['url'];
1210 } else {
1211 $title=$LANG->sL($title);
1212 }
1213 // Description:
1214 $description=$v[$k2i.'.']['description'] ? $LANG->sL($v[$k2i.'.']['description'],1).'<br />' : '';
1215
1216 // URL + onclick event:
1217 $onClickEvent='';
1218 if (isset($v[$k2i.'.']['target'])) $onClickEvent.="setTarget('".$v[$k2i.'.']['target']."');";
1219 $v[$k2i.'.']['url'] = str_replace('###_URL###',$this->siteURL,$v[$k2i.'.']['url']);
1220 if (substr($v[$k2i.'.']['url'],0,7)=='http://' || substr($v[$k2i.'.']['url'],0,7)=='mailto:') {
1221 $onClickEvent.="cur_href=unescape('".rawurlencode($v[$k2i.'.']['url'])."');link_current();";
1222 } else {
1223 $onClickEvent.="link_spec(unescape('".$this->siteURL.rawurlencode($v[$k2i.'.']['url'])."'));";
1224 }
1225
1226 // Link:
1227 $A=array('<a href="#" onclick="'.htmlspecialchars($onClickEvent).'return false;">','</a>');
1228
1229 // Adding link to menu of user defined links:
1230 $subcats[$k2i]='
1231 <tr>
1232 <td class="bgColor4">'.$A[0].'<strong>'.htmlspecialchars($title).($this->curUrlInfo['info']==$v[$k2i.'.']['url']?'<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/blinkarrow_right.gif','width="5" height="9"').' class="c-blinkArrowR" alt="" />':'').'</strong><br />'.$description.$A[1].'</td>
1233 </tr>';
1234 }
1235 }
1236
1237 // Sort by keys:
1238 ksort($subcats);
1239
1240 // Add menu to content:
1241 $content.= '
1242
1243 <!--
1244 Special userdefined menu:
1245 -->
1246 <table border="0" cellpadding="1" cellspacing="1" id="typo3-linkSpecial">
1247 <tr>
1248 <td class="bgColor5" class="c-wCell" valign="top"><strong>'.$LANG->getLL('special',1).'</strong></td>
1249 </tr>
1250 '.implode('',$subcats).'
1251 </table>
1252 ';
1253 }
1254 break;
1255 case 'page':
1256 default:
1257 $pagetree = t3lib_div::makeInstance('rtePageTree');
1258 $pagetree->thisScript = $this->thisScript;
1259 $tree=$pagetree->getBrowsableTree();
1260 $cElements = $this->expandPage();
1261 $content.= '
1262
1263 <!--
1264 Wrapper table for page tree / record list:
1265 -->
1266 <table border="0" cellpadding="0" cellspacing="0" id="typo3-linkPages">
1267 <tr>
1268 <td class="c-wCell" valign="top">'.$this->barheader($GLOBALS['LANG']->getLL('pageTree').':').$tree.'</td>
1269 <td class="c-wCell" valign="top">'.$cElements.'</td>
1270 </tr>
1271 </table>
1272 ';
1273 break;
1274 }
1275
1276 $content .= '
1277
1278
1279
1280 <!--
1281 Selecting title for link:
1282 -->
1283 <form action="" name="ltitleform" id="ltargetform">
1284 <table border="0" cellpadding="2" cellspacing="1" id="typo3-linkTarget">
1285 <tr>
1286 <td>'.$GLOBALS['LANG']->getLL('title',1).'</td>
1287 <td><input type="text" name="ltitle" onchange="setTitle(this.value);" value="'.htmlspecialchars($this->setTitle).'"'.$this->doc->formWidth(10).' /></td>
1288 <td><input type="submit" value="'.$GLOBALS['LANG']->getLL('update',1).'" onclick="return link_current();" /></td>
1289 </tr>
1290 </table>
1291 </form>
1292 ';
1293
1294 // Target:
1295 if ($this->act!='mail') {
1296 $ltarget='
1297
1298
1299
1300 <!--
1301 Selecting target for link:
1302 -->
1303 <form action="" name="ltargetform" id="ltargetform">
1304 <table border="0" cellpadding="2" cellspacing="1" id="typo3-linkTarget">
1305 <tr>
1306 <td>'.$GLOBALS['LANG']->getLL('target',1).':</td>
1307 <td><input type="text" name="ltarget" onchange="setTarget(this.value);" value="'.htmlspecialchars($this->setTarget).'"'.$this->doc->formWidth(10).' /></td>
1308 <td>
1309 <select name="ltarget_type" onchange="setTarget(this.options[this.selectedIndex].value);document.ltargetform.ltarget.value=this.options[this.selectedIndex].value;this.selectedIndex=0;">
1310 <option></option>
1311 <option value="_top">'.$GLOBALS['LANG']->getLL('top',1).'</option>
1312 <option value="_blank">'.$GLOBALS['LANG']->getLL('newWindow',1).'</option>
1313 </select>
1314 </td>
1315 <td>';
1316
1317 if (($this->curUrlInfo['act']=="page" || $this->curUrlInfo['act']=='file') && $this->curUrlArray['href']) {
1318 $ltarget.='
1319 <input type="submit" value="'.$GLOBALS['LANG']->getLL('update',1).'" onclick="return link_current();" />';
1320 }
1321
1322 $selectJS = '
1323 if (document.ltargetform.popup_width.options[document.ltargetform.popup_width.selectedIndex].value>0 && document.ltargetform.popup_height.options[document.ltargetform.popup_height.selectedIndex].value>0) {
1324 document.ltargetform.ltarget.value = document.ltargetform.popup_width.options[document.ltargetform.popup_width.selectedIndex].value+"x"+document.ltargetform.popup_height.options[document.ltargetform.popup_height.selectedIndex].value;
1325 setTarget(document.ltargetform.ltarget.value);
1326 setTitle(document.ltitleform.ltitle.value);
1327 document.ltargetform.popup_width.selectedIndex=0;
1328 document.ltargetform.popup_height.selectedIndex=0;
1329 }
1330 ';
1331
1332 $ltarget.=' </td>
1333 </tr>
1334 <tr>
1335 <td>'.$GLOBALS['LANG']->getLL('target_popUpWindow',1).':</td>
1336 <td colspan="3">
1337 <select name="popup_width" onchange="'.htmlspecialchars($selectJS).'">
1338 <option value="0">'.$GLOBALS['LANG']->getLL('target_popUpWindow_width',1).'</option>
1339 <option value="300">300</option>
1340 <option value="400">400</option>
1341 <option value="500">500</option>
1342 <option value="600">600</option>
1343 <option value="700">700</option>
1344 <option value="800">800</option>
1345 </select>
1346 x
1347 <select name="popup_height" onchange="'.htmlspecialchars($selectJS).'">
1348 <option value="0">'.$GLOBALS['LANG']->getLL('target_popUpWindow_height',1).'</option>
1349 <option value="200">200</option>
1350 <option value="300">300</option>
1351 <option value="400">400</option>
1352 <option value="500">500</option>
1353 <option value="600">600</option>
1354 </select>
1355 </td>
1356 </tr>
1357 </table>
1358 </form>';
1359
1360 // Add "target selector" box to content:
1361 $content.=$ltarget;
1362
1363 // Add some space
1364 $content.='<br /><br />';
1365 }
1366
1367 // End page, return content:
1368 $content.= $this->doc->endPage();
1369 $content = $this->doc->insertStylesAndJS($content);
1370 return $content;
1371 }
1372
1373 /**
1374 * TYPO3 Element Browser: Showing a page tree and allows you to browse for records
1375 *
1376 * @return string HTML content for the module
1377 */
1378 function main_db() {
1379
1380 // Starting content:
1381 $content=$this->doc->startPage('TBE file selector');
1382
1383 // Init variable:
1384 $pArr = explode('|',$this->bparams);
1385
1386 // Making the browsable pagetree:
1387 $pagetree = t3lib_div::makeInstance('TBE_PageTree');
1388 $pagetree->thisScript=$this->thisScript;
1389 $pagetree->ext_pArrPages = !strcmp($pArr[3],'pages')?1:0;
1390 $tree=$pagetree->getBrowsableTree();
1391
1392 // Making the list of elements, if applicable:
1393 $cElements = $this->TBE_expandPage($pArr[3]);
1394
1395 // Putting the things together, side by side:
1396 $content.= '
1397
1398 <!--
1399 Wrapper table for page tree / record list:
1400 -->
1401 <table border="0" cellpadding="0" cellspacing="0" id="typo3-EBrecords">
1402 <tr>
1403 <td class="c-wCell" valign="top">'.$this->barheader($GLOBALS['LANG']->getLL('pageTree').':').$tree.'</td>
1404 <td class="c-wCell" valign="top">'.$cElements.'</td>
1405 </tr>
1406 </table>
1407 ';
1408
1409 // Add some space
1410 $content.='<br /><br />';
1411
1412 // End page, return content:
1413 $content.= $this->doc->endPage();
1414 $content = $this->doc->insertStylesAndJS($content);
1415 return $content;
1416 }
1417
1418 /**
1419 * TYPO3 Element Browser: Showing a folder tree, allowing you to browse for files.
1420 *
1421 * @return string HTML content for the module
1422 */
1423 function main_file() {
1424 global $BE_USER;
1425
1426 // Starting content:
1427 $content.=$this->doc->startPage('TBE file selector');
1428
1429 // Init variable:
1430 $pArr = explode('|',$this->bparams);
1431
1432 // Create upload/create folder forms, if a path is given:
1433 $fileProcessor = t3lib_div::makeInstance('t3lib_basicFileFunctions');
1434 $fileProcessor->init($GLOBALS['FILEMOUNTS'], $GLOBALS['TYPO3_CONF_VARS']['BE']['fileExtensions']);
1435 $path=$this->expandFolder;
1436 if (!$path || !@is_dir($path)) {
1437 $path = $fileProcessor->findTempFolder().'/'; // The closest TEMP-path is found
1438 }
1439 if ($path!='/' && @is_dir($path)) {
1440 $uploadForm=$this->uploadForm($path);
1441 $createFolder=$this->createFolder($path);
1442 } else {
1443 $createFolder='';
1444 $uploadForm='';
1445 }
1446 if ($BE_USER->getTSConfigVal('options.uploadFieldsInTopOfEB')) $content.=$uploadForm;
1447
1448 // Getting flag for showing/not showing thumbnails:
1449 $noThumbs = $GLOBALS['BE_USER']->getTSConfigVal('options.noThumbsInEB');
1450
1451 if (!$noThumbs) {
1452 // MENU-ITEMS, fetching the setting for thumbnails from File>List module:
1453 $_MOD_MENU = array('displayThumbs' => '');
1454 $_MCONF['name']='file_list';
1455 $_MOD_SETTINGS = t3lib_BEfunc::getModuleData($_MOD_MENU, t3lib_div::_GP('SET'), $_MCONF['name']);
1456 $addParams = '&act='.$this->act.'&mode='.$this->mode.'&expandFolder='.rawurlencode($path).'&bparams='.rawurlencode($this->bparams);
1457 $thumbNailCheck = t3lib_BEfunc::getFuncCheck('','SET[displayThumbs]',$_MOD_SETTINGS['displayThumbs'],$this->thisScript,$addParams).' '.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_mod_file_list.php:displayThumbs',1);
1458 } else {
1459 $thumbNailCheck='';
1460 }
1461 $noThumbs = $noThumbs ? $noThumbs : !$_MOD_SETTINGS['displayThumbs'];
1462
1463 // Create folder tree:
1464 $foldertree = t3lib_div::makeInstance('TBE_FolderTree');
1465 $foldertree->thisScript=$this->thisScript;
1466 $foldertree->ext_noTempRecyclerDirs = ($this->mode == 'filedrag');
1467 $tree=$foldertree->getBrowsableTree();
1468
1469 list(,,$specUid) = explode('_',$this->PM);
1470
1471 if ($this->mode=='filedrag') {
1472 $files = $this->TBE_dragNDrop($foldertree->specUIDmap[$specUid],$pArr[3]);
1473 } else {
1474 $files = $this->TBE_expandFolder($foldertree->specUIDmap[$specUid],$pArr[3],$noThumbs);
1475 }
1476
1477 // Putting the parts together, side by side:
1478 $content.= '
1479
1480 <!--
1481 Wrapper table for folder tree / file list:
1482 -->
1483 <table border="0" cellpadding="0" cellspacing="0" id="typo3-EBfiles">
1484 <tr>
1485 <td class="c-wCell" valign="top">'.$this->barheader($GLOBALS['LANG']->getLL('folderTree').':').$tree.'</td>
1486 <td class="c-wCell" valign="top">'.$files.'</td>
1487 </tr>
1488 </table>
1489 ';
1490 $content.= $thumbNailCheck;
1491
1492 // Adding create folder + upload forms if applicable:
1493 if (!$BE_USER->getTSConfigVal('options.uploadFieldsInTopOfEB')) $content.=$uploadForm;
1494 if ($BE_USER->isAdmin() || $BE_USER->getTSConfigVal('options.createFoldersInEB')) $content.=$createFolder;
1495
1496 // Add some space
1497 $content.='<br /><br />';
1498
1499 // Ending page, returning content:
1500 $content.= $this->doc->endPage();
1501 $content = $this->doc->insertStylesAndJS($content);
1502 return $content;
1503 }
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523 /******************************************************************
1524 *
1525 * Record listing
1526 *
1527 ******************************************************************/
1528 /**
1529 * For RTE: This displays all content elements on a page and lets you create a link to the element.
1530 *
1531 * @return string HTML output. Returns content only if the ->expandPage value is set (pointing to a page uid to show tt_content records from ...)
1532 */
1533 function expandPage() {
1534 global $BE_USER, $BACK_PATH;
1535
1536 $out='';
1537 $expPageId = $this->expandPage; // Set page id (if any) to expand
1538
1539 // If there is an anchor value (content element reference) in the element reference, then force an ID to expand:
1540 if (!$this->expandPage && $this->curUrlInfo['cElement']) {
1541 $expPageId = $this->curUrlInfo['pageid']; // Set to the current link page id.
1542 }
1543
1544 // Draw the record list IF there is a page id to expand:
1545 if ($expPageId && t3lib_div::testInt($expPageId) && $BE_USER->isInWebMount($expPageId)) {
1546
1547 // Set header:
1548 $out.=$this->barheader($GLOBALS['LANG']->getLL('contentElements').':');
1549
1550 // Create header for listing, showing the page title/icon:
1551 $titleLen=intval($GLOBALS['BE_USER']->uc['titleLen']);
1552 $mainPageRec = t3lib_BEfunc::getRecordWSOL('pages',$expPageId);
1553 $picon=t3lib_iconWorks::getIconImage('pages',$mainPageRec,'','');
1554 $picon.= htmlspecialchars(t3lib_div::fixed_lgd_cs($mainPageRec['title'],$titleLen));
1555 $out.=$picon.'<br />';
1556
1557 // Look up tt_content elements from the expanded page:
1558 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
1559 'uid,header,hidden,starttime,endtime,fe_group,CType,colpos,bodytext',
1560 'tt_content',
1561 'pid='.intval($expPageId).
1562 t3lib_BEfunc::deleteClause('tt_content').
1563 t3lib_BEfunc::versioningPlaceholderClause('tt_content'),
1564 '',
1565 'colpos,sorting'
1566 );
1567 $cc = $GLOBALS['TYPO3_DB']->sql_num_rows($res);
1568
1569 // Traverse list of records:
1570 $c=0;
1571 while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
1572 $c++;
1573 $icon=t3lib_iconWorks::getIconImage('tt_content',$row,$BACK_PATH,'');
1574 if ($this->curUrlInfo['act']=='page' && $this->curUrlInfo['cElement']==$row['uid']) {
1575 $arrCol='<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/blinkarrow_left.gif','width="5" height="9"').' class="c-blinkArrowL" alt="" />';
1576 } else {
1577 $arrCol='';
1578 }
1579 // Putting list element HTML together:
1580 $out.='<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/ol/join'.($c==$cc?'bottom':'').'.gif','width="18" height="16"').' alt="" />'.
1581 $arrCol.
1582 '<a href="#" onclick="return link_typo3Page(\''.$expPageId.'\',\'#'.$row['uid'].'\');">'.
1583 $icon.
1584 htmlspecialchars(t3lib_div::fixed_lgd_cs($row['header'],$titleLen)).
1585 '</a><br />';
1586
1587 // Finding internal anchor points:
1588 if (t3lib_div::inList('text,textpic', $row['CType'])) {
1589 $split = preg_split('/(<a[^>]+name=[\'"]?([^"\'>[:space:]]+)[\'"]?[^>]*>)/i', $row['bodytext'], -1, PREG_SPLIT_DELIM_CAPTURE);
1590
1591 foreach($split as $skey => $sval) {
1592 if (($skey%3)==2) {
1593 // Putting list element HTML together:
1594 $sval = substr($sval,0,100);
1595 $out.='<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/ol/line.gif','width="18" height="16"').' alt="" />'.
1596 '<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/ol/join'.($skey+3>count($split)?'bottom':'').'.gif','width="18" height="16"').' alt="" />'.
1597 '<a href="#" onclick="return link_typo3Page(\''.$expPageId.'\',\'#'.rawurlencode($sval).'\');">'.
1598 htmlspecialchars(' <A> '.$sval).
1599 '</a><br />';
1600 }
1601 }
1602 }
1603 }
1604 }
1605 return $out;
1606 }
1607
1608 /**
1609 * For TYPO3 Element Browser: This lists all content elements from the given list of tables
1610 *
1611 * @param string Commalist of tables. Set to "*" if you want all tables.
1612 * @return string HTML output.
1613 */
1614 function TBE_expandPage($tables) {
1615 global $TCA,$BE_USER, $BACK_PATH;
1616
1617 $out='';
1618 if ($this->expandPage>=0 && t3lib_div::testInt($this->expandPage) && $BE_USER->isInWebMount($this->expandPage)) {
1619
1620 // Set array with table names to list:
1621 if (!strcmp(trim($tables),'*')) {
1622 $tablesArr = array_keys($TCA);
1623 } else {
1624 $tablesArr = t3lib_div::trimExplode(',',$tables,1);
1625 }
1626 reset($tablesArr);
1627
1628 // Headline for selecting records:
1629 $out.=$this->barheader($GLOBALS['LANG']->getLL('selectRecords').':');
1630
1631 // Create the header, showing the current page for which the listing is. Includes link to the page itself, if pages are amount allowed tables.
1632 $titleLen=intval($GLOBALS['BE_USER']->uc['titleLen']);
1633 $mainPageRec = t3lib_BEfunc::getRecordWSOL('pages',$this->expandPage);
1634 $ATag='';
1635 $ATag_e='';
1636 $ATag2='';
1637 if (in_array('pages',$tablesArr)) {
1638 $ficon=t3lib_iconWorks::getIcon('pages',$mainPageRec);
1639 $ATag="<a href=\"#\" onclick=\"return insertElement('pages', '".$mainPageRec['uid']."', 'db', ".t3lib_div::quoteJSvalue($mainPageRec['title']).", '', '', '".$ficon."','',1);\">";
1640 $ATag2="<a href=\"#\" onclick=\"return insertElement('pages', '".$mainPageRec['uid']."', 'db', ".t3lib_div::quoteJSvalue($mainPageRec['title']).", '', '', '".$ficon."','',0);\">";
1641 $ATag_alt=substr($ATag,0,-4).",'',1);\">";
1642 $ATag_e='</a>';
1643 }
1644 $picon=t3lib_iconWorks::getIconImage('pages',$mainPageRec,$BACK_PATH,'');
1645 $pBicon=$ATag2?'<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/plusbullet2.gif','width="18" height="16"').' alt="" />':'';
1646 $pText=htmlspecialchars(t3lib_div::fixed_lgd_cs($mainPageRec['title'],$titleLen));
1647 $out.=$picon.$ATag2.$pBicon.$ATag_e.$ATag.$pText.$ATag_e.'<br />';
1648
1649 // Initialize the record listing:
1650 $id = $this->expandPage;
1651 $pointer = t3lib_div::intInRange($this->pointer,0,100000);
1652 $perms_clause = $GLOBALS['BE_USER']->getPagePermsClause(1);
1653 $pageinfo = t3lib_BEfunc::readPageAccess($id,$perms_clause);
1654 $table='';
1655
1656 // Generate the record list:
1657 $dblist = t3lib_div::makeInstance('TBE_browser_recordList');
1658 $dblist->thisScript=$this->thisScript;
1659 $dblist->backPath = $GLOBALS['BACK_PATH'];
1660 $dblist->thumbs = 0;
1661 $dblist->calcPerms = $GLOBALS['BE_USER']->calcPerms($pageinfo);
1662 $dblist->noControlPanels=1;
1663 $dblist->clickMenuEnabled=0;
1664 $dblist->tableList=implode(',',$tablesArr);
1665
1666 $dblist->start($id,t3lib_div::_GP('table'),$pointer,
1667 t3lib_div::_GP('search_field'),
1668 t3lib_div::_GP('search_levels'),
1669 t3lib_div::_GP('showLimit')
1670 );
1671 $dblist->setDispFields();
1672 $dblist->generateList();
1673 $dblist->writeBottom();
1674
1675 // Add the HTML for the record list to output variable:
1676 $out.=$dblist->HTMLcode;
1677 $out.=$dblist->getSearchBox();
1678 }
1679
1680 // Return accumulated content:
1681 return $out;
1682 }
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695 /******************************************************************
1696 *
1697 * File listing
1698 *
1699 ******************************************************************/
1700 /**
1701 * For RTE: This displays all files from folder. No thumbnails shown
1702 *
1703 * @param string The folder path to expand
1704 * @param string List of fileextensions to show
1705 * @return string HTML output
1706 */
1707 function expandFolder($expandFolder=0,$extensionList='') {
1708 global $BACK_PATH;
1709
1710 $expandFolder = $expandFolder ? $expandFolder : $this->expandFolder;
1711 $out='';
1712 if ($expandFolder && $this->checkFolder($expandFolder)) {
1713
1714 // Create header for filelisting:
1715 $out.=$this->barheader($GLOBALS['LANG']->getLL('files').':');
1716
1717 // Prepare current path value for comparison (showing red arrow)
1718 if (!$this->curUrlInfo['value']) {
1719 $cmpPath='';
1720 } else {
1721 $cmpPath=PATH_site.$this->curUrlInfo['info'];
1722 }
1723
1724
1725 // Create header element; The folder from which files are listed.
1726 $titleLen=intval($GLOBALS['BE_USER']->uc['titleLen']);
1727 $picon='<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/i/_icon_webfolders.gif','width="18" height="16"').' alt="" />';
1728 $picon.=htmlspecialchars(t3lib_div::fixed_lgd_cs(basename($expandFolder),$titleLen));
1729 $picon='<a href="#" onclick="return link_folder(\''.t3lib_div::rawUrlEncodeFP(substr($expandFolder,strlen(PATH_site))).'\');">'.$picon.'</a>';
1730 $out.=$picon.'<br />';
1731
1732 // Get files from the folder:
1733 $files = t3lib_div::getFilesInDir($expandFolder,$extensionList,1,1); // $extensionList="",$prependPath=0,$order='')
1734 $c=0;
1735 $cc=count($files);
1736
1737 if (is_array($files)) {
1738 foreach($files as $filepath) {
1739 $c++;
1740 $fI=pathinfo($filepath);
1741
1742 // File icon:
1743 $icon = t3lib_BEfunc::getFileIcon(strtolower($fI['extension']));
1744
1745 // If the listed file turns out to be the CURRENT file, then show blinking arrow:
1746 if ($this->curUrlInfo['act']=="file" && $cmpPath==$filepath) {
1747 $arrCol='<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/blinkarrow_left.gif','width="5" height="9"').' class="c-blinkArrowL" alt="" />';
1748 } else {
1749 $arrCol='';
1750 }
1751
1752 // Get size and icon:
1753 $size=' ('.t3lib_div::formatSize(filesize($filepath)).'bytes)';
1754 $icon = '<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/fileicons/'.$icon.'','width="18" height="16"').' title="'.htmlspecialchars($fI['basename'].$size).'" alt="" />';
1755
1756 // Put it all together for the file element:
1757 $out.='<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/ol/join'.($c==$cc?'bottom':'').'.gif','width="18" height="16"').' alt="" />'.
1758 $arrCol.
1759 '<a href="#" onclick="return link_folder(\''.t3lib_div::rawUrlEncodeFP(substr($filepath,strlen(PATH_site))).'\');">'.
1760 $icon.
1761 htmlspecialchars(t3lib_div::fixed_lgd_cs(basename($filepath),$titleLen)).
1762 '</a><br />';
1763 }
1764 }
1765 }
1766 return $out;
1767 }
1768
1769 /**
1770 * For TYPO3 Element Browser: Expand folder of files.
1771 *
1772 * @param string The folder path to expand
1773 * @param string List of fileextensions to show
1774 * @param boolean Whether to show thumbnails or not. If set, no thumbnails are shown.
1775 * @return string HTML output
1776 */
1777 function TBE_expandFolder($expandFolder=0,$extensionList='',$noThumbs=0) {
1778 global $LANG;
1779
1780 $expandFolder = $expandFolder ? $expandFolder : $this->expandFolder;
1781 $out='';
1782 if ($expandFolder && $this->checkFolder($expandFolder)) {
1783 // Listing the files:
1784 $files = t3lib_div::getFilesInDir($expandFolder,$extensionList,1,1); // $extensionList="",$prependPath=0,$order='')
1785 $out.= $this->fileList($files, $expandFolder, $noThumbs);
1786 }
1787
1788 // Return accumulated content for filelisting:
1789 return $out;
1790 }
1791
1792 /**
1793 * Render list of files.
1794 *
1795 * @param array List of files. See t3lib_div::getFilesInDir
1796 * @param string If set a header with a folder icon and folder name are shown
1797 * @param boolean Whether to show thumbnails or not. If set, no thumbnails are shown.
1798 * @return string HTML output
1799 */
1800 function fileList($files, $folderName='', $noThumbs=0) {
1801 global $LANG, $BACK_PATH;
1802
1803 $out='';
1804
1805 // Listing the files:
1806 if (is_array($files)) {
1807
1808 // Create headline (showing number of files):
1809 $out.=$this->barheader(sprintf($GLOBALS['LANG']->getLL('files').' (%s):',count($files)));
1810
1811 $titleLen=intval($GLOBALS['BE_USER']->uc['titleLen']);
1812
1813 // Create the header of current folder:
1814 if($folderName) {
1815 $picon='<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/i/_icon_webfolders.gif','width="18" height="16"').' alt="" />';
1816 $picon.=htmlspecialchars(t3lib_div::fixed_lgd_cs(basename($folderName),$titleLen));
1817 $out.=$picon.'<br />';
1818 }
1819
1820 // Init graphic object for reading file dimensions:
1821 $imgObj = t3lib_div::makeInstance('t3lib_stdGraphic');
1822 $imgObj->init();
1823 $imgObj->mayScaleUp=0;
1824 $imgObj->tempPath=PATH_site.$imgObj->tempPath;
1825
1826 // Traverse the file list:
1827 $lines=array();
1828 foreach($files as $filepath) {
1829 $fI=pathinfo($filepath);
1830
1831 // Thumbnail/size generation:
1832 if (t3lib_div::inList($GLOBALS['TYPO3_CONF_VARS']['GFX']['imagefile_ext'],$fI['extension']) && !$noThumbs) {
1833 $imgInfo = $imgObj->getImageDimensions($filepath);
1834 $pDim = $imgInfo[0].'x'.$imgInfo[1].' pixels';
1835 $clickIcon = t3lib_BEfunc::getThumbNail($BACK_PATH.'thumbs.php',$filepath,'hspace="5" vspace="5" border="1"');
1836 } else {
1837 $clickIcon = '';
1838 $pDim = '';
1839 }
1840
1841 // Create file icon:
1842 $ficon = t3lib_BEfunc::getFileIcon(strtolower($fI['extension']));
1843 $size=' ('.t3lib_div::formatSize(filesize($filepath)).'bytes'.($pDim?', '.$pDim:'').')';
1844 $icon = '<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/fileicons/'.$ficon,'width="18" height="16"').' title="'.htmlspecialchars($fI['basename'].$size).'" class="absmiddle" alt="" />';
1845
1846 // Create links for adding the file:
1847 if (strstr($filepath,',') || strstr($filepath,'|')) { // In case an invalid character is in the filepath, display error message:
1848 $eMsg = $LANG->JScharCode(sprintf($LANG->getLL('invalidChar'),', |'));
1849 $ATag = $ATag_alt = "<a href=\"#\" onclick=\"alert(".$eMsg.");return false;\">";
1850 } else { // If filename is OK, just add it:
1851 $ATag = "<a href=\"#\" onclick=\"return insertElement('','".t3lib_div::shortMD5($filepath)."', 'file', ".t3lib_div::quoteJSvalue($fI['basename']).", ".t3lib_div::quoteJSvalue($filepath).", '".$fI['extension']."', '".$ficon."');\">";
1852 $ATag_alt = substr($ATag,0,-4).",'',1);\">";
1853 }
1854 $ATag_e='</a>';
1855
1856 // Create link to showing details about the file in a window:
1857 $Ahref = $BACK_PATH.'show_item.php?table='.rawurlencode($filepath).'&returnUrl='.rawurlencode(t3lib_div::getIndpEnv('REQUEST_URI'));
1858 $ATag2='<a href="'.htmlspecialchars($Ahref).'">';
1859 $ATag2_e='</a>';
1860
1861 // Combine the stuff:
1862 $filenameAndIcon=$ATag_alt.$icon.htmlspecialchars(t3lib_div::fixed_lgd_cs(basename($filepath),$titleLen)).$ATag_e;
1863
1864 // Show element:
1865 if ($pDim) { // Image...
1866 $lines[]='
1867 <tr class="bgColor4">
1868 <td nowrap="nowrap">'.$filenameAndIcon.'&nbsp;</td>
1869 <td>'.$ATag.'<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/plusbullet2.gif','width="18" height="16"').' title="'.$LANG->getLL('addToList',1).'" alt="" />'.$ATag_e.'</td>
1870 <td nowrap="nowrap">'.($ATag2.'<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/zoom2.gif','width="12" height="12"').' title="'.$LANG->getLL('info',1).'" alt="" /> '.$LANG->getLL('info',1).$ATag2_e).'</td>
1871 <td nowrap="nowrap">&nbsp;'.$pDim.'</td>
1872 </tr>';
1873 $lines[]='
1874 <tr>
1875 <td colspan="4">'.$ATag_alt.$clickIcon.$ATag_e.'</td>
1876 </tr>';
1877 } else {
1878 $lines[]='
1879 <tr class="bgColor4">
1880 <td nowrap="nowrap">'.$filenameAndIcon.'&nbsp;</td>
1881 <td>'.$ATag.'<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/plusbullet2.gif','width="18" height="16"').' title="'.$LANG->getLL('addToList',1).'" alt="" />'.$ATag_e.'</td>
1882 <td nowrap="nowrap">'.($ATag2.'<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/zoom2.gif','width="12" height="12"').' title="'.$LANG->getLL('info',1).'" alt="" /> '.$LANG->getLL('info',1).$ATag2_e).'</td>
1883 <td>&nbsp;</td>
1884 </tr>';
1885 }
1886 $lines[]='
1887 <tr>
1888 <td colspan="3"><img src="clear.gif" width="1" height="3" alt="" /></td>
1889 </tr>';
1890 }
1891
1892 // Wrap all the rows in table tags:
1893 $out.='
1894
1895
1896
1897 <!--
1898 File listing
1899 -->
1900 <table border="0" cellpadding="0" cellspacing="1" id="typo3-fileList">
1901 '.implode('',$lines).'
1902 </table>';
1903 }
1904
1905 // Return accumulated content for filelisting:
1906 return $out;
1907 }
1908
1909 /**
1910 * For RTE: This displays all IMAGES (gif,png,jpg) (from extensionList) from folder. Thumbnails are shown for images.
1911 * This listing is of images located in the web-accessible paths ONLY - the listing is for drag-n-drop use in the RTE
1912 *
1913 * @param string The folder path to expand
1914 * @param string List of fileextensions to show
1915 * @return string HTML output
1916 */
1917 function TBE_dragNDrop($expandFolder=0,$extensionList='') {
1918 global $BACK_PATH;
1919
1920 $expandFolder = $expandFolder ? $expandFolder : $this->expandFolder;
1921 $out='';
1922 if ($expandFolder && $this->checkFolder($expandFolder)) {
1923 if ($this->isWebFolder($expandFolder)) {
1924
1925 // Read files from directory:
1926 $files = t3lib_div::getFilesInDir($expandFolder,$extensionList,1,1); // $extensionList="",$prependPath=0,$order='')
1927 if (is_array($files)) {
1928 $out.=$this->barheader(sprintf($GLOBALS['LANG']->getLL('files').' (%s):',count($files)));
1929
1930 $titleLen=intval($GLOBALS['BE_USER']->uc['titleLen']);
1931 $picon='<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/i/_icon_webfolders.gif','width="18" height="16"').' alt="" />';
1932 $picon.=htmlspecialchars(t3lib_div::fixed_lgd_cs(basename($expandFolder),$titleLen));
1933 $out.=$picon.'<br />';
1934
1935 // Init row-array:
1936 $lines=array();
1937
1938 // Add "drag-n-drop" message:
1939 $lines[]='
1940 <tr>
1941 <td colspan="2">'.$this->getMsgBox($GLOBALS['LANG']->getLL('findDragDrop')).'</td>
1942 </tr>';
1943
1944 // Fraverse files:
1945 while(list(,$filepath)=each($files)) {
1946 $fI=pathinfo($filepath);
1947
1948 // URL of image:
1949 $iurl = $this->siteURL.t3lib_div::rawurlencodeFP(substr($filepath,strlen(PATH_site)));
1950
1951 // Show only web-images
1952 if (t3lib_div::inList('gif,jpeg,jpg,png',$fI['extension'])) {
1953 $imgInfo = @getimagesize($filepath);
1954 $pDim = $imgInfo[0].'x'.$imgInfo[1].' pixels';
1955
1956 $ficon = t3lib_BEfunc::getFileIcon(strtolower($fI['extension']));
1957 $size=' ('.t3lib_div::formatSize(filesize($filepath)).'bytes'.($pDim?', '.$pDim:'').')';
1958 $icon = '<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/fileicons/'.$ficon,'width="18" height="16"').' class="absmiddle" title="'.htmlspecialchars($fI['basename'].$size).'" alt="" />';
1959 $filenameAndIcon=$icon.htmlspecialchars(t3lib_div::fixed_lgd_cs(basename($filepath),$titleLen));
1960
1961 if (t3lib_div::_GP('noLimit')) {
1962 $maxW=10000;
1963 $maxH=10000;
1964 } else {
1965 $maxW=380;
1966 $maxH=500;
1967 }
1968 $IW = $imgInfo[0];
1969 $IH = $imgInfo[1];
1970 if ($IW>$maxW) {
1971 $IH=ceil($IH/$IW*$maxW);
1972 $IW=$maxW;
1973 }
1974 if ($IH>$maxH) {
1975 $IW=ceil($IW/$IH*$maxH);
1976 $IH=$maxH;
1977 }
1978
1979 // Make row:
1980 $lines[]='
1981 <tr class="bgColor4">
1982 <td nowrap="nowrap">'.$filenameAndIcon.'&nbsp;</td>
1983 <td nowrap="nowrap">'.
1984 ($imgInfo[0]!=$IW ? '<a href="'.htmlspecialchars(t3lib_div::linkThisScript(array('noLimit'=>'1'))).'">'.
1985 '<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/icon_warning2.gif','width="18" height="16"').' title="'.$GLOBALS['LANG']->getLL('clickToRedrawFullSize',1).'" alt="" />'.
1986 '</a>':'').
1987 $pDim.'&nbsp;</td>
1988 </tr>';
1989
1990 $lines[]='
1991 <tr>
1992 <td colspan="2"><img src="'.$iurl.'" width="'.$IW.'" height="'.$IH.'" border="1" alt="" /></td>
1993 </tr>';
1994 $lines[]='
1995 <tr>
1996 <td colspan="2"><img src="clear.gif" width="1" height="3" alt="" /></td>
1997 </tr>';
1998 }
1999 }
2000
2001 // Finally, wrap all rows in a table tag:
2002 $out.='
2003
2004
2005 <!--
2006 File listing / Drag-n-drop
2007 -->
2008 <table border="0" cellpadding="0" cellspacing="1" id="typo3-dragBox">
2009 '.implode('',$lines).'
2010 </table>';
2011 }
2012 } else {
2013 // Print this warning if the folder is NOT a web folder:
2014 $out.=$this->barheader($GLOBALS['LANG']->getLL('files'));
2015 $out.=$this->getMsgBox($GLOBALS['LANG']->getLL('noWebFolder'),'icon_warning2');
2016 }
2017 }
2018 return $out;
2019 }
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032 /******************************************************************
2033 *
2034 * Miscellaneous functions
2035 *
2036 ******************************************************************/
2037
2038
2039 /**
2040 * Verifies that a path is a web-folder:
2041 *
2042 * @param string Absolute filepath
2043 * @return boolean If the input path is found in PATH_site then it returns true.
2044 */
2045 function isWebFolder($folder) {
2046 $folder = ereg_replace('\/$','',$folder).'/';
2047 return t3lib_div::isFirstPartOfStr($folder,PATH_site) ? TRUE : FALSE;
2048 }
2049
2050 /**
2051 * Checks, if a path is within the mountpoints of the backend user
2052 *
2053 * @param string Absolute filepath
2054 * @return boolean If the input path is found in the backend users filemounts, then return true.
2055 */
2056 function checkFolder($folder) {
2057 $fileProcessor = t3lib_div::makeInstance('t3lib_basicFileFunctions');
2058 $fileProcessor->init($GLOBALS['FILEMOUNTS'], $GLOBALS['TYPO3_CONF_VARS']['BE']['fileExtensions']);
2059
2060 return $fileProcessor->checkPathAgainstMounts(ereg_replace('\/$','',$folder).'/') ? TRUE : FALSE;
2061 }
2062
2063 /**
2064 * Prints a 'header' where string is in a tablecell
2065 *
2066 * @param string The string to print in the header. The value is htmlspecialchars()'ed before output.
2067 * @return string The header HTML (wrapped in a table)
2068 */
2069 function barheader($str) {
2070 return '
2071
2072 <!--
2073 Bar header:
2074 -->
2075 <h3 class="bgColor5">'.htmlspecialchars($str).'</h3>
2076 ';
2077 }
2078
2079 /**
2080 * Displays a message box with the input message
2081 *
2082 * @param string Input message to show (will be htmlspecialchars()'ed inside of this function)
2083 * @param string Icon filename body from gfx/ (default is "icon_note") - meant to allow change to warning type icons...
2084 * @return string HTML for the message (wrapped in a table).
2085 */
2086 function getMsgBox($in_msg,$icon='icon_note') {
2087 global $BACK_PATH;
2088
2089 $msg = '<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/'.$icon.'.gif','width="18" height="16"').' alt="" />'.htmlspecialchars($in_msg);
2090 $msg = '
2091
2092 <!--
2093 Message box:
2094 -->
2095 <table cellspacing="0" class="bgColor4" id="typo3-msgBox">
2096 <tr>
2097 <td>'.$msg.'</td>
2098 </tr>
2099 </table>
2100 ';
2101 return $msg;
2102 }
2103
2104 /**
2105 * For RTE/link: This prints the 'currentUrl'
2106 *
2107 * @param string URL value. The value is htmlspecialchars()'ed before output.
2108 * @return string HTML content, wrapped in a table.
2109 */
2110 function printCurrentUrl($str) {
2111 return '
2112
2113 <!--
2114 Print current URL
2115 -->
2116 <table border="0" cellpadding="0" cellspacing="0" class="bgColor5" id="typo3-curUrl">
2117 <tr>
2118 <td>'.$GLOBALS['LANG']->getLL('currentLink',1).': '.htmlspecialchars(rawurldecode($str)).'</td>
2119 </tr>
2120 </table>';
2121 }
2122
2123 /**
2124 * For RTE/link: Parses the incoming URL and determines if it's a page, file, external or mail address.
2125 *
2126 * @param string HREF value tp analyse
2127 * @param string The URL of the current website (frontend)
2128 * @return array Array with URL information stored in assoc. keys: value, act (page, file, spec, mail), pageid, cElement, info
2129 */
2130 function parseCurUrl($href,$siteUrl) {
2131 $href = trim($href);
2132 if ($href) {
2133 $info=array();
2134
2135 // Default is "url":
2136 $info['value']=$href;
2137 $info['act']='url';
2138
2139 $specialParts = explode('#_SPECIAL',$href);
2140 if (count($specialParts)==2) { // Special kind (Something RTE specific: User configurable links through: "userLinks." from ->thisConfig)
2141 $info['value']='#_SPECIAL'.$specialParts[1];
2142 $info['act']='spec';
2143 } elseif (t3lib_div::isFirstPartOfStr($href,$siteUrl)) { // If URL is on the current frontend website:
2144 $rel = substr($href,strlen($siteUrl));
2145 if (@file_exists(PATH_site.rawurldecode($rel))) { // URL is a file, which exists:
2146 $info['value']=rawurldecode($rel);
2147 $info['act']='file';
2148 } else { // URL is a page (id parameter)
2149 $uP=parse_url($rel);
2150 if (!trim($uP['path'])) {
2151 $pp = explode('id=',$uP['query']);
2152 $id = $pp[1];
2153 if ($id) {
2154 // Checking if the id-parameter is an alias.
2155 if (!t3lib_div::testInt($id)) {
2156 list($idPartR) = t3lib_BEfunc::getRecordsByField('pages','alias',$id);
2157 $id=intval($idPartR['uid']);
2158 }
2159
2160 $pageRow = t3lib_BEfunc::getRecordWSOL('pages',$id);
2161 $titleLen=intval($GLOBALS['BE_USER']->uc['titleLen']);
2162 $info['value']=$GLOBALS['LANG']->getLL('page',1)." '".htmlspecialchars(t3lib_div::fixed_lgd_cs($pageRow['title'],$titleLen))."' (ID:".$id.($uP['fragment']?', #'.$uP['fragment']:'').')';
2163 $info['pageid']=$id;
2164 $info['cElement']=$uP['fragment'];
2165 $info['act']='page';
2166 }
2167 }
2168 }
2169 } else { // Email link:
2170 if (strtolower(substr($href,0,7))=='mailto:') {
2171 $info['value']=trim(substr($href,7));
2172 $info['act']='mail';
2173 }
2174 }
2175 $info['info'] = $info['value'];
2176 } else { // NO value inputted:
2177 $info=array();
2178 $info['info']=$GLOBALS['LANG']->getLL('none');
2179 $info['value']='';
2180 $info['act']='page';
2181 }
2182 return $info;
2183 }
2184
2185 /**
2186 * For TBE: Makes an upload form for uploading files to the filemount the user is browsing.
2187 * The files are uploaded to the tce_file.php script in the core which will handle the upload.
2188 *
2189 * @param string Absolute filepath on server to which to upload.
2190 * @return string HTML for an upload form.
2191 */
2192 function uploadForm($path) {
2193 global $BACK_PATH;
2194 $count=3;
2195
2196 // Create header, showing upload path:
2197 $header = t3lib_div::isFirstPartOfStr($path,PATH_site)?substr($path,strlen(PATH_site)):$path;
2198 $code=$this->barheader($GLOBALS['LANG']->getLL('uploadImage').':');
2199 $code.='
2200
2201 <!--
2202 Form, for uploading files:
2203 -->
2204 <form action="'.$BACK_PATH.'tce_file.php" method="post" name="editform" enctype="'.$GLOBALS['TYPO3_CONF_VARS']['SYS']['form_enctype'].'">
2205 <table border="0" cellpadding="0" cellspacing="3" id="typo3-uplFiles">
2206 <tr>
2207 <td><strong>'.$GLOBALS['LANG']->getLL('path',1).':</strong> '.htmlspecialchars($header).'</td>
2208 </tr>
2209 <tr>
2210 <td>';
2211
2212 // Traverse the number of upload fields (default is 3):
2213 for ($a=1;$a<=$count;$a++) {
2214 $code.='<input type="file" name="upload_'.$a.'"'.$this->doc->formWidth(35).' size="50" />
2215 <input type="hidden" name="file[upload]['.$a.'][target]" value="'.htmlspecialchars($path).'" />
2216 <input type="hidden" name="file[upload]['.$a.'][data]" value="'.$a.'" /><br />';
2217 }
2218
2219 // Make footer of upload form, including the submit button:
2220 $redirectValue = $this->thisScript.'?act='.$this->act.'&mode='.$this->mode.'&expandFolder='.rawurlencode($path).'&bparams='.rawurlencode($this->bparams);
2221 $code.='<input type="hidden" name="redirect" value="'.htmlspecialchars($redirectValue).'" />'.
2222 '<input type="submit" name="submit" value="'.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:file_upload.php.submit',1).'" />';
2223
2224 $code.='
2225 <div id="c-override">
2226 <input type="checkbox" name="overwriteExistingFiles" value="1" /> '.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_misc.xml:overwriteExistingFiles',1).'
2227 </div>
2228 ';
2229
2230
2231 $code.='</td>
2232 </tr>
2233 </table>
2234 </form>';
2235
2236 return $code;
2237 }
2238
2239 /**
2240 * For TBE: Makes a form for creating new folders in the filemount the user is browsing.
2241 * The folder creation request is sent to the tce_file.php script in the core which will handle the creation.
2242 *
2243 * @param string Absolute filepath on server in which to create the new folder.
2244 * @return string HTML for the create folder form.
2245 */
2246 function createFolder($path) {
2247 global $BACK_PATH;
2248 // Create header, showing upload path:
2249 $header = t3lib_div::isFirstPartOfStr($path,PATH_site)?substr($path,strlen(PATH_site)):$path;
2250 $code=$this->barheader($GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:file_newfolder.php.pagetitle').':');
2251 $code.='
2252
2253 <!--
2254 Form, for creating new folders:
2255 -->
2256 <form action="'.$BACK_PATH.'tce_file.php" method="post" name="editform2">
2257 <table border="0" cellpadding="0" cellspacing="3" id="typo3-crFolder">
2258 <tr>
2259 <td><strong>'.$GLOBALS['LANG']->getLL('path',1).':</strong> '.htmlspecialchars($header).'</td>
2260 </tr>
2261 <tr>
2262 <td>';
2263
2264 // Create the new-folder name field:
2265 $a=1;
2266 $code.='<input'.$this->doc->formWidth(20).' type="text" name="file[newfolder]['.$a.'][data]" />'.
2267 '<input type="hidden" name="file[newfolder]['.$a.'][target]" value="'.htmlspecialchars($path).'" />';
2268
2269 // Make footer of upload form, including the submit button:
2270 $redirectValue = $this->thisScript.'?act='.$this->act.'&mode='.$this->mode.'&expandFolder='.rawurlencode($path).'&bparams='.rawurlencode($this->bparams);
2271 $code.='<input type="hidden" name="redirect" value="'.htmlspecialchars($redirectValue).'" />'.
2272 '<input type="submit" name="submit" value="'.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:file_newfolder.php.submit',1).'" />';
2273
2274 $code.='</td>
2275 </tr>
2276 </table>
2277 </form>';
2278
2279 return $code;
2280 }
2281 }
2282
2283 // Include extension?
2284 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['typo3/class.browse_links.php']) {
2285 include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['typo3/class.browse_links.php']);
2286 }
2287
2288
2289 ?>