[BUGFIX] Folder tree in popup throws JS error
[Packages/TYPO3.CMS.git] / typo3 / class.browse_links.php
1 <?php
2 /**
3 * Class which generates the page tree
4 *
5 * @author Kasper Skårhøj <kasperYYYY@typo3.com>
6 */
7 class localPageTree extends \TYPO3\CMS\Backend\Tree\View\BrowseTreeView {
8
9 /**
10 * whether the page ID should be shown next to the title, activate through
11 * userTSconfig (options.pageTree.showPageIdWithTitle)
12 *
13 * @boolean
14 */
15 public $ext_showPageId = FALSE;
16
17 /**
18 * Constructor. Just calling init()
19 *
20 * @todo Define visibility
21 */
22 public function __construct() {
23 $this->thisScript = \TYPO3\CMS\Core\Utility\GeneralUtility::getIndpEnv('SCRIPT_NAME');
24 $this->init();
25 $this->clause = ' AND doktype!=' . \TYPO3\CMS\Frontend\Page\PageRepository::DOKTYPE_RECYCLER . $this->clause;
26 }
27
28 /**
29 * Wrapping the title in a link, if applicable.
30 *
31 * @param string $title Title, (must be ready for output, that means it must be htmlspecialchars()'ed).
32 * @param array $v The record
33 * @param boolean $ext_pArrPages (Ignore)
34 * @return string Wrapping title string.
35 * @todo Define visibility
36 */
37 public function wrapTitle($title, $v, $ext_pArrPages = '') {
38 if ($this->ext_isLinkable($v['doktype'], $v['uid'])) {
39 $aOnClick = 'return link_typo3Page(\'' . $v['uid'] . '\');';
40 return '<a href="#" onclick="' . htmlspecialchars($aOnClick) . '">' . $title . '</a>';
41 } else {
42 return '<span style="color: #666666;">' . $title . '</span>';
43 }
44 }
45
46 /**
47 * Create the page navigation tree in HTML
48 *
49 * @param array $treeArr Tree array
50 * @return string HTML output.
51 * @todo Define visibility
52 */
53 public function printTree($treeArr = '') {
54 $titleLen = intval($GLOBALS['BE_USER']->uc['titleLen']);
55 if (!is_array($treeArr)) {
56 $treeArr = $this->tree;
57 }
58 $out = '';
59 $c = 0;
60 foreach ($treeArr as $k => $v) {
61 $c++;
62 $bgColorClass = ($c + 1) % 2 ? 'bgColor' : 'bgColor-10';
63 if ($GLOBALS['SOBE']->browser->curUrlInfo['act'] == 'page' && $GLOBALS['SOBE']->browser->curUrlInfo['pageid'] == $v['row']['uid'] && $GLOBALS['SOBE']->browser->curUrlInfo['pageid']) {
64 $arrCol = '<td><img' . \TYPO3\CMS\Backend\Utility\IconUtility::skinImg($GLOBALS['BACK_PATH'], 'gfx/blinkarrow_right.gif', 'width="5" height="9"') . ' class="c-blinkArrowR" alt="" /></td>';
65 $bgColorClass = 'bgColor4';
66 } else {
67 $arrCol = '<td></td>';
68 }
69 $aOnClick = 'return jumpToUrl(\'' . $this->thisScript . '?act=' . $GLOBALS['SOBE']->browser->act . '&mode=' . $GLOBALS['SOBE']->browser->mode . '&expandPage=' . $v['row']['uid'] . '\');';
70 $cEbullet = $this->ext_isLinkable($v['row']['doktype'], $v['row']['uid']) ? '<a href="#" onclick="' . htmlspecialchars($aOnClick) . '"><img' . \TYPO3\CMS\Backend\Utility\IconUtility::skinImg($GLOBALS['BACK_PATH'], 'gfx/ol/arrowbullet.gif', 'width="18" height="16"') . ' alt="" /></a>' : '';
71 $out .= '
72 <tr class="' . $bgColorClass . '">
73 <td nowrap="nowrap"' . ($v['row']['_CSSCLASS'] ? ' class="' . $v['row']['_CSSCLASS'] . '"' : '') . '>' . $v['HTML'] . $this->wrapTitle($this->getTitleStr($v['row'], $titleLen), $v['row'], $this->ext_pArrPages) . '</td>' . $arrCol . '<td>' . $cEbullet . '</td>
74 </tr>';
75 }
76 $out = '
77
78
79 <!--
80 Navigation Page Tree:
81 -->
82 <table border="0" cellpadding="0" cellspacing="0" id="typo3-tree">
83 ' . $out . '
84 </table>';
85 return $out;
86 }
87
88 /**
89 * Returns TRUE if a doktype can be linked.
90 *
91 * @param integer $doktype Doktype value to test
92 * @param integer $uid uid to test.
93 * @return boolean
94 * @todo Define visibility
95 */
96 public function ext_isLinkable($doktype, $uid) {
97 if ($uid && $doktype < 199) {
98 return TRUE;
99 }
100 }
101
102 /**
103 * Wrap the plus/minus icon in a link
104 *
105 * @param string $icon HTML string to wrap, probably an image tag.
106 * @param string $cmd Command for 'PM' get var
107 * @param boolean $bMark If set, the link will have a anchor point (=$bMark) and a name attribute (=$bMark)
108 * @return string Link-wrapped input string
109 * @todo Define visibility
110 */
111 public function PM_ATagWrap($icon, $cmd, $bMark = '') {
112 if ($bMark) {
113 $anchor = '#' . $bMark;
114 $name = ' name="' . $bMark . '"';
115 }
116 $aOnClick = 'return jumpToUrl(\'' . $this->thisScript . '?PM=' . $cmd . '\',\'' . $anchor . '\');';
117 return '<a href="#"' . $name . ' onclick="' . htmlspecialchars($aOnClick) . '">' . $icon . '</a>';
118 }
119
120 /**
121 * Wrapping the image tag, $icon, for the row, $row
122 *
123 * @param string $icon The image tag for the icon
124 * @param array $row The row for the current element
125 * @return string The processed icon input value.
126 * @todo Define visibility
127 */
128 public function wrapIcon($icon, $row) {
129 $content = $this->addTagAttributes($icon, ' title="id=' . $row['uid'] . '"');
130 if ($this->ext_showPageId) {
131 $content .= '[' . $row['uid'] . ']&nbsp;';
132 }
133 return $content;
134 }
135
136 }
137
138 /**
139 * Page tree for the RTE - totally the same, no changes needed. (Just for the sake of beauty - or confusion... :-)
140 *
141 * @author Kasper Skårhøj <kasperYYYY@typo3.com>
142 */
143 class rtePageTree extends localPageTree {
144
145 }
146
147 /**
148 * For TBE record browser
149 *
150 * @author Kasper Skårhøj <kasperYYYY@typo3.com>
151 */
152 class TBE_PageTree extends localPageTree {
153
154 /**
155 * Returns TRUE if a doktype can be linked (which is always the case here).
156 *
157 * @param integer $doktype Doktype value to test
158 * @param integer $uid uid to test.
159 * @return boolean
160 * @todo Define visibility
161 */
162 public function ext_isLinkable($doktype, $uid) {
163 return TRUE;
164 }
165
166 /**
167 * Wrapping the title in a link, if applicable.
168 *
169 * @param string $title Title, ready for output.
170 * @param array $v The record
171 * @param boolean $ext_pArrPages If set, pages clicked will return immediately, otherwise reload page.
172 * @return string Wrapping title string.
173 * @todo Define visibility
174 */
175 public function wrapTitle($title, $v, $ext_pArrPages) {
176 if ($ext_pArrPages) {
177 $ficon = \TYPO3\CMS\Backend\Utility\IconUtility::getIcon('pages', $v);
178 $onClick = 'return insertElement(\'pages\', \'' . $v['uid'] . '\', \'db\', ' . \TYPO3\CMS\Core\Utility\GeneralUtility::quoteJSvalue($v['title']) . ', \'\', \'\', \'' . $ficon . '\',\'\',1);';
179 } else {
180 $onClick = htmlspecialchars('return jumpToUrl(\'' . $this->thisScript . '?act=' . $GLOBALS['SOBE']->browser->act . '&mode=' . $GLOBALS['SOBE']->browser->mode . '&expandPage=' . $v['uid'] . '\');');
181 }
182 return '<a href="#" onclick="' . $onClick . '">' . $title . '</a>';
183 }
184
185 }
186
187 /**
188 * Base extension class which generates the folder tree.
189 * Used directly by the RTE.
190 * also used for the linkpicker on files
191 *
192 * @author Kasper Skårhøj <kasperYYYY@typo3.com>
193 */
194 class localFolderTree extends \TYPO3\CMS\Backend\Tree\View\FolderTreeView {
195
196 /**
197 * @todo Define visibility
198 */
199 public $ext_IconMode = 1;
200
201 /**
202 * Initializes the script path
203 *
204 * @todo Define visibility
205 */
206 public function __construct() {
207 $this->thisScript = \TYPO3\CMS\Core\Utility\GeneralUtility::getIndpEnv('SCRIPT_NAME');
208 parent::__construct();
209 }
210
211 /**
212 * Wrapping the title in a link, if applicable.
213 *
214 * @param string $title Title, ready for output.
215 * @param \TYPO3\CMS\Core\Resource\Folder $folderObject The "record
216 * @return string Wrapping title string.
217 * @todo Define visibility
218 */
219 public function wrapTitle($title, \TYPO3\CMS\Core\Resource\Folder $folderObject) {
220 if ($this->ext_isLinkable($folderObject)) {
221 $aOnClick = 'return jumpToUrl(\'' . $this->thisScript . '?act=' . $GLOBALS['SOBE']->browser->act . '&mode=' . $GLOBALS['SOBE']->browser->mode . '&expandFolder=' . rawurlencode($folderObject->getCombinedIdentifier()) . '\');';
222 return '<a href="#" onclick="' . htmlspecialchars($aOnClick) . '">' . $title . '</a>';
223 } else {
224 return '<span class="typo3-dimmed">' . $title . '</span>';
225 }
226 }
227
228 /**
229 * Returns TRUE if the input "record" contains a folder which can be linked.
230 *
231 * @param \TYPO3\CMS\Core\Resource\Folder $folderObject Object with information about the folder element. Contains keys like title, uid, path, _title
232 * @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
233 * @todo Define visibility
234 */
235 public function ext_isLinkable(\TYPO3\CMS\Core\Resource\Folder $folderObject) {
236 if (!$folderObject->getStorage()->isPublic() || strstr($folderObject->getIdentifier(), '_recycler_') || strstr($folderObject->getIdentifier(), '_temp_')) {
237 return FALSE;
238 } else {
239 return TRUE;
240 }
241 }
242
243 /**
244 * Wrap the plus/minus icon in a link
245 *
246 * @param string $icon HTML string to wrap, probably an image tag.
247 * @param string $cmd Command for 'PM' get var
248 * @param boolean $bMark If set, the link will have a anchor point (=$bMark) and a name attribute (=$bMark)
249 * @return string Link-wrapped input string
250 * @access private
251 * @todo Define visibility
252 */
253 public function PM_ATagWrap($icon, $cmd, $bMark = '') {
254 if ($bMark) {
255 $anchor = '#' . $bMark;
256 $name = ' name="' . $bMark . '"';
257 }
258 $aOnClick = 'return jumpToUrl(\'' . $this->thisScript . '?PM=' . $cmd . '\',\'' . $anchor . '\');';
259 return '<a href="#"' . $name . ' onclick="' . htmlspecialchars($aOnClick) . '">' . $icon . '</a>';
260 }
261
262 }
263
264 /**
265 * Folder tree for the RTE - totally the same, no changes needed. (Just for the sake of beauty - or confusion... :-)
266 *
267 * @author Kasper Skårhøj <kasperYYYY@typo3.com>
268 */
269 class rteFolderTree extends localFolderTree {
270
271 }
272
273 /**
274 * For TBE File Browser
275 *
276 * @author Kasper Skårhøj <kasperYYYY@typo3.com>
277 */
278 class TBE_FolderTree extends localFolderTree {
279
280 // If file-drag mode is set, temp and recycler folders are filtered out.
281 /**
282 * @todo Define visibility
283 */
284 public $ext_noTempRecyclerDirs = 0;
285
286 /**
287 * Returns TRUE if the input "record" contains a folder which can be linked.
288 *
289 * @param \TYPO3\CMS\Core\Resource\Folder $folderObject object with information about the folder element. Contains keys like title, uid, path, _title
290 * @return boolean TRUE is returned if the path is NOT a recycler or temp folder AND if ->ext_noTempRecyclerDirs is not set.
291 * @todo Define visibility
292 */
293 public function ext_isLinkable($folderObject) {
294 if ($this->ext_noTempRecyclerDirs && (substr($folderObject->getIdentifier(), -7) == '_temp_/' || substr($folderObject->getIdentifier(), -11) == '_recycler_/')) {
295 return FALSE;
296 } else {
297 return TRUE;
298 }
299 }
300
301 /**
302 * Wrapping the title in a link, if applicable.
303 *
304 * @param string $title Title, ready for output.
305 * @param \TYPO3\CMS\Core\Resource\Folder $folderObject The folderObject 'record'
306 * @return string Wrapping title string.
307 * @todo Define visibility
308 */
309 public function wrapTitle($title, $folderObject) {
310 if ($this->ext_isLinkable($folderObject)) {
311 $aOnClick = 'return jumpToUrl(\'' . $this->thisScript . '?act=' . $GLOBALS['SOBE']->browser->act . '&mode=' . $GLOBALS['SOBE']->browser->mode . '&expandFolder=' . rawurlencode($folderObject->getCombinedIdentifier()) . '\');';
312 return '<a href="#" onclick="' . htmlspecialchars($aOnClick) . '">' . $title . '</a>';
313 } else {
314 return '<span class="typo3-dimmed">' . $title . '</span>';
315 }
316 }
317
318 }