Fixed bug Bug #10224: Not possible to set links to pages underneath a page with activ...
[Packages/TYPO3.CMS.git] / typo3 / class.browse_links.php
1 <?php
2 /***************************************************************
3 * Copyright notice
4 *
5 * (c) 1999-2009 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
119 // Include classes
120 require_once (PATH_typo3.'/class.db_list.inc');
121 require_once (PATH_typo3.'/class.db_list_extra.inc');
122
123
124
125
126 /**
127 * Local version of the record list.
128 *
129 * @author Kasper Skaarhoj <kasperYYYY@typo3.com>
130 * @package TYPO3
131 * @subpackage core
132 */
133 class TBE_browser_recordList extends localRecordList {
134 var $thisScript = 'browse_links.php';
135
136 /**
137 * Initializes the script path
138 *
139 * @return void
140 */
141 function TBE_browser_recordList () {
142 parent::__construct();
143 $this->thisScript = t3lib_div::getIndpEnv('SCRIPT_NAME');
144 }
145
146 /**
147 * Creates the URL for links
148 *
149 * @param mixed If not blank string, this is used instead of $this->id as the id value.
150 * @param string If this is "-1" then $this->table is used, otherwise the value of the input variable.
151 * @param string Commalist of fields NOT to pass as parameters (currently "sortField" and "sortRev")
152 * @return string Query-string for URL
153 */
154 function listURL($altId='',$table=-1,$exclList='') {
155 return $this->thisScript.
156 '?id='.(strcmp($altId,'')?$altId:$this->id).
157 '&table='.rawurlencode($table==-1?$this->table:$table).
158 ($this->thumbs?'&imagemode='.$this->thumbs:'').
159 ($this->searchString?'&search_field='.rawurlencode($this->searchString):'').
160 ($this->searchLevels?'&search_levels='.rawurlencode($this->searchLevels):'').
161 ((!$exclList || !t3lib_div::inList($exclList,'sortField')) && $this->sortField?'&sortField='.rawurlencode($this->sortField):'').
162 ((!$exclList || !t3lib_div::inList($exclList,'sortRev')) && $this->sortRev?'&sortRev='.rawurlencode($this->sortRev):'').
163 // extra:
164 $this->ext_addP()
165 ;
166 }
167
168 /**
169 * Returns additional, local GET parameters to include in the links of the record list.
170 *
171 * @return string
172 */
173 function ext_addP() {
174 $str = '&act='.$GLOBALS['SOBE']->browser->act.
175 '&mode='.$GLOBALS['SOBE']->browser->mode.
176 '&expandPage='.$GLOBALS['SOBE']->browser->expandPage.
177 '&bparams='.rawurlencode($GLOBALS['SOBE']->browser->bparams);
178 return $str;
179 }
180
181 /**
182 * 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...)
183 *
184 * @param string Table name
185 * @param integer UID (not used here)
186 * @param string Title string
187 * @param array Records array (from table name)
188 * @return string
189 */
190 function linkWrapItems($table,$uid,$code,$row) {
191 global $TCA, $BACK_PATH;
192
193 if (!$code) {
194 $code = '<i>['.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:labels.no_title',1).']</i>';
195 } else {
196 $code = t3lib_BEfunc::getRecordTitlePrep($code, $this->fixedL);
197 }
198
199 $title = t3lib_BEfunc::getRecordTitle($table,$row,FALSE,TRUE);
200 $ficon = t3lib_iconWorks::getIcon($table,$row);
201 $aOnClick = "return insertElement('".$table."', '".$row['uid']."', 'db', ".t3lib_div::quoteJSvalue($title).", '', '', '".$ficon."');";
202 $ATag = '<a href="#" onclick="'.$aOnClick.'">';
203 $ATag_alt = substr($ATag,0,-4).',\'\',1);">';
204 $ATag_e = '</a>';
205
206 return $ATag.
207 '<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/plusbullet2.gif','width="18" height="16"').' title="'.$GLOBALS['LANG']->getLL('addToList',1).'" alt="" />'.
208 $ATag_e.
209 $ATag_alt.
210 $code.
211 $ATag_e;
212 }
213
214 /**
215 * Local version that sets allFields to true to support userFieldSelect
216 *
217 * @return void
218 * @see fieldSelectBox
219 */
220 function generateList() {
221 $this->allFields = true;
222 parent::generateList();
223 }
224 }
225
226
227
228
229
230
231 /**
232 * Class which generates the page tree
233 *
234 * @author Kasper Skaarhoj <kasperYYYY@typo3.com>
235 * @package TYPO3
236 * @subpackage core
237 */
238 class localPageTree extends t3lib_browseTree {
239
240 /**
241 * Constructor. Just calling init()
242 *
243 * @return void
244 */
245 function localPageTree() {
246 $this->thisScript = t3lib_div::getIndpEnv('SCRIPT_NAME');
247
248 $this->init();
249
250 $this->clause = ' AND doktype!=255'.$this->clause;
251 }
252
253 /**
254 * Wrapping the title in a link, if applicable.
255 *
256 * @param string Title, (must be ready for output, that means it must be htmlspecialchars()'ed).
257 * @param array The record
258 * @param boolean (Ignore)
259 * @return string Wrapping title string.
260 */
261 function wrapTitle($title,$v,$ext_pArrPages='') {
262 if ($this->ext_isLinkable($v['doktype'],$v['uid'])) {
263 $aOnClick = "return link_typo3Page('".$v['uid']."');";
264 return '<a href="#" onclick="'.htmlspecialchars($aOnClick).'">'.$title.'</a>';
265 } else {
266 return '<span style="color: #666666;">'.$title.'</span>';
267 }
268 }
269
270 /**
271 * Create the page navigation tree in HTML
272 *
273 * @param array Tree array
274 * @return string HTML output.
275 */
276 function printTree($treeArr='') {
277 global $BACK_PATH;
278 $titleLen=intval($GLOBALS['BE_USER']->uc['titleLen']);
279 if (!is_array($treeArr)) $treeArr=$this->tree;
280
281 $out='';
282 $c=0;
283
284 foreach($treeArr as $k => $v) {
285 $c++;
286 $bgColorClass = ($c+1)%2 ? 'bgColor' : 'bgColor-10';
287 if ($GLOBALS['SOBE']->browser->curUrlInfo['act']=='page' && $GLOBALS['SOBE']->browser->curUrlInfo['pageid']==$v['row']['uid'] && $GLOBALS['SOBE']->browser->curUrlInfo['pageid']) {
288 $arrCol='<td><img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/blinkarrow_right.gif','width="5" height="9"').' class="c-blinkArrowR" alt="" /></td>';
289 $bgColorClass='bgColor4';
290 } else {
291 $arrCol='<td></td>';
292 }
293
294 $aOnClick = 'return jumpToUrl(\''.$this->thisScript.'?act='.$GLOBALS['SOBE']->browser->act.'&mode='.$GLOBALS['SOBE']->browser->mode.'&expandPage='.$v['row']['uid'].'\');';
295 $cEbullet = $this->ext_isLinkable($v['row']['doktype'],$v['row']['uid']) ?
296 '<a href="#" onclick="'.htmlspecialchars($aOnClick).'"><img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/ol/arrowbullet.gif','width="18" height="16"').' alt="" /></a>' :
297 '';
298 $out.='
299 <tr class="'.$bgColorClass.'">
300 <td nowrap="nowrap"'.($v['row']['_CSSCLASS'] ? ' class="'.$v['row']['_CSSCLASS'].'"' : '').'>'.
301 $v['HTML'].
302 $this->wrapTitle($this->getTitleStr($v['row'],$titleLen),$v['row'],$this->ext_pArrPages).
303 '</td>'.
304 $arrCol.
305 '<td>'.$cEbullet.'</td>
306 </tr>';
307 }
308 $out='
309
310
311 <!--
312 Navigation Page Tree:
313 -->
314 <table border="0" cellpadding="0" cellspacing="0" id="typo3-tree">
315 '.$out.'
316 </table>';
317 return $out;
318 }
319
320 /**
321 * Returns true if a doktype can be linked.
322 *
323 * @param integer Doktype value to test
324 * @param integer uid to test.
325 * @return boolean
326 */
327 function ext_isLinkable($doktype,$uid) {
328 if ($uid && $doktype<199) {
329 return true;
330 }
331 }
332
333 /**
334 * Wrap the plus/minus icon in a link
335 *
336 * @param string HTML string to wrap, probably an image tag.
337 * @param string Command for 'PM' get var
338 * @param boolean If set, the link will have a anchor point (=$bMark) and a name attribute (=$bMark)
339 * @return string Link-wrapped input string
340 */
341 function PM_ATagWrap($icon,$cmd,$bMark='') {
342 if ($bMark) {
343 $anchor = '#'.$bMark;
344 $name=' name="'.$bMark.'"';
345 }
346 $aOnClick = "return jumpToUrl('".$this->thisScript.'?PM='.$cmd."','".$anchor."');";
347
348 return '<a href="#"'.$name.' onclick="'.htmlspecialchars($aOnClick).'">'.$icon.'</a>';
349 }
350
351 /**
352 * Wrapping the image tag, $icon, for the row, $row
353 *
354 * @param string The image tag for the icon
355 * @param array The row for the current element
356 * @return string The processed icon input value.
357 */
358 function wrapIcon($icon,$row) {
359 return $this->addTagAttributes($icon,' title="id='.$row['uid'].'"');
360 }
361 }
362
363
364
365
366
367
368
369
370 /**
371 * Page tree for the RTE - totally the same, no changes needed. (Just for the sake of beauty - or confusion... :-)
372 *
373 * @author Kasper Skaarhoj <kasperYYYY@typo3.com>
374 * @package TYPO3
375 * @subpackage core
376 */
377 class rtePageTree extends localPageTree {
378 }
379
380
381
382
383
384
385
386
387 /**
388 * For TBE record browser
389 *
390 * @author Kasper Skaarhoj <kasperYYYY@typo3.com>
391 * @package TYPO3
392 * @subpackage core
393 */
394 class TBE_PageTree extends localPageTree {
395
396 /**
397 * Returns true if a doktype can be linked (which is always the case here).
398 *
399 * @param integer Doktype value to test
400 * @param integer uid to test.
401 * @return boolean
402 */
403 function ext_isLinkable($doktype,$uid) {
404 return true;
405 }
406
407 /**
408 * Wrapping the title in a link, if applicable.
409 *
410 * @param string Title, ready for output.
411 * @param array The record
412 * @param boolean If set, pages clicked will return immediately, otherwise reload page.
413 * @return string Wrapping title string.
414 */
415 function wrapTitle($title,$v,$ext_pArrPages) {
416 if ($ext_pArrPages) {
417 $ficon=t3lib_iconWorks::getIcon('pages',$v);
418 $onClick = "return insertElement('pages', '".$v['uid']."', 'db', ".t3lib_div::quoteJSvalue($v['title']).", '', '', '".$ficon."','',1);";
419 } else {
420 $onClick = htmlspecialchars('return jumpToUrl(\''.$this->thisScript.'?act='.$GLOBALS['SOBE']->browser->act.'&mode='.$GLOBALS['SOBE']->browser->mode.'&expandPage='.$v['uid'].'\');');
421 }
422 return '<a href="#" onclick="'.$onClick.'">'.$title.'</a>';
423 }
424 }
425
426
427
428
429
430
431
432
433 /**
434 * Base extension class which generates the folder tree.
435 * Used directly by the RTE.
436 *
437 * @author Kasper Skaarhoj <kasperYYYY@typo3.com>
438 * @package TYPO3
439 * @subpackage core
440 */
441 class localFolderTree extends t3lib_folderTree {
442 var $ext_IconMode=1;
443
444
445 /**
446 * Initializes the script path
447 *
448 * @return void
449 */
450 function localFolderTree() {
451 $this->thisScript = t3lib_div::getIndpEnv('SCRIPT_NAME');
452 $this->t3lib_folderTree();
453 }
454
455 /**
456 * Wrapping the title in a link, if applicable.
457 *
458 * @param string Title, ready for output.
459 * @param array The "record"
460 * @return string Wrapping title string.
461 */
462 function wrapTitle($title,$v) {
463 if ($this->ext_isLinkable($v)) {
464 $aOnClick = 'return jumpToUrl(\''.$this->thisScript.'?act='.$GLOBALS['SOBE']->browser->act.'&mode='.$GLOBALS['SOBE']->browser->mode.'&expandFolder='.rawurlencode($v['path']).'\');';
465 return '<a href="#" onclick="'.htmlspecialchars($aOnClick).'">'.$title.'</a>';
466 } else {
467 return '<span class="typo3-dimmed">'.$title.'</span>';
468 }
469 }
470
471 /**
472 * Returns true if the input "record" contains a folder which can be linked.
473 *
474 * @param array Array with information about the folder element. Contains keys like title, uid, path, _title
475 * @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
476 */
477 function ext_isLinkable($v) {
478 $webpath=t3lib_BEfunc::getPathType_web_nonweb($v['path']); // Checking, if the input path is a web-path.
479 if (strstr($v['path'],'_recycler_') || strstr($v['path'],'_temp_') || $webpath!='web') {
480 return 0;
481 }
482 return 1;
483 }
484
485 /**
486 * Wrap the plus/minus icon in a link
487 *
488 * @param string HTML string to wrap, probably an image tag.
489 * @param string Command for 'PM' get var
490 * @param boolean If set, the link will have a anchor point (=$bMark) and a name attribute (=$bMark)
491 * @return string Link-wrapped input string
492 * @access private
493 */
494 function PM_ATagWrap($icon,$cmd,$bMark='') {
495 if ($bMark) {
496 $anchor = '#'.$bMark;
497 $name=' name="'.$bMark.'"';
498 }
499 $aOnClick = 'return jumpToUrl(\''.$this->thisScript.'?PM='.$cmd.'\',\''.$anchor.'\');';
500 return '<a href="#"'.$name.' onclick="'.htmlspecialchars($aOnClick).'">'.$icon.'</a>';
501 }
502
503 /**
504 * Create the folder navigation tree in HTML
505 *
506 * @param mixed Input tree array. If not array, then $this->tree is used.
507 * @return string HTML output of the tree.
508 */
509 function printTree($treeArr='') {
510 global $BACK_PATH;
511 $titleLen=intval($GLOBALS['BE_USER']->uc['titleLen']);
512
513 if (!is_array($treeArr)) $treeArr=$this->tree;
514
515 $out='';
516 $c=0;
517
518 // Preparing the current-path string (if found in the listing we will see a red blinking arrow).
519 if (!$GLOBALS['SOBE']->browser->curUrlInfo['value']) {
520 $cmpPath='';
521 } else if (substr(trim($GLOBALS['SOBE']->browser->curUrlInfo['info']),-1)!='/') {
522 $cmpPath=PATH_site.dirname($GLOBALS['SOBE']->browser->curUrlInfo['info']).'/';
523 } else {
524 $cmpPath=PATH_site.$GLOBALS['SOBE']->browser->curUrlInfo['info'];
525 }
526
527 // Traverse rows for the tree and print them into table rows:
528 foreach($treeArr as $k => $v) {
529 $c++;
530 $bgColorClass=($c+1)%2 ? 'bgColor' : 'bgColor-10';
531
532 // Creating blinking arrow, if applicable:
533 if (($GLOBALS['SOBE']->browser->curUrlInfo['act'] == 'file' || $GLOBALS['SOBE']->browser->curUrlInfo['act'] == 'folder') && $cmpPath == $v['row']['path']) {
534 $arrCol='<td><img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/blinkarrow_right.gif','width="5" height="9"').' class="c-blinkArrowR" alt="" /></td>';
535 $bgColorClass='bgColor4';
536 } else {
537 $arrCol='<td></td>';
538 }
539 // Create arrow-bullet for file listing (if folder path is linkable):
540 $aOnClick = 'return jumpToUrl(\''.$this->thisScript.'?act='.$GLOBALS['SOBE']->browser->act.'&mode='.$GLOBALS['SOBE']->browser->mode.'&expandFolder='.rawurlencode($v['row']['path']).'\');';
541 $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>' : '';
542
543 // Put table row with folder together:
544 $out.='
545 <tr class="'.$bgColorClass.'">
546 <td nowrap="nowrap">'.$v['HTML'].$this->wrapTitle(t3lib_div::fixed_lgd_cs($v['row']['title'],$titleLen),$v['row']).'</td>
547 '.$arrCol.'
548 <td>'.$cEbullet.'</td>
549 </tr>';
550 }
551
552 $out='
553
554 <!--
555 Folder tree:
556 -->
557 <table border="0" cellpadding="0" cellspacing="0" id="typo3-tree">
558 '.$out.'
559 </table>';
560 return $out;
561 }
562 }
563
564
565
566
567
568
569 /**
570 * Folder tree for the RTE - totally the same, no changes needed. (Just for the sake of beauty - or confusion... :-)
571 *
572 * @author Kasper Skaarhoj <kasperYYYY@typo3.com>
573 * @package TYPO3
574 * @subpackage core
575 */
576 class rteFolderTree extends localFolderTree {
577 }
578
579
580
581
582
583
584
585 /**
586 * For TBE File Browser
587 *
588 * @author Kasper Skaarhoj <kasperYYYY@typo3.com>
589 * @package TYPO3
590 * @subpackage core
591 */
592 class TBE_FolderTree extends localFolderTree {
593 var $ext_noTempRecyclerDirs=0; // If file-drag mode is set, temp and recycler folders are filtered out.
594
595 /**
596 * Returns true if the input "record" contains a folder which can be linked.
597 *
598 * @param array Array with information about the folder element. Contains keys like title, uid, path, _title
599 * @return boolean True is returned if the path is NOT a recycler or temp folder AND if ->ext_noTempRecyclerDirs is not set.
600 */
601 function ext_isLinkable($v) {
602 if ($this->ext_noTempRecyclerDirs && (substr($v['path'],-7)=='_temp_/' || substr($v['path'],-11)=='_recycler_/')) {
603 return 0;
604 } return 1;
605 }
606
607 /**
608 * Wrapping the title in a link, if applicable.
609 *
610 * @param string Title, ready for output.
611 * @param array The 'record'
612 * @return string Wrapping title string.
613 */
614 function wrapTitle($title,$v) {
615 if ($this->ext_isLinkable($v)) {
616 $aOnClick = 'return jumpToUrl(\''.$this->thisScript.'?act='.$GLOBALS['SOBE']->browser->act.'&mode='.$GLOBALS['SOBE']->browser->mode.'&expandFolder='.rawurlencode($v['path']).'\');';
617 return '<a href="#" onclick="'.htmlspecialchars($aOnClick).'">'.$title.'</a>';
618 } else {
619 return '<span class="typo3-dimmed">'.$title.'</span>';
620 }
621 }
622 }
623
624
625
626
627
628 /**
629 * class for the Element Browser window.
630 *
631 * @author Kasper Skaarhoj <kasperYYYY@typo3.com>
632 * @package TYPO3
633 * @subpackage core
634 */
635 class browse_links {
636
637 // Internal, static:
638 var $siteURL; // Current site URL (Frontend)
639 var $thisScript; // the script to link to
640 var $thisConfig; // RTE specific TSconfig
641 var $setTarget; // Target (RTE specific)
642 var $setClass; // CSS Class (RTE specific)
643 var $setTitle; // title (RTE specific)
644 var $doc; // Backend template object
645 var $elements = array(); // Holds information about files
646
647 // GPvars: (Input variables from outside)
648 /**
649 * The mode determines the main kind of output from the element browser.
650 * There are these options for values: rte, db, file, filedrag, wizard.
651 * "rte" will show the link selector for the Rich Text Editor (see main_rte())
652 * "db" will allow you to browse for pages or records in the page tree (for TCEforms, see main_db())
653 * "file"/"filedrag" will allow you to browse for files or folders in the folder mounts (for TCEforms, main_file())
654 * "wizard" will allow you to browse for links (like "rte") which are passed back to TCEforms (see main_rte(1))
655 *
656 * @see main()
657 */
658 var $mode;
659
660 /**
661 * Link selector action.
662 * page,file,url,mail,spec are allowed values.
663 * These are only important with the link selector function and in that case they switch between the various menu options.
664 */
665 var $act;
666
667 /**
668 * 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")
669 */
670 var $expandPage;
671
672 /**
673 * 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/"
674 */
675 var $expandFolder;
676
677
678
679 /**
680 * TYPO3 Element Browser, wizard mode parameters. There is a heap of parameters there, better debug() them out if you need something... :-)
681 */
682 var $P;
683
684 /**
685 * 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.
686 * Example value: "data[pages][39][bodytext]|||tt_content|" or "data[tt_content][NEW3fba56fde763d][image]|||gif,jpg,jpeg,tif,bmp,pcx,tga,png,pdf,ai|"
687 *
688 * Values:
689 * 0: form field name reference, eg. "data[tt_content][123][image]"
690 * 1: htlmArea RTE parameters: editorNo:contentTypo3Language:contentTypo3Charset
691 * 2: RTE config parameters: RTEtsConfigParams
692 * 3: allowed types. Eg. "tt_content" or "gif,jpg,jpeg,tif,bmp,pcx,tga,png,pdf,ai"
693 * 4: IRRE uniqueness: target level object-id to perform actions/checks on, eg. "data[79][tt_address][1][<field>][<foreign_table>]"
694 * 5: IRRE uniqueness: name of function in opener window that checks if element is already used, eg. "inline.checkUniqueElement"
695 * 6: IRRE uniqueness: name of function in opener window that performs some additional(!) action, eg. "inline.setUniqueElement"
696 * 7: IRRE uniqueness: name of function in opener window that performs action instead of using addElement/insertElement, eg. "inline.importElement"
697 *
698 * $pArr = explode('|',$this->bparams);
699 * $formFieldName = $pArr[0];
700 * $allowedTablesOrFileTypes = $pArr[3];
701 */
702 var $bparams;
703
704 /**
705 * Used with the Rich Text Editor.
706 * Example value: "tt_content:NEW3fba58c969f5c:bodytext:23:text:23:"
707 */
708 var $RTEtsConfigParams;
709
710
711
712
713 /**
714 * Plus/Minus icon value. Used by the tree class to open/close notes on the trees.
715 */
716 var $PM;
717
718 /**
719 * Pointer, used when browsing a long list of records etc.
720 */
721 var $pointer;
722
723
724
725
726 /**
727 * 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.
728 */
729 var $curUrlArray;
730
731 /**
732 * 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.
733 */
734 var $curUrlInfo;
735
736 /**
737 * array which holds hook objects (initialised in init() )
738 */
739 protected $hookObjects = array();
740
741
742 /**
743 * object for t3lib_basicFileFunctions
744 */
745 public $fileProcessor;
746
747
748 /**
749 * Constructor:
750 * Initializes a lot of variables, setting JavaScript functions in header etc.
751 *
752 * @return void
753 */
754 function init() {
755 global $BE_USER,$BACK_PATH;
756
757 // Main GPvars:
758 $this->pointer = t3lib_div::_GP('pointer');
759 $this->bparams = t3lib_div::_GP('bparams');
760 $this->P = t3lib_div::_GP('P');
761 $this->RTEtsConfigParams = t3lib_div::_GP('RTEtsConfigParams');
762 $this->expandPage = t3lib_div::_GP('expandPage');
763 $this->expandFolder = t3lib_div::_GP('expandFolder');
764 $this->PM = t3lib_div::_GP('PM');
765
766 // Find "mode"
767 $this->mode = t3lib_div::_GP('mode');
768 if (!$this->mode) {
769 $this->mode = 'rte';
770 }
771 // Creating backend template object:
772 $this->doc = t3lib_div::makeInstance('template');
773 $this->doc->backPath = $GLOBALS['BACK_PATH'];
774 // Load the Prototype library and browse_links.js
775 $this->doc->getPageRenderer()->loadPrototype();
776 $this->doc->loadJavascriptLib('js/browse_links.js');
777
778 // init hook objects:
779 $this->hookObjects = array();
780 if (is_array($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['typo3/class.browse_links.php']['browseLinksHook'])) {
781 foreach($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['typo3/class.browse_links.php']['browseLinksHook'] as $classData) {
782 $processObject = t3lib_div::getUserObj($classData);
783
784 if(!($processObject instanceof t3lib_browseLinksHook)) {
785 throw new UnexpectedValueException('$processObject must implement interface t3lib_browseLinksHook', 1195039394);
786 }
787
788 $parameters = array();
789 $processObject->init($this, $parameters);
790 $this->hookObjects[] = $processObject;
791 }
792 }
793
794 // Site URL
795 $this->siteURL = t3lib_div::getIndpEnv('TYPO3_SITE_URL'); // Current site url
796
797 // the script to link to
798 $this->thisScript = t3lib_div::getIndpEnv('SCRIPT_NAME');
799
800 // init fileProcessor
801 $this->fileProcessor = t3lib_div::makeInstance('t3lib_basicFileFunctions');
802 $this->fileProcessor->init($GLOBALS['FILEMOUNTS'], $GLOBALS['TYPO3_CONF_VARS']['BE']['fileExtensions']);
803
804
805 // CurrentUrl - the current link url must be passed around if it exists
806 if ($this->mode == 'wizard') {
807 $currentLinkParts = t3lib_div::unQuoteFilenames($this->P['currentValue'], TRUE);
808 $initialCurUrlArray = array (
809 'href' => $currentLinkParts[0],
810 'target' => $currentLinkParts[1],
811 'class' => $currentLinkParts[2],
812 'title' => $currentLinkParts[3],
813 );
814 $this->curUrlArray = (is_array(t3lib_div::_GP('curUrl'))) ?
815 array_merge($initialCurUrlArray, t3lib_div::_GP('curUrl')) :
816 $initialCurUrlArray;
817 $this->curUrlInfo = $this->parseCurUrl($this->siteURL.'?id='.$this->curUrlArray['href'], $this->siteURL);
818 if ($this->curUrlInfo['pageid'] == 0 && $this->curUrlArray['href']) { // pageid == 0 means that this is not an internal (page) link
819 if (file_exists(PATH_site.rawurldecode($this->curUrlArray['href']))) { // check if this is a link to a file
820 if (t3lib_div::isFirstPartOfStr($this->curUrlArray['href'], PATH_site)) {
821 $currentLinkParts[0] = substr($this->curUrlArray['href'], strlen(PATH_site));
822 }
823 $this->curUrlInfo = $this->parseCurUrl($this->siteURL.$this->curUrlArray['href'], $this->siteURL);
824 } elseif (strstr($this->curUrlArray['href'], '@')) { // check for email link
825 if (t3lib_div::isFirstPartOfStr($this->curUrlArray['href'], 'mailto:')) {
826 $currentLinkParts[0] = substr($this->curUrlArray['href'], 7);
827 }
828 $this->curUrlInfo = $this->parseCurUrl('mailto:'.$this->curUrlArray['href'], $this->siteURL);
829 } else { // nothing of the above. this is an external link
830 if(strpos($this->curUrlArray['href'], '://') === false) {
831 $currentLinkParts[0] = 'http://' . $this->curUrlArray['href'];
832 }
833 $this->curUrlInfo = $this->parseCurUrl($currentLinkParts[0], $this->siteURL);
834 }
835 } elseif (!$this->curUrlArray['href']) {
836 $this->curUrlInfo = array();
837 $this->act = 'page';
838 } else {
839 $this->curUrlInfo = $this->parseCurUrl($this->siteURL.'?id='.$this->curUrlArray['href'], $this->siteURL);
840 }
841 } else {
842 $this->curUrlArray = t3lib_div::_GP('curUrl');
843 if ($this->curUrlArray['all']) {
844 $this->curUrlArray=t3lib_div::get_tag_attributes($this->curUrlArray['all']);
845 }
846 $this->curUrlInfo=$this->parseCurUrl($this->curUrlArray['href'],$this->siteURL);
847 }
848
849 // Determine nature of current url:
850 $this->act=t3lib_div::_GP('act');
851 if (!$this->act) {
852 $this->act=$this->curUrlInfo['act'];
853 }
854
855 // Rich Text Editor specific configuration:
856 $addPassOnParams='';
857 if ((string)$this->mode == 'rte') {
858 $RTEtsConfigParts = explode(':',$this->RTEtsConfigParams);
859 $addPassOnParams.='&RTEtsConfigParams='.rawurlencode($this->RTEtsConfigParams);
860 $RTEsetup = $GLOBALS['BE_USER']->getTSConfig('RTE',t3lib_BEfunc::getPagesTSconfig($RTEtsConfigParts[5]));
861 $this->thisConfig = t3lib_BEfunc::RTEsetup($RTEsetup['properties'],$RTEtsConfigParts[0],$RTEtsConfigParts[2],$RTEtsConfigParts[4]);
862 }
863
864 // Initializing the target value (RTE)
865 $this->setTarget = ($this->curUrlArray['target'] != '-') ? $this->curUrlArray['target'] : '';
866 if ($this->thisConfig['defaultLinkTarget'] && !isset($this->curUrlArray['target'])) {
867 $this->setTarget=$this->thisConfig['defaultLinkTarget'];
868 }
869
870 // Initializing the class value (RTE)
871 $this->setClass = ($this->curUrlArray['class'] != '-') ? $this->curUrlArray['class'] : '';
872
873 // Initializing the title value (RTE)
874 $this->setTitle = ($this->curUrlArray['title'] != '-') ? $this->curUrlArray['title'] : '';
875
876 // BEGIN accumulation of header JavaScript:
877 $JScode = '
878 // This JavaScript is primarily for RTE/Link. jumpToUrl is used in the other cases as well...
879 var add_href="'.($this->curUrlArray['href']?'&curUrl[href]='.rawurlencode($this->curUrlArray['href']):'').'";
880 var add_target="'.($this->setTarget?'&curUrl[target]='.rawurlencode($this->setTarget):'').'";
881 var add_class="'.($this->setClass ? '&curUrl[class]='.rawurlencode($this->setClass) : '').'";
882 var add_title="'.($this->setTitle?'&curUrl[title]='.rawurlencode($this->setTitle):'').'";
883 var add_params="'.($this->bparams?'&bparams='.rawurlencode($this->bparams):'').'";
884
885 var cur_href="'.($this->curUrlArray['href']?$this->curUrlArray['href']:'').'";
886 var cur_target="'.($this->setTarget?$this->setTarget:'').'";
887 var cur_class = "'.($this->setClass ? $this->setClass : '-').'";
888 var cur_title="'.($this->setTitle?$this->setTitle:'').'";
889
890 function browse_links_setTarget(target) { //
891 cur_target=target;
892 add_target="&curUrl[target]="+escape(target);
893 }
894 function browse_links_setClass(cssClass) { //
895 cur_class = cssClass;
896 add_class = "&curUrl[class]=" + escape(cssClass);
897 }
898 function browse_links_setTitle(title) { //
899 cur_title=title;
900 add_title="&curUrl[title]="+escape(title);
901 }
902 function browse_links_setValue(value) { //
903 cur_href=value;
904 add_href="&curUrl[href]="+value;
905 }
906 ';
907
908 if ($this->mode == 'wizard') { // Functions used, if the link selector is in wizard mode (= TCEforms fields)
909 unset($this->P['fieldChangeFunc']['alert']);
910 reset($this->P['fieldChangeFunc']);
911 $update='';
912 while(list($k,$v)=each($this->P['fieldChangeFunc'])) {
913 $update.= '
914 window.opener.'.$v;
915 }
916
917 $P2=array();
918 $P2['itemName']=$this->P['itemName'];
919 $P2['formName']=$this->P['formName'];
920 $P2['fieldChangeFunc']=$this->P['fieldChangeFunc'];
921 $P2['params']['allowedExtensions']=$this->P['params']['allowedExtensions'];
922 $P2['params']['blindLinkOptions']=$this->P['params']['blindLinkOptions'];
923 $addPassOnParams.=t3lib_div::implodeArrayForUrl('P',$P2);
924
925 $JScode.='
926 function link_typo3Page(id,anchor) { //
927 updateValueInMainForm(id + (anchor ? anchor : ""));
928 close();
929 return false;
930 }
931 function link_folder(folder) { //
932 updateValueInMainForm(folder);
933 close();
934 return false;
935 }
936 function link_current() { //
937 if (cur_href!="http://" && cur_href!="mailto:") {
938 returnBeforeCleaned = cur_href;
939 if (returnBeforeCleaned.substr(0, 7) == "http://") {
940 returnToMainFormValue = returnBeforeCleaned.substr(7);
941 } else if (returnBeforeCleaned.substr(0, 7) == "mailto:") {
942 if (returnBeforeCleaned.substr(0, 14) == "mailto:mailto:") {
943 returnToMainFormValue = returnBeforeCleaned.substr(14);
944 } else {
945 returnToMainFormValue = returnBeforeCleaned.substr(7);
946 }
947 } else {
948 returnToMainFormValue = returnBeforeCleaned;
949 }
950 updateValueInMainForm(returnToMainFormValue);
951 close();
952 }
953 return false;
954 }
955 function checkReference() { //
956 if (window.opener && window.opener.document && window.opener.document.'.$this->P['formName'].' && window.opener.document.'.$this->P['formName'].'["'.$this->P['itemName'].'"] ) {
957 return window.opener.document.'.$this->P['formName'].'["'.$this->P['itemName'].'"];
958 } else {
959 close();
960 }
961 }
962 function updateValueInMainForm(input) { //
963 var field = checkReference();
964 if (field) {
965 if (cur_target == "" && (cur_title != "" || cur_class != "-")) {
966 cur_target = "-";
967 }
968 if (cur_title == "" && cur_class == "-") {
969 cur_class = "";
970 }
971 cur_class = cur_class.replace(/[\'\"]/g, "");
972 if (cur_class.indexOf(" ") != -1) {
973 cur_class = "\"" + cur_class + "\"";
974 }
975 cur_title = cur_title.replace(/(^\")|(\"$)/g, "");
976 if (cur_title.indexOf(" ") != -1) {
977 cur_title = "\"" + cur_title + "\"";
978 }
979 input = input + " " + cur_target + " " + cur_class + " " + cur_title;
980 field.value = input;
981 '.$update.'
982 }
983 }
984 ';
985 } else { // Functions used, if the link selector is in RTE mode:
986 $JScode.='
987 function link_typo3Page(id,anchor) { //
988 var theLink = \''.$this->siteURL.'?id=\'+id+(anchor?anchor:"");
989 self.parent.parent.renderPopup_addLink(theLink, cur_target, cur_class, cur_title);
990 return false;
991 }
992 function link_folder(folder) { //
993 var theLink = \''.$this->siteURL.'\'+folder;
994 self.parent.parent.renderPopup_addLink(theLink, cur_target, cur_class, cur_title);
995 return false;
996 }
997 function link_spec(theLink) { //
998 self.parent.parent.renderPopup_addLink(theLink, cur_target, cur_class, cur_title);
999 return false;
1000 }
1001 function link_current() { //
1002 if (cur_href!="http://" && cur_href!="mailto:") {
1003 self.parent.parent.renderPopup_addLink(cur_href, cur_target, cur_class, cur_title);
1004 }
1005 return false;
1006 }
1007 ';
1008 }
1009
1010 // General "jumpToUrl" function:
1011 $JScode.='
1012 function jumpToUrl(URL,anchor) { //
1013 var add_act = URL.indexOf("act=")==-1 ? "&act='.$this->act.'" : "";
1014 var add_mode = URL.indexOf("mode=")==-1 ? "&mode='.$this->mode.'" : "";
1015 var theLocation = URL + add_act + add_mode + add_href + add_target + add_class + add_title + add_params'.($addPassOnParams?'+"'.$addPassOnParams.'"':'').'+(anchor?anchor:"");
1016 window.location.href = theLocation;
1017 return false;
1018 }
1019 ';
1020
1021
1022 /**
1023 * Splits parts of $this->bparams
1024 * @see $bparams
1025 */
1026 $pArr = explode('|',$this->bparams);
1027
1028 // This is JavaScript especially for the TBE Element Browser!
1029 $formFieldName = 'data['.$pArr[0].']['.$pArr[1].']['.$pArr[2].']';
1030
1031 // insertElement - Call check function (e.g. for uniqueness handling):
1032 if ($pArr[4] && $pArr[5]) {
1033 $JScodeCheck = '
1034 // Call a check function in the opener window (e.g. for uniqueness handling):
1035 if (parent.window.opener) {
1036 var res = parent.window.opener.'.$pArr[5].'("'.addslashes($pArr[4]).'",table,uid,type);
1037 if (!res.passed) {
1038 if (res.message) alert(res.message);
1039 performAction = false;
1040 }
1041 } else {
1042 alert("Error - reference to main window is not set properly!");
1043 parent.close();
1044 }
1045 ';
1046 }
1047 // insertElement - Call helper function:
1048 if ($pArr[4] && $pArr[6]) {
1049 $JScodeHelper = '
1050 // Call helper function to manage data in the opener window:
1051 if (parent.window.opener) {
1052 parent.window.opener.'.$pArr[6].'("'.addslashes($pArr[4]).'",table,uid,type,"'.addslashes($pArr[0]).'");
1053 } else {
1054 alert("Error - reference to main window is not set properly!");
1055 parent.close();
1056 }
1057 ';
1058 }
1059 // insertElement - perform action commands:
1060 if ($pArr[4] && $pArr[7]) {
1061 // Call user defined action function:
1062 $JScodeAction = '
1063 if (parent.window.opener) {
1064 parent.window.opener.'.$pArr[7].'("'.addslashes($pArr[4]).'",table,uid,type);
1065 focusOpenerAndClose(close);
1066 } else {
1067 alert("Error - reference to main window is not set properly!");
1068 parent.close();
1069 }
1070 ';
1071 } else if ($pArr[0] && !$pArr[1] && !$pArr[2]) {
1072 $JScodeAction = '
1073 addElement(filename,table+"_"+uid,fp,close);
1074 ';
1075 } else {
1076 $JScodeAction = '
1077 if (setReferences()) {
1078 parent.window.opener.group_change("add","'.$pArr[0].'","'.$pArr[1].'","'.$pArr[2].'",elRef,targetDoc);
1079 } else {
1080 alert("Error - reference to main window is not set properly!");
1081 }
1082 focusOpenerAndClose(close);
1083 ';
1084 }
1085
1086 $JScode.='
1087 var elRef="";
1088 var targetDoc="";
1089
1090 function launchView(url) { //
1091 var thePreviewWindow="";
1092 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");
1093 if (thePreviewWindow && thePreviewWindow.focus) {
1094 thePreviewWindow.focus();
1095 }
1096 }
1097 function setReferences() { //
1098 if (parent.window.opener && parent.window.opener.content && parent.window.opener.content.document.editform && parent.window.opener.content.document.editform["'.$formFieldName.'"]) {
1099 targetDoc = parent.window.opener.content.document;
1100 elRef = targetDoc.editform["'.$formFieldName.'"];
1101 return true;
1102 } else {
1103 return false;
1104 }
1105 }
1106 function insertElement(table, uid, type, filename,fp,filetype,imagefile,action, close) { //
1107 var performAction = true;
1108 '.$JScodeCheck.'
1109 // Call performing function and finish this action:
1110 if (performAction) {
1111 '.$JScodeHelper.$JScodeAction.'
1112 }
1113 return false;
1114 }
1115 function addElement(elName,elValue,altElValue,close) { //
1116 if (parent.window.opener && parent.window.opener.setFormValueFromBrowseWin) {
1117 parent.window.opener.setFormValueFromBrowseWin("'.$pArr[0].'",altElValue?altElValue:elValue,elName);
1118 focusOpenerAndClose(close);
1119 } else {
1120 alert("Error - reference to main window is not set properly!");
1121 parent.close();
1122 }
1123 }
1124 function focusOpenerAndClose(close) { //
1125 BrowseLinks.focusOpenerAndClose(close);
1126 }
1127 ';
1128
1129 // Finally, add the accumulated JavaScript to the template object:
1130 $this->doc->JScode.= $this->doc->wrapScriptTags($JScode);
1131
1132 // Debugging:
1133 if (FALSE) debug(array(
1134 'pointer' => $this->pointer,
1135 'act' => $this->act,
1136 'mode' => $this->mode,
1137 'curUrlInfo' => $this->curUrlInfo,
1138 'curUrlArray' => $this->curUrlArray,
1139 'P' => $this->P,
1140 'bparams' => $this->bparams,
1141 'RTEtsConfigParams' => $this->RTEtsConfigParams,
1142 'expandPage' => $this->expandPage,
1143 'expandFolder' => $this->expandFolder,
1144 'PM' => $this->PM,
1145 ),'Internal variables of Script Class:');
1146 }
1147
1148
1149 /**
1150 * Session data for this class can be set from outside with this method.
1151 * Call after init()
1152 *
1153 * @param array Session data array
1154 * @return array Session data and boolean which indicates that data needs to be stored in session because it's changed
1155 */
1156 function processSessionData($data) {
1157 $store = false;
1158
1159 switch((string)$this->mode) {
1160 case 'db':
1161 if (isset($this->expandPage)) {
1162 $data['expandPage']=$this->expandPage;
1163 $store = true;
1164 } else {
1165 $this->expandPage=$data['expandPage'];
1166 }
1167 break;
1168 case 'file':
1169 case 'filedrag':
1170 case 'folder':
1171 if (isset($this->expandFolder)) {
1172 $data['expandFolder']=$this->expandFolder;
1173 $store = true;
1174 } else {
1175 $this->expandFolder=$data['expandFolder'];
1176 }
1177 break;
1178 }
1179
1180 return array($data, $store);
1181 }
1182
1183
1184
1185
1186 /******************************************************************
1187 *
1188 * Main functions
1189 *
1190 ******************************************************************/
1191
1192 /**
1193 * Rich Text Editor (RTE) link selector (MAIN function)
1194 * Generates the link selector for the Rich Text Editor.
1195 * Can also be used to select links for the TCEforms (see $wiz)
1196 *
1197 * @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
1198 * @return string Modified content variable.
1199 */
1200 function main_rte($wiz=0) {
1201 global $LANG, $BACK_PATH;
1202
1203 // Starting content:
1204 $content=$this->doc->startPage('RTE link');
1205
1206 // Initializing the action value, possibly removing blinded values etc:
1207 $allowedItems = array_diff(
1208 explode(',','page,file,folder,url,mail,spec'),
1209 t3lib_div::trimExplode(',',$this->thisConfig['blindLinkOptions'],1)
1210 );
1211 $allowedItems = array_diff(
1212 $allowedItems,
1213 t3lib_div::trimExplode(',',$this->P['params']['blindLinkOptions'])
1214 );
1215
1216 //call hook for extra options
1217 foreach($this->hookObjects as $hookObject) {
1218 $allowedItems = $hookObject->addAllowedItems($allowedItems);
1219 }
1220
1221 reset($allowedItems);
1222 if (!in_array($this->act,$allowedItems)) $this->act = current($allowedItems);
1223
1224 // Making menu in top:
1225 $menuDef = array();
1226 if (!$wiz) {
1227 $menuDef['removeLink']['isActive'] = $this->act=='removeLink';
1228 $menuDef['removeLink']['label'] = $LANG->getLL('removeLink',1);
1229 $menuDef['removeLink']['url'] = '#';
1230 $menuDef['removeLink']['addParams'] = 'onclick="self.parent.parent.renderPopup_unLink();return false;"';
1231 }
1232 if (in_array('page',$allowedItems)) {
1233 $menuDef['page']['isActive'] = $this->act=='page';
1234 $menuDef['page']['label'] = $LANG->getLL('page',1);
1235 $menuDef['page']['url'] = '#';
1236 $menuDef['page']['addParams'] = 'onclick="jumpToUrl(\'?act=page\');return false;"';
1237 }
1238 if (in_array('file',$allowedItems)){
1239 $menuDef['file']['isActive'] = $this->act=='file';
1240 $menuDef['file']['label'] = $LANG->getLL('file',1);
1241 $menuDef['file']['url'] = '#';
1242 $menuDef['file']['addParams'] = 'onclick="jumpToUrl(\'?act=file\');return false;"';
1243 }
1244 if (in_array('folder',$allowedItems)){
1245 $menuDef['folder']['isActive'] = $this->act == 'folder';
1246 $menuDef['folder']['label'] = $LANG->getLL('folder', 1);
1247 $menuDef['folder']['url'] = '#';
1248 $menuDef['folder']['addParams'] = 'onclick="jumpToUrl(\'?act=folder\');return false;"';
1249 }
1250 if (in_array('url',$allowedItems)) {
1251 $menuDef['url']['isActive'] = $this->act=='url';
1252 $menuDef['url']['label'] = $LANG->getLL('extUrl',1);
1253 $menuDef['url']['url'] = '#';
1254 $menuDef['url']['addParams'] = 'onclick="jumpToUrl(\'?act=url\');return false;"';
1255 }
1256 if (in_array('mail',$allowedItems)) {
1257 $menuDef['mail']['isActive'] = $this->act=='mail';
1258 $menuDef['mail']['label'] = $LANG->getLL('email',1);
1259 $menuDef['mail']['url'] = '#';
1260 $menuDef['mail']['addParams'] = 'onclick="jumpToUrl(\'?act=mail\');return false;"';
1261 }
1262 if (is_array($this->thisConfig['userLinks.']) && in_array('spec',$allowedItems)) {
1263 $menuDef['spec']['isActive'] = $this->act=='spec';
1264 $menuDef['spec']['label'] = $LANG->getLL('special',1);
1265 $menuDef['spec']['url'] = '#';
1266 $menuDef['spec']['addParams'] = 'onclick="jumpToUrl(\'?act=spec\');return false;"';
1267 }
1268
1269 // call hook for extra options
1270 foreach($this->hookObjects as $hookObject) {
1271 $menuDef = $hookObject->modifyMenuDefinition($menuDef);
1272 }
1273
1274 $content .= $this->doc->getTabMenuRaw($menuDef);
1275
1276 // Adding the menu and header to the top of page:
1277 $content.=$this->printCurrentUrl($this->curUrlInfo['info']).'<br />';
1278
1279 // Depending on the current action we will create the actual module content for selecting a link:
1280 switch($this->act) {
1281 case 'mail':
1282 $extUrl='
1283
1284 <!--
1285 Enter mail address:
1286 -->
1287 <form action="" name="lurlform" id="lurlform">
1288 <table border="0" cellpadding="2" cellspacing="1" id="typo3-linkMail">
1289 <tr>
1290 <td style="width: 96px;">' . $GLOBALS['LANG']->getLL('emailAddress', 1) . ':</td>
1291 <td><input type="text" name="lemail"'.$this->doc->formWidth(20).' value="'.htmlspecialchars($this->curUrlInfo['act']=='mail'?$this->curUrlInfo['info']:'').'" /> '.
1292 '<input type="submit" value="' . $GLOBALS['LANG']->getLL('setLink', 1) . '" onclick="browse_links_setTarget(\'\');browse_links_setValue(\'mailto:\'+document.lurlform.lemail.value); return link_current();" /></td>
1293 </tr>
1294 </table>
1295 </form>';
1296 $content.=$extUrl;
1297 break;
1298 case 'url':
1299 $extUrl='
1300
1301 <!--
1302 Enter External URL:
1303 -->
1304 <form action="" name="lurlform" id="lurlform">
1305 <table border="0" cellpadding="2" cellspacing="1" id="typo3-linkURL">
1306 <tr>
1307 <td style="width: 96px;">URL:</td>
1308 <td><input type="text" name="lurl"'.$this->doc->formWidth(30).' value="'.htmlspecialchars($this->curUrlInfo['act']=='url'?$this->curUrlInfo['info']:'http://').'" /> '.
1309 '<input type="submit" value="' . $GLOBALS['LANG']->getLL('setLink', 1) . '" onclick="browse_links_setValue(document.lurlform.lurl.value); return link_current();" /></td>
1310 </tr>
1311 </table>
1312 </form>';
1313 $content.=$extUrl;
1314 break;
1315 case 'file':
1316 case 'folder':
1317 $foldertree = t3lib_div::makeInstance('rteFolderTree');
1318 $foldertree->thisScript = $this->thisScript;
1319 $tree = $foldertree->getBrowsableTree();
1320
1321 if (!$this->curUrlInfo['value'] || $this->curUrlInfo['act'] != $this->act) {
1322 $cmpPath = '';
1323 } elseif (substr(trim($this->curUrlInfo['info']), -1) != '/') {
1324 $cmpPath = PATH_site.dirname($this->curUrlInfo['info']).'/';
1325 if (!isset($this->expandFolder)) {
1326 $this->expandFolder = $cmpPath;
1327 }
1328 } else {
1329 $cmpPath = PATH_site.$this->curUrlInfo['info'];
1330 if (!isset($this->expandFolder) && $this->curUrlInfo['act'] == 'folder') {
1331 $this->expandFolder = $cmpPath;
1332 }
1333 }
1334
1335 list(, , $specUid) = explode('_', $this->PM);
1336 $files = $this->expandFolder(
1337 $foldertree->specUIDmap[$specUid],
1338 $this->P['params']['allowedExtensions']
1339 );
1340 $content.= '
1341
1342 <!--
1343 Wrapper table for folder tree / file/folder list:
1344 -->
1345 <table border="0" cellpadding="0" cellspacing="0" id="typo3-linkFiles">
1346 <tr>
1347 <td class="c-wCell" valign="top">'.$this->barheader($GLOBALS['LANG']->getLL('folderTree').':').$tree.'</td>
1348 <td class="c-wCell" valign="top">'.$files.'</td>
1349 </tr>
1350 </table>
1351 ';
1352 break;
1353 case 'spec':
1354 if (is_array($this->thisConfig['userLinks.'])) {
1355 $subcats=array();
1356 $v=$this->thisConfig['userLinks.'];
1357 reset($v);
1358 while(list($k2)=each($v)) {
1359 $k2i = intval($k2);
1360 if (substr($k2,-1)=='.' && is_array($v[$k2i.'.'])) {
1361
1362 // Title:
1363 $title = trim($v[$k2i]);
1364 if (!$title) {
1365 $title=$v[$k2i.'.']['url'];
1366 } else {
1367 $title=$LANG->sL($title);
1368 }
1369 // Description:
1370 $description=$v[$k2i.'.']['description'] ? $LANG->sL($v[$k2i.'.']['description'],1).'<br />' : '';
1371
1372 // URL + onclick event:
1373 $onClickEvent='';
1374 if (isset($v[$k2i.'.']['target'])) $onClickEvent.="browse_links_setTarget('".$v[$k2i.'.']['target']."');";
1375 $v[$k2i.'.']['url'] = str_replace('###_URL###',$this->siteURL,$v[$k2i.'.']['url']);
1376 if (substr($v[$k2i.'.']['url'],0,7)=='http://' || substr($v[$k2i.'.']['url'],0,7)=='mailto:') {
1377 $onClickEvent.="cur_href=unescape('".rawurlencode($v[$k2i.'.']['url'])."');link_current();";
1378 } else {
1379 $onClickEvent.="link_spec(unescape('".$this->siteURL.rawurlencode($v[$k2i.'.']['url'])."'));";
1380 }
1381
1382 // Link:
1383 $A=array('<a href="#" onclick="'.htmlspecialchars($onClickEvent).'return false;">','</a>');
1384
1385 // Adding link to menu of user defined links:
1386 $subcats[$k2i]='
1387 <tr>
1388 <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>
1389 </tr>';
1390 }
1391 }
1392
1393 // Sort by keys:
1394 ksort($subcats);
1395
1396 // Add menu to content:
1397 $content.= '
1398
1399 <!--
1400 Special userdefined menu:
1401 -->
1402 <table border="0" cellpadding="1" cellspacing="1" id="typo3-linkSpecial">
1403 <tr>
1404 <td class="bgColor5" class="c-wCell" valign="top"><strong>'.$LANG->getLL('special',1).'</strong></td>
1405 </tr>
1406 '.implode('',$subcats).'
1407 </table>
1408 ';
1409 }
1410 break;
1411 case 'page':
1412 $pagetree = t3lib_div::makeInstance('rtePageTree');
1413 $pagetree->thisScript = $this->thisScript;
1414 $tree=$pagetree->getBrowsableTree();
1415 $cElements = $this->expandPage();
1416
1417 // Outputting Temporary DB mount notice:
1418 if (intval($GLOBALS['BE_USER']->getSessionData('pageTree_temporaryMountPoint'))) {
1419 $link = '<a href="' . htmlspecialchars(t3lib_div::linkThisScript(array('setTempDBmount' => 0))) . '">' .
1420 $LANG->sl('LLL:EXT:lang/locallang_core.xml:labels.temporaryDBmount', 1) .
1421 '</a>';
1422 $flashMessage = t3lib_div::makeInstance(
1423 't3lib_FlashMessage',
1424 $link,
1425 '',
1426 t3lib_FlashMessage::INFO
1427 );
1428 $dbmount = $flashMessage->render();
1429 }
1430
1431 $content.= '
1432
1433 <!--
1434 Wrapper table for page tree / record list:
1435 -->
1436 <table border="0" cellpadding="0" cellspacing="0" id="typo3-linkPages">
1437 <tr>
1438 <td class="c-wCell" valign="top">' . $this->barheader($GLOBALS['LANG']->getLL('pageTree') . ':') . $dbmount . $tree . '</td>
1439 <td class="c-wCell" valign="top">'.$cElements.'</td>
1440 </tr>
1441 </table>
1442 ';
1443 break;
1444 default:
1445 //call hook
1446 foreach($this->hookObjects as $hookObject) {
1447 $content .= $hookObject->getTab($this->act);
1448 }
1449 break;
1450 }
1451
1452 $content .= '
1453
1454 <!--
1455 Selecting class for link:
1456 -->
1457 <form action="" name="lclassform" id="lclassform">
1458 <table border="0" cellpadding="2" cellspacing="1" id="typo3-linkClass">
1459 <tr>
1460 <td style="width: 96px;">' . $GLOBALS['LANG']->getLL('class', 1) . '</td>
1461 <td><input type="text" name="lclass" onchange="browse_links_setClass(this.value);" value="' . htmlspecialchars($this->setClass) . '"' . $this->doc->formWidth(10) . ' /></td>
1462 </tr>
1463 </table>
1464 </form>
1465
1466 <!--
1467 Selecting title for link:
1468 -->
1469 <form action="" name="ltitleform" id="ltitleform">
1470 <table border="0" cellpadding="2" cellspacing="1" id="typo3-linkTitle">
1471 <tr>
1472 <td style="width: 96px;">' . $GLOBALS['LANG']->getLL('title', 1) . '</td>
1473 <td><input type="text" name="ltitle" onchange="browse_links_setTitle(this.value);" value="' . htmlspecialchars($this->setTitle) . '"' . $this->doc->formWidth(10) . ' /></td>
1474 </tr>
1475 </table>
1476 </form>
1477 ';
1478
1479 // Target:
1480 if ($this->act!='mail') {
1481 $ltarget='
1482
1483
1484
1485 <!--
1486 Selecting target for link:
1487 -->
1488 <form action="" name="ltargetform" id="ltargetform">
1489 <table border="0" cellpadding="2" cellspacing="1" id="typo3-linkTarget">
1490 <tr>
1491 <td>'.$GLOBALS['LANG']->getLL('target',1).':</td>
1492 <td><input type="text" name="ltarget" onchange="browse_links_setTarget(this.value);" value="' . htmlspecialchars($this->setTarget) . '"' . $this->doc->formWidth(10) . ' /></td>
1493 <td>
1494 <select name="ltarget_type" onchange="browse_links_setTarget(this.options[this.selectedIndex].value);document.ltargetform.ltarget.value=this.options[this.selectedIndex].value;this.selectedIndex=0;">
1495 <option></option>
1496 <option value="_top">'.$GLOBALS['LANG']->getLL('top',1).'</option>
1497 <option value="_blank">'.$GLOBALS['LANG']->getLL('newWindow',1).'</option>
1498 </select>
1499 </td>
1500 <td>';
1501 if (($this->curUrlInfo['act'] == 'page' || $this->curUrlInfo['act'] == 'file' || $this->curUrlInfo['act'] == 'folder') && $this->curUrlArray['href'] && $this->curUrlInfo['act'] == $this->act) {
1502 $ltarget.='
1503 <input type="submit" value="'.$GLOBALS['LANG']->getLL('update',1).'" onclick="return link_current();" />';
1504 }
1505
1506 $selectJS = '
1507 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) {
1508 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;
1509 browse_links_setTarget(document.ltargetform.ltarget.value);
1510 browse_links_setClass(document.lclassform.lclass.value);
1511 browse_links_setTitle(document.ltitleform.ltitle.value);
1512 document.ltargetform.popup_width.selectedIndex=0;
1513 document.ltargetform.popup_height.selectedIndex=0;
1514 }
1515 ';
1516
1517 $ltarget.=' </td>
1518 </tr>
1519 <tr>
1520 <td>'.$GLOBALS['LANG']->getLL('target_popUpWindow',1).':</td>
1521 <td colspan="3">
1522 <select name="popup_width" onchange="'.htmlspecialchars($selectJS).'">
1523 <option value="0">'.$GLOBALS['LANG']->getLL('target_popUpWindow_width',1).'</option>
1524 <option value="300">300</option>
1525 <option value="400">400</option>
1526 <option value="500">500</option>
1527 <option value="600">600</option>
1528 <option value="700">700</option>
1529 <option value="800">800</option>
1530 </select>
1531 x
1532 <select name="popup_height" onchange="'.htmlspecialchars($selectJS).'">
1533 <option value="0">'.$GLOBALS['LANG']->getLL('target_popUpWindow_height',1).'</option>
1534 <option value="200">200</option>
1535 <option value="300">300</option>
1536 <option value="400">400</option>
1537 <option value="500">500</option>
1538 <option value="600">600</option>
1539 </select>
1540 </td>
1541 </tr>
1542 </table>
1543 </form>';
1544
1545 // Add "target selector" box to content:
1546 $content.=$ltarget;
1547
1548 // Add some space
1549 $content.='<br /><br />';
1550 }
1551
1552 // End page, return content:
1553 $content.= $this->doc->endPage();
1554 $content = $this->doc->insertStylesAndJS($content);
1555 return $content;
1556 }
1557
1558 /**
1559 * TYPO3 Element Browser: Showing a page tree and allows you to browse for records
1560 *
1561 * @return string HTML content for the module
1562 */
1563 function main_db() {
1564
1565 // Starting content:
1566 $content=$this->doc->startPage('TBE record selector');
1567
1568 // Init variable:
1569 $pArr = explode('|',$this->bparams);
1570
1571 // Making the browsable pagetree:
1572 $pagetree = t3lib_div::makeInstance('TBE_PageTree');
1573 $pagetree->thisScript=$this->thisScript;
1574 $pagetree->ext_pArrPages = !strcmp($pArr[3],'pages')?1:0;
1575 $pagetree->ext_showNavTitle = $GLOBALS['BE_USER']->getTSConfigVal('options.pageTree.showNavTitle');
1576 $pagetree->addField('nav_title');
1577 $tree=$pagetree->getBrowsableTree();
1578
1579 // Making the list of elements, if applicable:
1580 $cElements = $this->TBE_expandPage($pArr[3]);
1581
1582 // Putting the things together, side by side:
1583 $content.= '
1584
1585 <!--
1586 Wrapper table for page tree / record list:
1587 -->
1588 <table border="0" cellpadding="0" cellspacing="0" id="typo3-EBrecords">
1589 <tr>
1590 <td class="c-wCell" valign="top">'.$this->barheader($GLOBALS['LANG']->getLL('pageTree').':').$tree.'</td>
1591 <td class="c-wCell" valign="top">'.$cElements.'</td>
1592 </tr>
1593 </table>
1594 ';
1595
1596 // Add some space
1597 $content.='<br /><br />';
1598
1599 // End page, return content:
1600 $content.= $this->doc->endPage();
1601 $content = $this->doc->insertStylesAndJS($content);
1602 return $content;
1603 }
1604
1605 /**
1606 * TYPO3 Element Browser: Showing a folder tree, allowing you to browse for files.
1607 *
1608 * @return string HTML content for the module
1609 */
1610 function main_file() {
1611 global $BE_USER;
1612
1613 // Starting content:
1614 $content.=$this->doc->startPage('TBE file selector');
1615
1616 // Init variable:
1617 $pArr = explode('|',$this->bparams);
1618
1619 // Create upload/create folder forms, if a path is given:
1620 $path=$this->expandFolder;
1621 if (!$path || !@is_dir($path)) {
1622 // The closest TEMP-path is found
1623 $path = $this->fileProcessor->findTempFolder().'/';
1624 }
1625 if ($path!='/' && @is_dir($path)) {
1626 $uploadForm=$this->uploadForm($path);
1627 $createFolder=$this->createFolder($path);
1628 } else {
1629 $createFolder='';
1630 $uploadForm='';
1631 }
1632 if ($BE_USER->getTSConfigVal('options.uploadFieldsInTopOfEB')) $content.=$uploadForm;
1633
1634 // Getting flag for showing/not showing thumbnails:
1635 $noThumbs = $GLOBALS['BE_USER']->getTSConfigVal('options.noThumbsInEB');
1636
1637 if (!$noThumbs) {
1638 // MENU-ITEMS, fetching the setting for thumbnails from File>List module:
1639 $_MOD_MENU = array('displayThumbs' => '');
1640 $_MCONF['name']='file_list';
1641 $_MOD_SETTINGS = t3lib_BEfunc::getModuleData($_MOD_MENU, t3lib_div::_GP('SET'), $_MCONF['name']);
1642 $addParams = '&act='.$this->act.'&mode='.$this->mode.'&expandFolder='.rawurlencode($path).'&bparams='.rawurlencode($this->bparams);
1643 $thumbNailCheck = t3lib_BEfunc::getFuncCheck('','SET[displayThumbs]',$_MOD_SETTINGS['displayThumbs'],$this->thisScript,$addParams,'id="checkDisplayThumbs"').' <label for="checkDisplayThumbs">'.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_mod_file_list.php:displayThumbs',1).'</label>';
1644 } else {
1645 $thumbNailCheck='';
1646 }
1647 $noThumbs = $noThumbs ? $noThumbs : !$_MOD_SETTINGS['displayThumbs'];
1648
1649 // Create folder tree:
1650 $foldertree = t3lib_div::makeInstance('TBE_FolderTree');
1651 $foldertree->thisScript=$this->thisScript;
1652 $foldertree->ext_noTempRecyclerDirs = ($this->mode == 'filedrag');
1653 $tree=$foldertree->getBrowsableTree();
1654
1655 list(,,$specUid) = explode('_',$this->PM);
1656
1657 if ($this->mode=='filedrag') {
1658 $files = $this->TBE_dragNDrop($foldertree->specUIDmap[$specUid],$pArr[3]);
1659 } else {
1660 $files = $this->TBE_expandFolder($foldertree->specUIDmap[$specUid],$pArr[3],$noThumbs);
1661 }
1662
1663 // Putting the parts together, side by side:
1664 $content.= '
1665
1666 <!--
1667 Wrapper table for folder tree / file list:
1668 -->
1669 <table border="0" cellpadding="0" cellspacing="0" id="typo3-EBfiles">
1670 <tr>
1671 <td class="c-wCell" valign="top">'.$this->barheader($GLOBALS['LANG']->getLL('folderTree').':').$tree.'</td>
1672 <td class="c-wCell" valign="top">'.$files.'</td>
1673 </tr>
1674 </table>
1675 ';
1676 $content.= $thumbNailCheck;
1677
1678 // Adding create folder + upload forms if applicable:
1679 if (!$BE_USER->getTSConfigVal('options.uploadFieldsInTopOfEB')) $content.=$uploadForm;
1680 if ($BE_USER->isAdmin() || $BE_USER->getTSConfigVal('options.createFoldersInEB')) $content.=$createFolder;
1681
1682 // Add some space
1683 $content.='<br /><br />';
1684
1685 // Setup indexed elements:
1686 $this->doc->JScode.= $this->doc->wrapScriptTags('BrowseLinks.addElements(' . json_encode($this->elements) . ');');
1687 // Ending page, returning content:
1688 $content.= $this->doc->endPage();
1689 $content = $this->doc->insertStylesAndJS($content);
1690
1691 return $content;
1692 }
1693
1694 /**
1695 * TYPO3 Element Browser: Showing a folder tree, allowing you to browse for folders.
1696 *
1697 * @return string HTML content for the module
1698 */
1699 function main_folder() {
1700 global $BE_USER;
1701
1702 // Starting content:
1703 $content = $this->doc->startPage('TBE folder selector');
1704
1705 // Init variable:
1706 $parameters = explode('|', $this->bparams);
1707
1708
1709 $path = $this->expandFolder;
1710 if (!$path || !@is_dir($path)) {
1711 // The closest TEMP-path is found
1712 $path = $this->fileProcessor->findTempFolder().'/';
1713 }
1714 if ($path != '/' && @is_dir($path)) {
1715 $createFolder = $this->createFolder($path);
1716 } else {
1717 $createFolder='';
1718 }
1719
1720 // Create folder tree:
1721 $foldertree = t3lib_div::makeInstance('TBE_FolderTree');
1722 $foldertree->thisScript = $this->thisScript;
1723 $foldertree->ext_noTempRecyclerDirs = ($this->mode == 'filedrag');
1724 $tree = $foldertree->getBrowsableTree(false);
1725
1726 list(, , $specUid) = explode('_', $this->PM);
1727
1728 if($this->mode == 'filedrag') {
1729 $folders = $this->TBE_dragNDrop(
1730 $foldertree->specUIDmap[$specUid],
1731 $parameters[3]
1732 );
1733 } else {
1734 $folders = $this->TBE_expandSubFolders($foldertree->specUIDmap[$specUid]);
1735 }
1736
1737 // Putting the parts together, side by side:
1738 $content.= '
1739
1740 <!--
1741 Wrapper table for folder tree / folder list:
1742 -->
1743 <table border="0" cellpadding="0" cellspacing="0" id="typo3-EBfiles">
1744 <tr>
1745 <td class="c-wCell" valign="top">'.$this->barheader($GLOBALS['LANG']->getLL('folderTree').':').$tree.'</td>
1746 <td class="c-wCell" valign="top">'.$folders.'</td>
1747 </tr>
1748 </table>
1749 ';
1750
1751 // Adding create folder if applicable:
1752 if($BE_USER->isAdmin() || $BE_USER->getTSConfigVal('options.createFoldersInEB')) {
1753 $content .= $createFolder;
1754 }
1755
1756 // Add some space
1757 $content .= '<br /><br />';
1758
1759 // Ending page, returning content:
1760 $content.= $this->doc->endPage();
1761 $content = $this->doc->insertStylesAndJS($content);
1762
1763 return $content;
1764 }
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782 /******************************************************************
1783 *
1784 * Record listing
1785 *
1786 ******************************************************************/
1787 /**
1788 * For RTE: This displays all content elements on a page and lets you create a link to the element.
1789 *
1790 * @return string HTML output. Returns content only if the ->expandPage value is set (pointing to a page uid to show tt_content records from ...)
1791 */
1792 function expandPage() {
1793 global $BE_USER, $BACK_PATH;
1794
1795 $out='';
1796 $expPageId = $this->expandPage; // Set page id (if any) to expand
1797
1798 // If there is an anchor value (content element reference) in the element reference, then force an ID to expand:
1799 if (!$this->expandPage && $this->curUrlInfo['cElement']) {
1800 $expPageId = $this->curUrlInfo['pageid']; // Set to the current link page id.
1801 }
1802
1803 // Draw the record list IF there is a page id to expand:
1804 if ($expPageId && t3lib_div::testInt($expPageId) && $BE_USER->isInWebMount($expPageId)) {
1805
1806 // Set header:
1807 $out.=$this->barheader($GLOBALS['LANG']->getLL('contentElements').':');
1808
1809 // Create header for listing, showing the page title/icon:
1810 $titleLen=intval($GLOBALS['BE_USER']->uc['titleLen']);
1811 $mainPageRec = t3lib_BEfunc::getRecordWSOL('pages',$expPageId);
1812 $picon = t3lib_iconWorks::getIconImage('pages', $mainPageRec, $BACK_PATH, '');
1813 $picon.= htmlspecialchars(t3lib_div::fixed_lgd_cs($mainPageRec['title'],$titleLen));
1814 $out.=$picon.'<br />';
1815
1816 // Look up tt_content elements from the expanded page:
1817 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
1818 'uid,header,hidden,starttime,endtime,fe_group,CType,colpos,bodytext',
1819 'tt_content',
1820 'pid='.intval($expPageId).
1821 t3lib_BEfunc::deleteClause('tt_content').
1822 t3lib_BEfunc::versioningPlaceholderClause('tt_content'),
1823 '',
1824 'colpos,sorting'
1825 );
1826 $cc = $GLOBALS['TYPO3_DB']->sql_num_rows($res);
1827
1828 // Traverse list of records:
1829 $c=0;
1830 while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
1831 $c++;
1832 $icon=t3lib_iconWorks::getIconImage('tt_content',$row,$BACK_PATH,'');
1833 if ($this->curUrlInfo['act']=='page' && $this->curUrlInfo['cElement']==$row['uid']) {
1834 $arrCol='<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/blinkarrow_left.gif','width="5" height="9"').' class="c-blinkArrowL" alt="" />';
1835 } else {
1836 $arrCol='';
1837 }
1838 // Putting list element HTML together:
1839 $out.='<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/ol/join'.($c==$cc?'bottom':'').'.gif','width="18" height="16"').' alt="" />'.
1840 $arrCol.
1841 '<a href="#" onclick="return link_typo3Page(\''.$expPageId.'\',\'#'.$row['uid'].'\');">'.
1842 $icon.
1843 htmlspecialchars(t3lib_div::fixed_lgd_cs($row['header'],$titleLen)).
1844 '</a><br />';
1845
1846 // Finding internal anchor points:
1847 if (t3lib_div::inList('text,textpic', $row['CType'])) {
1848 $split = preg_split('/(<a[^>]+name=[\'"]?([^"\'>[:space:]]+)[\'"]?[^>]*>)/i', $row['bodytext'], -1, PREG_SPLIT_DELIM_CAPTURE);
1849
1850 foreach($split as $skey => $sval) {
1851 if (($skey%3)==2) {
1852 // Putting list element HTML together:
1853 $sval = substr($sval,0,100);
1854 $out.='<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/ol/line.gif','width="18" height="16"').' alt="" />'.
1855 '<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/ol/join'.($skey+3>count($split)?'bottom':'').'.gif','width="18" height="16"').' alt="" />'.
1856 '<a href="#" onclick="return link_typo3Page(\''.$expPageId.'\',\'#'.rawurlencode($sval).'\');">'.
1857 htmlspecialchars(' <A> '.$sval).
1858 '</a><br />';
1859 }
1860 }
1861 }
1862 }
1863 }
1864 return $out;
1865 }
1866
1867 /**
1868 * For TYPO3 Element Browser: This lists all content elements from the given list of tables
1869 *
1870 * @param string Commalist of tables. Set to "*" if you want all tables.
1871 * @return string HTML output.
1872 */
1873 function TBE_expandPage($tables) {
1874 global $TCA,$BE_USER, $BACK_PATH;
1875
1876 $out='';
1877 if ($this->expandPage>=0 && t3lib_div::testInt($this->expandPage) && $BE_USER->isInWebMount($this->expandPage)) {
1878
1879 // Set array with table names to list:
1880 if (!strcmp(trim($tables),'*')) {
1881 $tablesArr = array_keys($TCA);
1882 } else {
1883 $tablesArr = t3lib_div::trimExplode(',',$tables,1);
1884 }
1885 reset($tablesArr);
1886
1887 // Headline for selecting records:
1888 $out.=$this->barheader($GLOBALS['LANG']->getLL('selectRecords').':');
1889
1890 // Create the header, showing the current page for which the listing is. Includes link to the page itself, if pages are amount allowed tables.
1891 $titleLen=intval($GLOBALS['BE_USER']->uc['titleLen']);
1892 $mainPageRec = t3lib_BEfunc::getRecordWSOL('pages',$this->expandPage);
1893 $ATag='';
1894 $ATag_e='';
1895 $ATag2='';
1896 if (in_array('pages',$tablesArr)) {
1897 $ficon=t3lib_iconWorks::getIcon('pages',$mainPageRec);
1898 $ATag="<a href=\"#\" onclick=\"return insertElement('pages', '".$mainPageRec['uid']."', 'db', ".t3lib_div::quoteJSvalue($mainPageRec['title']).", '', '', '".$ficon."','',1);\">";
1899 $ATag2="<a href=\"#\" onclick=\"return insertElement('pages', '".$mainPageRec['uid']."', 'db', ".t3lib_div::quoteJSvalue($mainPageRec['title']).", '', '', '".$ficon."','',0);\">";
1900 $ATag_alt=substr($ATag,0,-4).",'',1);\">";
1901 $ATag_e='</a>';
1902 }
1903 $picon=t3lib_iconWorks::getIconImage('pages',$mainPageRec,$BACK_PATH,'');
1904 $pBicon=$ATag2?'<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/plusbullet2.gif','width="18" height="16"').' alt="" />':'';
1905 $pText=htmlspecialchars(t3lib_div::fixed_lgd_cs($mainPageRec['title'],$titleLen));
1906 $out.=$picon.$ATag2.$pBicon.$ATag_e.$ATag.$pText.$ATag_e.'<br />';
1907
1908 // Initialize the record listing:
1909 $id = $this->expandPage;
1910 $pointer = t3lib_div::intInRange($this->pointer,0,100000);
1911 $perms_clause = $GLOBALS['BE_USER']->getPagePermsClause(1);
1912 $pageinfo = t3lib_BEfunc::readPageAccess($id,$perms_clause);
1913 $table='';
1914
1915 // Generate the record list:
1916 $dblist = t3lib_div::makeInstance('TBE_browser_recordList');
1917 $dblist->thisScript=$this->thisScript;
1918 $dblist->backPath = $GLOBALS['BACK_PATH'];
1919 $dblist->thumbs = 0;
1920 $dblist->calcPerms = $GLOBALS['BE_USER']->calcPerms($pageinfo);
1921 $dblist->noControlPanels=1;
1922 $dblist->clickMenuEnabled=0;
1923 $dblist->tableList=implode(',',$tablesArr);
1924
1925 $dblist->start($id,t3lib_div::_GP('table'),$pointer,
1926 t3lib_div::_GP('search_field'),
1927 t3lib_div::_GP('search_levels'),
1928 t3lib_div::_GP('showLimit')
1929 );
1930 $dblist->setDispFields();
1931 $dblist->generateList();
1932 $dblist->writeBottom();
1933
1934 // Add the HTML for the record list to output variable:
1935 $out.=$dblist->HTMLcode;
1936
1937 // Add support for fieldselectbox in singleTableMode
1938 if ($dblist->table) {
1939 $out.= $dblist->fieldSelectBox($dblist->table);
1940 }
1941
1942 $out.=$dblist->getSearchBox();
1943 }
1944
1945 // Return accumulated content:
1946 return $out;
1947 }
1948
1949
1950 /**
1951 * Render list of folders inside a folder.
1952 *
1953 * @param string string of the current folder
1954 * @return string HTML output
1955 */
1956 function TBE_expandSubFolders($expandFolder=0) {
1957 $content = '';
1958
1959 $expandFolder = $expandFolder ?
1960 $expandFolder :
1961 $this->expandFolder;
1962
1963 if($expandFolder && $this->checkFolder($expandFolder)) {
1964 if(t3lib_div::isFirstPartOfStr($expandFolder, PATH_site)) {
1965 $rootFolder = substr($expandFolder, strlen(PATH_site));
1966 }
1967
1968 $folders = array();
1969
1970 // Listing the folders:
1971 $folders = t3lib_div::get_dirs($expandFolder);
1972 if(count($folders) > 0) {
1973 foreach($folders as $index => $folder) {
1974 $folders[$index] = $rootFolder.$folder.'/';
1975 }
1976 }
1977 $content.= $this->folderList($rootFolder, $folders);
1978 }
1979
1980 // Return accumulated content for folderlisting:
1981 return $content;
1982 }
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994 /******************************************************************
1995 *
1996 * File listing
1997 *
1998 ******************************************************************/
1999 /**
2000 * For RTE: This displays all files from folder. No thumbnails shown
2001 *
2002 * @param string The folder path to expand
2003 * @param string List of fileextensions to show
2004 * @return string HTML output
2005 */
2006 function expandFolder($expandFolder=0,$extensionList='') {
2007 global $BACK_PATH;
2008
2009 $expandFolder = $expandFolder ? $expandFolder : $this->expandFolder;
2010 $out='';
2011 if ($expandFolder && $this->checkFolder($expandFolder)) {
2012
2013 // Create header for filelisting:
2014 $out.=$this->barheader($GLOBALS['LANG']->getLL('files').':');
2015
2016 // Prepare current path value for comparison (showing red arrow)
2017 if (!$this->curUrlInfo['value']) {
2018 $cmpPath='';
2019 } else {
2020 $cmpPath=PATH_site.$this->curUrlInfo['info'];
2021 }
2022
2023
2024 // Create header element; The folder from which files are listed.
2025 $titleLen=intval($GLOBALS['BE_USER']->uc['titleLen']);
2026 $picon='<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/i/_icon_webfolders.gif','width="18" height="16"').' alt="" />';
2027 $picon.=htmlspecialchars(t3lib_div::fixed_lgd_cs(basename($expandFolder),$titleLen));
2028 $picon='<a href="#" onclick="return link_folder(\''.t3lib_div::rawUrlEncodeFP(substr($expandFolder,strlen(PATH_site))).'\');">'.$picon.'</a>';
2029 if ($this->curUrlInfo['act'] == 'folder' && $cmpPath == $expandFolder) {
2030 $out.= '<img'.t3lib_iconWorks::skinImg($BACK_PATH, 'gfx/blinkarrow_left.gif', 'width="5" height="9"') . ' class="c-blinkArrowL" alt="" />';
2031 }
2032 $out.=$picon.'<br />';
2033
2034 // Get files from the folder:
2035 if ($this->mode == 'wizard' && $this->act == 'folder') {
2036 $files = t3lib_div::get_dirs($expandFolder);
2037 } else {
2038 $files = t3lib_div::getFilesInDir($expandFolder, $extensionList, 1, 1); // $extensionList='', $prependPath=0, $order='')
2039 }
2040
2041 $c=0;
2042 $cc=count($files);
2043 if (is_array($files)) {
2044 foreach($files as $filepath) {
2045 $c++;
2046 $fI=pathinfo($filepath);
2047
2048 if ($this->mode == 'wizard' && $this->act == 'folder') {
2049 $filepath = $expandFolder.$filepath.'/';
2050 $icon = '<img' . t3lib_iconWorks::skinImg($BACK_PATH, 'gfx/i/_icon_webfolders.gif', 'width="18" height="16"') . ' alt="" />';
2051 } else {
2052 // File icon:
2053 $icon = t3lib_BEfunc::getFileIcon(strtolower($fI['extension']));
2054
2055 // Get size and icon:
2056 $size = ' (' . t3lib_div::formatSize(filesize($filepath)) . 'bytes)';
2057 $icon = '<img' . t3lib_iconWorks::skinImg($BACK_PATH, 'gfx/fileicons/' . $icon . '', 'width="18" height="16"') . ' title="' . htmlspecialchars($fI['basename'] . $size) . '" alt="" />';
2058 }
2059
2060 // If the listed file turns out to be the CURRENT file, then show blinking arrow:
2061 if (($this->curUrlInfo['act'] == 'file' || $this->curUrlInfo['act'] == 'folder') && $cmpPath == $filepath) {
2062 $arrCol='<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/blinkarrow_left.gif','width="5" height="9"').' class="c-blinkArrowL" alt="" />';
2063 } else {
2064 $arrCol='';
2065 }
2066
2067 // Put it all together for the file element:
2068 $out.='<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/ol/join'.($c==$cc?'bottom':'').'.gif','width="18" height="16"').' alt="" />'.
2069 $arrCol.
2070 '<a href="#" onclick="return link_folder(\''.t3lib_div::rawUrlEncodeFP(substr($filepath,strlen(PATH_site))).'\');">'.
2071 $icon.
2072 htmlspecialchars(t3lib_div::fixed_lgd_cs(basename($filepath),$titleLen)).
2073 '</a><br />';
2074 }
2075 }
2076 }
2077 return $out;
2078 }
2079
2080 /**
2081 * For TYPO3 Element Browser: Expand folder of files.
2082 *
2083 * @param string The folder path to expand
2084 * @param string List of fileextensions to show
2085 * @param boolean Whether to show thumbnails or not. If set, no thumbnails are shown.
2086 * @return string HTML output
2087 */
2088 function TBE_expandFolder($expandFolder=0,$extensionList='',$noThumbs=0) {
2089 global $LANG;
2090
2091 $extensionList = ($extensionList == '*') ? '' : $extensionList;
2092 $expandFolder = $expandFolder ? $expandFolder : $this->expandFolder;
2093 $out='';
2094 if ($expandFolder && $this->checkFolder($expandFolder)) {
2095 // Listing the files:
2096 $files = t3lib_div::getFilesInDir($expandFolder,$extensionList,1,1); // $extensionList="",$prependPath=0,$order='')
2097 $out.= $this->fileList($files, $expandFolder, $noThumbs);
2098 }
2099
2100 // Return accumulated content for filelisting:
2101 return $out;
2102 }
2103
2104 /**
2105 * Render list of files.
2106 *
2107 * @param array List of files. See t3lib_div::getFilesInDir
2108 * @param string If set a header with a folder icon and folder name are shown
2109 * @param boolean Whether to show thumbnails or not. If set, no thumbnails are shown.
2110 * @return string HTML output
2111 */
2112 function fileList($files, $folderName='', $noThumbs=0) {
2113 global $LANG, $BACK_PATH;
2114
2115 $out='';
2116
2117 // Listing the files:
2118 if (is_array($files)) {
2119
2120 // Create headline (showing number of files):
2121 $filesCount = count($files);
2122 $out.=$this->barheader(sprintf($GLOBALS['LANG']->getLL('files').' (%s):', $filesCount));
2123 $out.=$this->getBulkSelector($filesCount);
2124
2125 $titleLen=intval($GLOBALS['BE_USER']->uc['titleLen']);
2126
2127 // Create the header of current folder:
2128 if($folderName) {
2129 $picon='<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/i/_icon_webfolders.gif','width="18" height="16"').' alt="" />';
2130 $picon.=htmlspecialchars(t3lib_div::fixed_lgd_cs(basename($folderName),$titleLen));
2131 $out.=$picon.'<br />';
2132 }
2133
2134 // Init graphic object for reading file dimensions:
2135 $imgObj = t3lib_div::makeInstance('t3lib_stdGraphic');
2136 $imgObj->init();
2137 $imgObj->mayScaleUp=0;
2138 $imgObj->tempPath=PATH_site.$imgObj->tempPath;
2139
2140 // Traverse the file list:
2141 $lines=array();
2142 foreach($files as $filepath) {
2143 $fI=pathinfo($filepath);
2144
2145 // Thumbnail/size generation:
2146 if (t3lib_div::inList(strtolower($GLOBALS['TYPO3_CONF_VARS']['GFX']['imagefile_ext']),strtolower($fI['extension'])) && !$noThumbs) {
2147 $imgInfo = $imgObj->getImageDimensions($filepath);
2148 $pDim = $imgInfo[0].'x'.$imgInfo[1].' pixels';
2149 $clickIcon = t3lib_BEfunc::getThumbNail($BACK_PATH.'thumbs.php',$filepath,'hspace="5" vspace="5" border="1"');
2150 } else {
2151 $clickIcon = '';
2152 $pDim = '';
2153 }
2154
2155 // Create file icon:
2156 $ficon = t3lib_BEfunc::getFileIcon(strtolower($fI['extension']));
2157 $size=' ('.t3lib_div::formatSize(filesize($filepath)).'bytes'.($pDim?', '.$pDim:'').')';
2158 $icon = '<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/fileicons/'.$ficon,'width="18" height="16"').' title="'.htmlspecialchars($fI['basename'].$size).'" class="absmiddle" alt="" />';
2159
2160 // Create links for adding the file:
2161 if (strstr($filepath,',') || strstr($filepath,'|')) { // In case an invalid character is in the filepath, display error message:
2162 $eMsg = $LANG->JScharCode(sprintf($LANG->getLL('invalidChar'),', |'));
2163 $ATag = $ATag_alt = "<a href=\"#\" onclick=\"alert(".$eMsg.");return false;\">";
2164 $bulkCheckBox = '';
2165 } else { // If filename is OK, just add it:
2166 $filesIndex = count($this->elements);
2167 $this->elements['file_'.$filesIndex] = array(
2168 'md5' => t3lib_div::shortMD5($filepath),
2169 'type' => 'file',
2170 'fileName' => $fI['basename'],
2171 'filePath' => $filepath,
2172 'fileExt' => $fI['extension'],
2173 'fileIcon' => $ficon,
2174 );
2175 $ATag = "<a href=\"#\" onclick=\"return BrowseLinks.File.insertElement('file_$filesIndex');\">";
2176 $ATag_alt = substr($ATag,0,-4).",1);\">";
2177 $bulkCheckBox = '<input type="checkbox" class="typo3-bulk-item" name="file_'.$filesIndex.'" value="0" /> ';
2178 }
2179 $ATag_e='</a>';
2180
2181 // Create link to showing details about the file in a window:
2182 $Ahref = $BACK_PATH.'show_item.php?table='.rawurlencode($filepath).'&returnUrl='.rawurlencode(t3lib_div::getIndpEnv('REQUEST_URI'));
2183 $ATag2='<a href="'.htmlspecialchars($Ahref).'">';
2184 $ATag2_e='</a>';
2185
2186 // Combine the stuff:
2187 $filenameAndIcon=$bulkCheckBox.$ATag_alt.$icon.htmlspecialchars(t3lib_div::fixed_lgd_cs(basename($filepath),$titleLen)).$ATag_e;
2188
2189 // Show element:
2190 if ($pDim) { // Image...
2191 $lines[]='
2192 <tr class="bgColor4">
2193 <td nowrap="nowrap">'.$filenameAndIcon.'&nbsp;</td>
2194 <td>'.$ATag.'<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/plusbullet2.gif','width="18" height="16"').' title="'.$LANG->getLL('addToList',1).'" alt="" />'.$ATag_e.'</td>
2195 <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>
2196 <td nowrap="nowrap">&nbsp;'.$pDim.'</td>
2197 </tr>';
2198 $lines[]='
2199 <tr>
2200 <td colspan="4">'.$ATag_alt.$clickIcon.$ATag_e.'</td>
2201 </tr>';
2202 } else {
2203 $lines[]='
2204 <tr class="bgColor4">
2205 <td nowrap="nowrap">'.$filenameAndIcon.'&nbsp;</td>
2206 <td>'.$ATag.'<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/plusbullet2.gif','width="18" height="16"').' title="'.$LANG->getLL('addToList',1).'" alt="" />'.$ATag_e.'</td>
2207 <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>
2208 <td>&nbsp;</td>
2209 </tr>';
2210 }
2211 $lines[]='
2212 <tr>
2213 <td colspan="3"><img src="clear.gif" width="1" height="3" alt="" /></td>
2214 </tr>';
2215 }
2216
2217 // Wrap all the rows in table tags:
2218 $out.='
2219
2220
2221
2222 <!--
2223 File listing
2224 -->
2225 <table border="0" cellpadding="0" cellspacing="1" id="typo3-fileList">
2226 '.implode('',$lines).'
2227 </table>';
2228 }
2229 // Return accumulated content for filelisting:
2230 return $out;
2231 }
2232
2233 /**
2234 * Render list of folders.
2235 *
2236 * @param array List of folders. See t3lib_div::get_dirs
2237 * @param string If set a header with a folder icon and folder name are shown
2238 * @return string HTML output
2239 */
2240 function folderList($baseFolder, $folders) {
2241 global $LANG, $BACK_PATH;
2242
2243 $content = '';
2244
2245 // Create headline (showing number of folders):
2246 $content.=$this->barheader(
2247 sprintf($GLOBALS['LANG']->getLL('folders').' (%s):',count($folders))
2248 );
2249
2250 $titleLength = intval($GLOBALS['BE_USER']->uc['titleLen']);
2251
2252 // Create the header of current folder:
2253 if($baseFolder) {
2254 if (strstr($baseFolder, ',') || strstr($baseFolder, '|')) {
2255 // In case an invalid character is in the filepath, display error message:
2256 $errorMessage = $LANG->JScharCode(sprintf($LANG->getLL('invalidChar'),', |'));
2257 $aTag = $aTag_alt = "<a href=\"#\" onclick=\"alert(".$errorMessage.");return false;\">";
2258 } else {
2259 // If foldername is OK, just add it:
2260 $aTag = "<a href=\"#\" onclick=\"return insertElement('','".rawurlencode($baseFolder)."', 'folder', '".rawurlencode($baseFolder)."', unescape('".rawurlencode($baseFolder)."'), '".$fI['extension']."', '".$ficon."');\">";
2261 $aTag_alt = substr($aTag,0,-4).",'',1);\">";
2262 }
2263 $aTag_e = '</a>';
2264
2265 // add the foder icon
2266 $folderIcon = $aTag_alt;
2267 $folderIcon.= '<img'.t3lib_iconWorks::skinImg(
2268 $BACK_PATH,
2269 'gfx/i/_icon_webfolders.gif','width="18" height="16"'
2270 ).' alt="" />';
2271 $folderIcon.= htmlspecialchars(
2272 t3lib_div::fixed_lgd_cs(basename($baseFolder),$titleLength)
2273 );
2274 $folderIcon.= $aTag_e;
2275
2276 $content.=$folderIcon.'<br />';
2277 }
2278
2279 // Listing the folders:
2280 if(is_array($folders)) {
2281 if(count($folders) > 0) {
2282 // Traverse the folder list:
2283 $lines = array();
2284 foreach($folders as $folderPath) {
2285 $pathInfo = pathinfo($folderPath);
2286
2287 // Create folder icon:
2288 $icon = '<img src="clear.gif" width="16" height="16" alt="" /><img'.t3lib_iconWorks::skinImg($BACK_PATH, 'gfx/i/_icon_webfolders.gif','width="16" height="16"').' title="'.htmlspecialchars($pathInfo['basename'].$size).'" class="absmiddle" alt="" />';
2289
2290 // Create links for adding the folder:
2291 if($this->P['itemName'] != '' && $this->P['formName'] != '') {
2292 $aTag = "<a href=\"#\" onclick=\"return set_folderpath(unescape('".rawurlencode($folderPath)."'));\">";
2293 } else {
2294 $aTag = "<a href=\"#\" onclick=\"return insertElement('','".rawurlencode($folderPath)."', 'folder', '".rawurlencode($folderPath)."', unescape('".rawurlencode($folderPath)."'), '".$pathInfo['extension']."', '".$ficon."');\">";
2295 }
2296
2297 if (strstr($folderPath,',') || strstr($folderPath,'|')) {
2298 // In case an invalid character is in the filepath, display error message:
2299 $errorMessage = $LANG->JScharCode(sprintf($LANG->getLL('invalidChar'),', |'));
2300 $aTag = $aTag_alt = "<a href=\"#\" onclick=\"alert(".$errorMessage.");return false;\">";
2301 } else {
2302 // If foldername is OK, just add it:
2303 $aTag_alt = substr($aTag,0,-4).",'',1);\">";
2304 }
2305 $aTag_e='</a>';
2306
2307 // Combine icon and folderpath:
2308 $foldernameAndIcon = $aTag_alt.$icon.htmlspecialchars(
2309 t3lib_div::fixed_lgd_cs(basename($folderPath),$titleLength)
2310 ).$aTag_e;
2311
2312 if($this->P['itemName'] != '') {
2313 $lines[] = '
2314 <tr class="bgColor4">
2315 <td nowrap="nowrap">'.$foldernameAndIcon.'&nbsp;</td>
2316 <td>&nbsp;</td>
2317 </tr>';
2318 } else {
2319 $lines[] = '
2320 <tr class="bgColor4">
2321 <td nowrap="nowrap">'.$foldernameAndIcon.'&nbsp;</td>
2322 <td>'.$aTag.'<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/plusbullet2.gif','width="18" height="16"').' title="'.$LANG->getLL('addToList',1).'" alt="" />'.$aTag_e.'</td>
2323 <td>&nbsp;</td>
2324 </tr>';
2325 }
2326
2327 $lines[] = '
2328 <tr>
2329 <td colspan="3"><img src="clear.gif" width="1" height="3" alt="" /></td>
2330 </tr>';
2331 }
2332 }
2333
2334 // Wrap all the rows in table tags:
2335 $content.='
2336
2337 <!--
2338 Folder listing
2339 -->
2340 <table border="0" cellpadding="0" cellspacing="1" id="typo3-folderList">
2341 '.implode('', $lines).'
2342 </table>';
2343 }
2344
2345 // Return accumulated content for folderlisting:
2346 return $content;
2347 }
2348
2349 /**
2350 * For RTE: This displays all IMAGES (gif,png,jpg) (from extensionList) from folder. Thumbnails are shown for images.
2351 * This listing is of images located in the web-accessible paths ONLY - the listing is for drag-n-drop use in the RTE
2352 *
2353 * @param string The folder path to expand
2354 * @param string List of fileextensions to show
2355 * @return string HTML output
2356 */
2357 function TBE_dragNDrop($expandFolder=0,$extensionList='') {
2358 global $BACK_PATH;
2359
2360 $extensionList = ($extensionList == '*') ? '' : $extensionList;
2361 $expandFolder = $expandFolder ? $expandFolder : $this->expandFolder;
2362 $out='';
2363 if ($expandFolder && $this->checkFolder($expandFolder)) {
2364 if ($this->isWebFolder($expandFolder)) {
2365
2366 // Read files from directory:
2367 $files = t3lib_div::getFilesInDir($expandFolder,$extensionList,1,1); // $extensionList="",$prependPath=0,$order='')
2368 if (is_array($files)) {
2369 $out.=$this->barheader(sprintf($GLOBALS['LANG']->getLL('files').' (%s):',count($files)));
2370
2371 $titleLen=intval($GLOBALS['BE_USER']->uc['titleLen']);
2372 $picon='<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/i/_icon_webfolders.gif','width="18" height="16"').' alt="" />';
2373 $picon.=htmlspecialchars(t3lib_div::fixed_lgd_cs(basename($expandFolder),$titleLen));
2374 $out.=$picon.'<br />';
2375
2376 // Init row-array:
2377 $lines=array();
2378
2379 // Add "drag-n-drop" message:
2380 $lines[]='
2381 <tr>
2382 <td colspan="2">'.$this->getMsgBox($GLOBALS['LANG']->getLL('findDragDrop')).'</td>
2383 </tr>';
2384
2385 // Traverse files:
2386 while(list(,$filepath)=each($files)) {
2387 $fI = pathinfo($filepath);
2388
2389 // URL of image:
2390 $iurl = $this->siteURL.t3lib_div::rawurlencodeFP(substr($filepath,strlen(PATH_site)));
2391
2392 // Show only web-images
2393 if (t3lib_div::inList('gif,jpeg,jpg,png',strtolower($fI['extension']))) {
2394 $imgInfo = @getimagesize($filepath);
2395 $pDim = $imgInfo[0].'x'.$imgInfo[1].' pixels';
2396
2397 $ficon = t3lib_BEfunc::getFileIcon(strtolower($fI['extension']));
2398 $size=' ('.t3lib_div::formatSize(filesize($filepath)).'bytes'.($pDim?', '.$pDim:'').')';
2399 $icon = '<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/fileicons/'.$ficon,'width="18" height="16"').' class="absmiddle" title="'.htmlspecialchars($fI['basename'].$size).'" alt="" />';
2400 $filenameAndIcon=$icon.htmlspecialchars(t3lib_div::fixed_lgd_cs(basename($filepath),$titleLen));
2401
2402 if (t3lib_div::_GP('noLimit')) {
2403 $maxW=10000;
2404 $maxH=10000;
2405 } else {
2406 $maxW=380;
2407 $maxH=500;
2408 }
2409 $IW = $imgInfo[0];
2410 $IH = $imgInfo[1];
2411 if ($IW>$maxW) {
2412 $IH=ceil($IH/$IW*$maxW);
2413 $IW=$maxW;
2414 }
2415 if ($IH>$maxH) {
2416 $IW=ceil($IW/$IH*$maxH);
2417 $IH=$maxH;
2418 }
2419
2420 // Make row:
2421 $lines[]='
2422 <tr class="bgColor4">
2423 <td nowrap="nowrap">'.$filenameAndIcon.'&nbsp;</td>
2424 <td nowrap="nowrap">'.
2425 ($imgInfo[0]!=$IW ? '<a href="'.htmlspecialchars(t3lib_div::linkThisScript(array('noLimit'=>'1'))).'">'.
2426 '<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/icon_warning2.gif','width="18" height="16"').' title="'.$GLOBALS['LANG']->getLL('clickToRedrawFullSize',1).'" alt="" />'.
2427 '</a>':'').
2428 $pDim.'&nbsp;</td>
2429 </tr>';
2430
2431 $lines[]='
2432 <tr>
2433 <td colspan="2"><img src="'.$iurl.'" width="'.$IW.'" height="'.$IH.'" border="1" alt="" /></td>
2434 </tr>';
2435 $lines[]='
2436 <tr>
2437 <td colspan="2"><img src="clear.gif" width="1" height="3" alt="" /></td>
2438 </tr>';
2439 }
2440 }
2441
2442 // Finally, wrap all rows in a table tag:
2443 $out.='
2444
2445
2446 <!--
2447 File listing / Drag-n-drop
2448 -->
2449 <table border="0" cellpadding="0" cellspacing="1" id="typo3-dragBox">
2450 '.implode('',$lines).'
2451 </table>';
2452 }
2453 } else {
2454 // Print this warning if the folder is NOT a web folder:
2455 $out.=$this->barheader($GLOBALS['LANG']->getLL('files'));
2456 $out.=$this->getMsgBox($GLOBALS['LANG']->getLL('noWebFolder'),'icon_warning2');
2457 }
2458 }
2459 return $out;
2460 }
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473 /******************************************************************
2474 *
2475 * Miscellaneous functions
2476 *
2477 ******************************************************************/
2478
2479
2480 /**
2481 * Verifies that a path is a web-folder:
2482 *
2483 * @param string Absolute filepath
2484 * @return boolean If the input path is found in PATH_site then it returns true.
2485 */
2486 function isWebFolder($folder) {
2487 $folder = rtrim($folder, '/').'/';
2488 return t3lib_div::isFirstPartOfStr($folder,PATH_site) ? TRUE : FALSE;
2489 }
2490
2491 /**
2492 * Checks, if a path is within the mountpoints of the backend user
2493 *
2494 * @param string Absolute filepath
2495 * @return boolean If the input path is found in the backend users filemounts, then return true.
2496 */
2497 function checkFolder($folder) {
2498 return $this->fileProcessor->checkPathAgainstMounts(rtrim($folder, '/') . '/') ? true : false;
2499 }
2500
2501 /**
2502 * Checks, if a path is within a read-only mountpoint of the backend user
2503 *
2504 * @param string Absolute filepath
2505 * @return boolean If the input path is found in the backend users filemounts and if the filemount is of type readonly, then return true.
2506 */
2507 function isReadOnlyFolder($folder) {
2508 return ($GLOBALS['FILEMOUNTS'][$this->fileProcessor->checkPathAgainstMounts(rtrim($folder, '/') . '/')]['type'] == 'readonly');
2509 }
2510
2511 /**
2512 * Prints a 'header' where string is in a tablecell
2513 *
2514 * @param string The string to print in the header. The value is htmlspecialchars()'ed before output.
2515 * @return string The header HTML (wrapped in a table)
2516 */
2517 function barheader($str) {
2518 return '
2519
2520 <!--
2521 Bar header:
2522 -->
2523 <h3 class="bgColor5">'.htmlspecialchars($str).'</h3>
2524 ';
2525 }
2526
2527 /**
2528 * Displays a message box with the input message
2529 *
2530 * @param string Input message to show (will be htmlspecialchars()'ed inside of this function)
2531 * @param string Icon filename body from gfx/ (default is "icon_note") - meant to allow change to warning type icons...
2532 * @return string HTML for the message (wrapped in a table).
2533 */
2534 function getMsgBox($in_msg,$icon='icon_note') {
2535 global $BACK_PATH;
2536
2537 $msg = '<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/'.$icon.'.gif','width="18" height="16"').' alt="" />'.htmlspecialchars($in_msg);
2538 $msg = '
2539
2540 <!--
2541 Message box:
2542 -->
2543 <table cellspacing="0" class="bgColor4" id="typo3-msgBox">
2544 <tr>
2545 <td>'.$msg.'</td>
2546 </tr>
2547 </table>
2548 ';
2549 return $msg;
2550 }
2551
2552 /**
2553 * For RTE/link: This prints the 'currentUrl'
2554 *
2555 * @param string URL value. The value is htmlspecialchars()'ed before output.
2556 * @return string HTML content, wrapped in a table.
2557 */
2558 function printCurrentUrl($str) {
2559 return '
2560
2561 <!--
2562 Print current URL
2563 -->
2564 <table border="0" cellpadding="0" cellspacing="0" class="bgColor5" id="typo3-curUrl">
2565 <tr>
2566 <td>'.$GLOBALS['LANG']->getLL('currentLink',1).': '.htmlspecialchars(rawurldecode($str)).'</td>
2567 </tr>
2568 </table>';
2569 }
2570
2571 /**
2572 * For RTE/link: Parses the incoming URL and determines if it's a page, file, external or mail address.
2573 *
2574 * @param string HREF value tp analyse
2575 * @param string The URL of the current website (frontend)
2576 * @return array Array with URL information stored in assoc. keys: value, act (page, file, spec, mail), pageid, cElement, info
2577 */
2578 function parseCurUrl($href,$siteUrl) {
2579 $href = trim($href);
2580 if ($href) {
2581 $info=array();
2582
2583 // Default is "url":
2584 $info['value']=$href;
2585 $info['act']='url';
2586
2587 $specialParts = explode('#_SPECIAL',$href);
2588 if (count($specialParts)==2) { // Special kind (Something RTE specific: User configurable links through: "userLinks." from ->thisConfig)
2589 $info['value']='#_SPECIAL'.$specialParts[1];
2590 $info['act']='spec';
2591 } elseif (t3lib_div::isFirstPartOfStr($href,$siteUrl)) { // If URL is on the current frontend website:
2592 $rel = substr($href,strlen($siteUrl));
2593 if (file_exists(PATH_site.rawurldecode($rel))) { // URL is a file, which exists:
2594 $info['value']=rawurldecode($rel);
2595 if (@is_dir(PATH_site . $info['value'])) {
2596 $info['act'] = 'folder';
2597 } else {
2598 $info['act'] = 'file';
2599 }
2600 } else { // URL is a page (id parameter)
2601 $uP=parse_url($rel);
2602 if (!trim($uP['path'])) {
2603 $pp = preg_split('/^id=/', $uP['query']);
2604 $pp[1] = preg_replace( '/&id=[^&]*/', '', $pp[1]);
2605 $parameters = explode('&', $pp[1]);
2606 $id = array_shift($parameters);
2607 if ($id) {
2608 // Checking if the id-parameter is an alias.
2609 if (!t3lib_div::testInt($id)) {
2610 list($idPartR) = t3lib_BEfunc::getRecordsByField('pages','alias',$id);
2611 $id=intval($idPartR['uid']);
2612 }
2613
2614 $pageRow = t3lib_BEfunc::getRecordWSOL('pages',$id);
2615 $titleLen=intval($GLOBALS['BE_USER']->uc['titleLen']);
2616 $info['value']=$GLOBALS['LANG']->getLL('page',1)." '".htmlspecialchars(t3lib_div::fixed_lgd_cs($pageRow['title'],$titleLen))."' (ID:".$id.($uP['fragment']?', #'.$uP['fragment']:'').')';
2617 $info['pageid']=$id;
2618 $info['cElement']=$uP['fragment'];
2619 $info['act']='page';
2620 $info['query'] = $parameters[0]?'&'.implode('&', $parameters):'';
2621 }
2622 }
2623 }
2624 } else { // Email link:
2625 if (strtolower(substr($href,0,7))=='mailto:') {
2626 $info['value']=trim(substr($href,7));
2627 $info['act']='mail';
2628 }
2629 }
2630 $info['info'] = $info['value'];
2631 } else { // NO value inputted:
2632 $info=array();
2633 $info['info']=$GLOBALS['LANG']->getLL('none');
2634 $info['value']='';
2635 $info['act']='page';
2636 }
2637
2638 // let the hook have a look
2639 foreach($this->hookObjects as $hookObject) {
2640 $info = $hookObject->parseCurrentUrl($href, $siteUrl, $info);
2641 }
2642
2643 return $info;
2644 }
2645
2646 /**
2647 * For TBE: Makes an upload form for uploading files to the filemount the user is browsing.
2648 * The files are uploaded to the tce_file.php script in the core which will handle the upload.
2649 *
2650 * @param string Absolute filepath on server to which to upload.
2651 * @return string HTML for an upload form.
2652 */
2653 function uploadForm($path) {
2654 global $BACK_PATH;
2655
2656 if ($this->isReadOnlyFolder($path)) return '';
2657
2658 // Read configuration of upload field count
2659 $userSetting = $GLOBALS['BE_USER']->getTSConfigVal('options.folderTree.uploadFieldsInLinkBrowser');
2660 $count = isset($userSetting) ? $userSetting : 3;
2661 if ($count === '0') {
2662 return '';
2663 }
2664 $count = intval($count) == 0 ? 3 : intval($count);
2665
2666 // Create header, showing upload path:
2667 $header = t3lib_div::isFirstPartOfStr($path,PATH_site)?substr($path,strlen(PATH_site)):$path;
2668 $code=$this->barheader($GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:file_upload.php.pagetitle',1).':');
2669 $code.='
2670
2671 <!--
2672 Form, for uploading files:
2673 -->
2674 <form action="'.$BACK_PATH.'tce_file.php" method="post" name="editform" enctype="'.$GLOBALS['TYPO3_CONF_VARS']['SYS']['form_enctype'].'">
2675 <table border="0" cellpadding="0" cellspacing="3" id="typo3-uplFiles">
2676 <tr>
2677 <td><strong>'.$GLOBALS['LANG']->getLL('path',1).':</strong> '.htmlspecialchars($header).'</td>
2678 </tr>
2679 <tr>
2680 <td>';
2681
2682 // Traverse the number of upload fields (default is 3):
2683 for ($a=1;$a<=$count;$a++) {
2684 $code.='<input type="file" name="upload_'.$a.'"'.$this->doc->formWidth(35).' size="50" />
2685 <input type="hidden" name="file[upload]['.$a.'][target]" value="'.htmlspecialchars($path).'" />
2686 <input type="hidden" name="file[upload]['.$a.'][data]" value="'.$a.'" /><br />';
2687 }
2688
2689 // Make footer of upload form, including the submit button:
2690 $redirectValue = $this->thisScript.'?act='.$this->act.'&mode='.$this->mode.'&expandFolder='.rawurlencode($path).'&bparams='.rawurlencode($this->bparams);
2691 $code.='<input type="hidden" name="redirect" value="'.htmlspecialchars($redirectValue).'" />'.
2692 '<input type="submit" name="submit" value="'.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:file_upload.php.submit',1).'" />';
2693
2694 $code.='
2695 <div id="c-override">
2696 <input type="checkbox" name="overwriteExistingFiles" id="overwriteExistingFiles" value="1" /> <label for="overwriteExistingFiles">'.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_misc.xml:overwriteExistingFiles',1).'</label>
2697 </div>
2698 ';
2699
2700
2701 $code.='</td>
2702 </tr>
2703 </table>
2704 </form>';
2705
2706 return $code;
2707 }
2708
2709 /**
2710 * For TBE: Makes a form for creating new folders in the filemount the user is browsing.
2711 * The folder creation request is sent to the tce_file.php script in the core which will handle the creation.
2712 *
2713 * @param string Absolute filepath on server in which to create the new folder.
2714 * @return string HTML for the create folder form.
2715 */
2716 function createFolder($path) {
2717 global $BACK_PATH;
2718
2719 if ($this->isReadOnlyFolder($path)) return '';
2720
2721 // Don't show Folder-create form if it's denied
2722 if ($GLOBALS['BE_USER']->getTSConfigVal('options.folderTree.hideCreateFolder')) {
2723 return '';
2724 }
2725 // Create header, showing upload path:
2726 $header = t3lib_div::isFirstPartOfStr($path,PATH_site)?substr($path,strlen(PATH_site)):$path;
2727 $code=$this->barheader($GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:file_newfolder.php.pagetitle').':');
2728 $code.='
2729
2730 <!--
2731 Form, for creating new folders:
2732 -->
2733 <form action="'.$BACK_PATH.'tce_file.php" method="post" name="editform2">
2734 <table border="0" cellpadding="0" cellspacing="3" id="typo3-crFolder">
2735 <tr>
2736 <td><strong>'.$GLOBALS['LANG']->getLL('path',1).':</strong> '.htmlspecialchars($header).'</td>
2737 </tr>
2738 <tr>
2739 <td>';
2740
2741 // Create the new-folder name field:
2742 $a=1;
2743 $code.='<input'.$this->doc->formWidth(20).' type="text" name="file[newfolder]['.$a.'][data]" />'.
2744 '<input type="hidden" name="file[newfolder]['.$a.'][target]" value="'.htmlspecialchars($path).'" />';
2745
2746 // Make footer of upload form, including the submit button:
2747 $redirectValue = $this->thisScript.'?act='.$this->act.'&mode='.$this->mode.'&expandFolder='.rawurlencode($path).'&bparams='.rawurlencode($this->bparams);
2748 $code.='<input type="hidden" name="redirect" value="'.htmlspecialchars($redirectValue).'" />'.
2749 '<input type="submit" name="submit" value="'.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:file_newfolder.php.submit',1).'" />';
2750
2751 $code.='</td>
2752 </tr>
2753 </table>
2754 </form>';
2755
2756 return $code;
2757 }
2758
2759 /**
2760 * Get the HTML data required for a bulk selection of files of the TYPO3 Element Browser.
2761 *
2762 * @param integer $filesCount: Number of files currently displayed
2763 * @return string HTML data required for a bulk selection of files - if $filesCount is 0, nothing is returned
2764 */
2765 function getBulkSelector($filesCount) {
2766 if ($filesCount) {
2767 $labelToggleSelection = $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_browse_links.php:toggleSelection',1);
2768 $labelImportSelection = $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_browse_links.php:importSelection',1);
2769
2770 $out = $this->doc->spacer(15).'<div>' .
2771 '<a href="#" onclick="BrowseLinks.Selector.toggle()">' .
2772 '<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/clip_select.gif','width="12" height="12"').' title="'.$labelToggleSelection.'" alt="" /> ' .
2773 $labelToggleSelection.'</a>'.$this->doc->spacer(5) .
2774 '<a href="#" onclick="BrowseLinks.Selector.handle()">' .
2775 '<img'.t3lib_iconWorks::skinImg($BACK_PATH,'gfx/import.gif','width="12" height="12"').' title="'.$labelImportSelection.'" alt="" /> ' .
2776 $labelImportSelection.'</a>' .
2777 '</div>'.$this->doc->spacer(15);
2778 }
2779 return $out;
2780 }
2781 }
2782
2783
2784 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['typo3/class.browse_links.php']) {
2785 include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['typo3/class.browse_links.php']);
2786 }
2787
2788 ?>