* Added another TSconfig option for replacing the create new content wizard (-> templ...
[Packages/TYPO3.CMS.git] / t3lib / class.t3lib_tsfebeuserauth.php
1 <?php
2 /***************************************************************
3 * Copyright notice
4 *
5 * (c) 1999-2003 Kasper Skaarhoj (kasper@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 * Class for TYPO3 backend user authentication in the TSFE frontend
29 *
30 * $Id$
31 * Revised for TYPO3 3.6 July/2003 by Kasper Skaarhoj
32 * XHTML compliant
33 *
34 * @author Kasper Skaarhoj <kasper@typo3.com>
35 */
36 /**
37 * [CLASS/FUNCTION INDEX of SCRIPT]
38 *
39 *
40 *
41 * 101: class t3lib_tsfeBeUserAuth extends t3lib_beUserAuth
42 * 127: function extInitFeAdmin()
43 * 147: function extPrintFeAdminDialog()
44 *
45 * SECTION: Creating sections of the Admin Panel
46 * 227: function extGetCategory_preview($out='')
47 * 258: function extGetCategory_cache($out='')
48 * 296: function extGetCategory_publish($out='')
49 * 331: function extGetCategory_edit($out='')
50 * 370: function extGetCategory_tsdebug($out='')
51 * 400: function extGetCategory_info($out='')
52 *
53 * SECTION: Admin Panel Layout Helper functions
54 * 473: function extGetHead($pre)
55 * 490: function extItemLink($pre,$str)
56 * 506: function extGetItem($pre,$element)
57 * 522: function extFw($str)
58 * 531: function ext_makeToolBar()
59 *
60 * SECTION: TSFE BE user Access Functions
61 * 586: function extPageReadAccess($pageRec)
62 * 597: function extAdmModuleEnabled($key)
63 * 613: function extSaveFeAdminConfig()
64 * 645: function extGetFeAdminValue($pre,$val='')
65 *
66 * SECTION: TSFE BE user Access Functions
67 * 703: function extGetTreeList($id,$depth,$begin=0,$perms_clause)
68 * 732: function extGetNumberOfCachedPages($page_id)
69 *
70 * SECTION: Localization handling
71 * 771: function extGetLL($key)
72 *
73 * SECTION: Frontend Editing
74 * 814: function extIsEditAction()
75 * 837: function extIsFormShown()
76 * 854: function extEditAction()
77 *
78 * TOTAL FUNCTIONS: 23
79 * (This index is automatically created/updated by the extension "extdeveval")
80 *
81 */
82
83
84
85
86
87
88
89
90
91
92
93 /**
94 * TYPO3 backend user authentication in the TSFE frontend.
95 * This includes mainly functions related to the Admin Panel
96 *
97 * @author Kasper Skaarhoj <kasper@typo3.com>
98 * @package TYPO3
99 * @subpackage t3lib
100 */
101 class t3lib_tsfeBeUserAuth extends t3lib_beUserAuth {
102 var $formfield_uname = ''; // formfield with login-name
103 var $formfield_uident = ''; // formfield with password
104 var $formfield_chalvalue = ''; // formfield with a unique value which is used to encrypt the password and username
105 var $security_level = ''; // sets the level of security. *'normal' = clear-text. 'challenged' = hashed password/username from form in $formfield_uident. 'superchallenged' = hashed password hashed again with username.
106 var $writeStdLog = 0; // Decides if the writelog() function is called at login and logout
107 var $writeAttemptLog = 0; // If the writelog() functions is called if a login-attempt has be tried without success
108 var $auth_include = ''; // this is the name of the include-file containing the login form. If not set, login CAN be anonymous. If set login IS needed.
109
110 var $extNeedUpdate=0;
111 var $extPublishList='';
112 var $extPageInTreeInfo=array();
113 var $ext_forcePreview=0;
114 var $langSplitIndex=0;
115 var $extAdmEnabled = 0; // General flag which is set if the adminpanel should be displayed at all..
116
117
118
119
120 /**
121 * Initialize the usage of Admin Panel.
122 * Called from index_ts.php if a backend users is correctly logged in.
123 * Sets $this->extAdminConfig to the "admPanel" config for the user and $this->extAdmEnabled = 1 IF access is enabled.
124 *
125 * @return void
126 */
127 function extInitFeAdmin() {
128 $this->extAdminConfig = $this->getTSConfigProp('admPanel');
129 if (is_array($this->extAdminConfig['enable.'])) {
130 reset($this->extAdminConfig['enable.']);
131 while(list($k,$v)=each($this->extAdminConfig['enable.'])) {
132 if ($v) {
133 $this->extAdmEnabled=1;
134 break;
135 }
136 }
137 }
138 }
139
140 /**
141 * Creates and returns the HTML code for the Admin Panel in the TSFE frontend.
142 * Called from index_ts.php - in the end of the script
143 *
144 * @return string HTML for the Admin Panel
145 * @see index_ts.php
146 */
147 function extPrintFeAdminDialog() {
148
149 if ($this->uc['TSFE_adminConfig']['display_top']) {
150 if ($this->extAdmModuleEnabled('preview')) $out.= $this->extGetCategory_preview();
151 if ($this->extAdmModuleEnabled('cache')) $out.= $this->extGetCategory_cache();
152 if ($this->extAdmModuleEnabled('publish')) $out.= $this->extGetCategory_publish();
153 if ($this->extAdmModuleEnabled('edit')) $out.= $this->extGetCategory_edit();
154 if ($this->extAdmModuleEnabled('tsdebug')) $out.= $this->extGetCategory_tsdebug();
155 if ($this->extAdmModuleEnabled('info')) $out.= $this->extGetCategory_info();
156 }
157
158 $header.='<tr><td bgcolor="#9BA1A8" colspan="2" nowrap="nowrap">';
159 $header.=$this->extItemLink('top','<img src="t3lib/gfx/ol/'.($this->uc['TSFE_adminConfig']['display_top']?'minus':'plus').'bullet.gif" width="18" height="16" align="absmiddle" border="0" alt="" />'.
160 $this->extFw('<strong>'.$this->extGetLL('adminOptions').'</strong>')).$this->extFw(': '.$this->user['username']).
161 '</td><td bgcolor="#9BA1A8"><img src="clear.gif" width="10" height="1" alt="" /></td><td bgcolor="#9BA1A8"><input type="hidden" name="TSFE_ADMIN_PANEL[display_top]" value="'.$this->uc['TSFE_adminConfig']['display_top'].'" />'.($this->extNeedUpdate?'<input type="submit" value="'.$this->extGetLL('update').'" />':'').'</td></tr>';
162
163 $out='<form name="TSFE_ADMIN_PANEL_FORM" action="'.htmlspecialchars(t3lib_div::getIndpEnv('REQUEST_URI')).'#TSFE_ADMIN" method="post" style="margin: 0 0 0 0;"><table border="0" cellpadding="0" cellspacing="0" bgcolor="#F6F2E6">'.$header.$out.'</table></form>';
164 $out='<a name="TSFE_ADMIN"></a><table border="0" cellpadding="1" cellspacing="0" bgcolor="black"><tr><td>'.$out.'</td></tr></table>';
165 if ($this->uc['TSFE_adminConfig']['display_top']) {
166 $out.='<script type="text/javascript" src="t3lib/jsfunc.evalfield.js"></script>';
167 $out.='
168 <script type="text/javascript">
169 /*<![CDATA[*/
170 var evalFunc = new evalFunc();
171 // TSFEtypo3FormFieldSet()
172 function TSFEtypo3FormFieldSet(theField, evallist, is_in, checkbox, checkboxValue) { //
173 var theFObj = new evalFunc_dummy (evallist,is_in, checkbox, checkboxValue);
174 var theValue = document.TSFE_ADMIN_PANEL_FORM[theField].value;
175 if (checkbox && theValue==checkboxValue) {
176 document.TSFE_ADMIN_PANEL_FORM[theField+"_hr"].value="";
177 document.TSFE_ADMIN_PANEL_FORM[theField+"_cb"].checked = "";
178 } else {
179 document.TSFE_ADMIN_PANEL_FORM[theField+"_hr"].value = evalFunc.outputObjValue(theFObj, theValue);
180 document.TSFE_ADMIN_PANEL_FORM[theField+"_cb"].checked = "on";
181 }
182 }
183 // TSFEtypo3FormFieldGet()
184 function TSFEtypo3FormFieldGet(theField, evallist, is_in, checkbox, checkboxValue, checkbox_off) { //
185 var theFObj = new evalFunc_dummy (evallist,is_in, checkbox, checkboxValue);
186 if (checkbox_off) {
187 document.TSFE_ADMIN_PANEL_FORM[theField].value=checkboxValue;
188 }else{
189 document.TSFE_ADMIN_PANEL_FORM[theField].value = evalFunc.evalObjValue(theFObj, document.TSFE_ADMIN_PANEL_FORM[theField+"_hr"].value);
190 }
191 TSFEtypo3FormFieldSet(theField, evallist, is_in, checkbox, checkboxValue);
192 }
193 /*]]>*/
194 </script>
195 <script language="javascript" type="text/javascript">'.$this->extJSCODE.'</script>';
196 }
197 return "\n\n\n\n".$out.'<br />';
198 }
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215 /*****************************************************
216 *
217 * Creating sections of the Admin Panel
218 *
219 ****************************************************/
220
221 /**
222 * Creates the content for the "preview" section ("module") of the Admin Panel
223 *
224 * @param string Optional start-value; The generated content is added to this variable.
225 * @return string HTML content for the section. Consists of a string with table-rows with four columns.
226 * @see extPrintFeAdminDialog()
227 */
228 function extGetCategory_preview($out='') {
229 $out.=$this->extGetHead('preview');
230 if ($this->uc['TSFE_adminConfig']['display_preview']) {
231 $this->extNeedUpdate=1;
232 $out.=$this->extGetItem('preview_showHiddenPages', '<input type="hidden" name="TSFE_ADMIN_PANEL[preview_showHiddenPages]" value="0" /><input type="checkbox" name="TSFE_ADMIN_PANEL[preview_showHiddenPages]" value="1"'.($this->uc['TSFE_adminConfig']['preview_showHiddenPages']?' checked="checked"':'').' />');
233 $out.=$this->extGetItem('preview_showHiddenRecords', '<input type="hidden" name="TSFE_ADMIN_PANEL[preview_showHiddenRecords]" value="0" /><input type="checkbox" name="TSFE_ADMIN_PANEL[preview_showHiddenRecords]" value="1"'.($this->uc['TSFE_adminConfig']['preview_showHiddenRecords']?' checked="checked"':'').' />');
234
235 // Simulate data
236 $out.=$this->extGetItem('preview_simulateDate', '<input type="checkbox" name="TSFE_ADMIN_PANEL[preview_simulateDate]_cb" onclick="TSFEtypo3FormFieldGet(\'TSFE_ADMIN_PANEL[preview_simulateDate]\', \'datetime\', \'\',1,0,1);" /><input type="text" name="TSFE_ADMIN_PANEL[preview_simulateDate]_hr" onchange="TSFEtypo3FormFieldGet(\'TSFE_ADMIN_PANEL[preview_simulateDate]\', \'datetime\', \'\', 1,0);" /><input type="hidden" name="TSFE_ADMIN_PANEL[preview_simulateDate]" value="'.$this->uc['TSFE_adminConfig']['preview_simulateDate'].'" />');
237 $this->extJSCODE.='TSFEtypo3FormFieldSet("TSFE_ADMIN_PANEL[preview_simulateDate]", "datetime", "", 1,0);';
238
239 // Simulate fe_user:
240 $query = 'SELECT fe_groups.uid, fe_groups.title FROM fe_groups,pages WHERE pages.uid=fe_groups.pid AND NOT pages.deleted '.t3lib_BEfunc::deleteClause('fe_groups').' AND '.$this->getPagePermsClause(1);
241 $res = mysql(TYPO3_db, $query);
242 echo mysql_error();
243 $options='<option value="0"></option>';
244 while($row=mysql_fetch_assoc($res)) {
245 $options.='<option value="'.$row['uid'].'"'.($this->uc['TSFE_adminConfig']['preview_simulateUserGroup']==$row['uid']?' selected="selected"':'').'>'.htmlspecialchars('['.$row['uid'].'] '.$row['title']).'</option>';
246 }
247 $out.=$this->extGetItem('preview_simulateUserGroup', '<select name="TSFE_ADMIN_PANEL[preview_simulateUserGroup]">'.$options.'</select>');
248 }
249 return $out;
250 }
251
252 /**
253 * Creates the content for the "cache" section ("module") of the Admin Panel
254 *
255 * @param string Optional start-value; The generated content is added to this variable.
256 * @return string HTML content for the section. Consists of a string with table-rows with four columns.
257 * @see extPrintFeAdminDialog()
258 */
259 function extGetCategory_cache($out='') {
260 $out.=$this->extGetHead('cache');
261 if ($this->uc['TSFE_adminConfig']['display_cache']) {
262 $this->extNeedUpdate=1;
263 $out.=$this->extGetItem('cache_noCache', '<input type="hidden" name="TSFE_ADMIN_PANEL[cache_noCache]" value="0" /><input type="checkbox" name="TSFE_ADMIN_PANEL[cache_noCache]" value="1"'.($this->uc['TSFE_adminConfig']['cache_noCache']?' checked="checked"':'').' />');
264
265 $options='';
266 $options.='<option value="0"'.($this->uc['TSFE_adminConfig']['cache_clearCacheLevels']==0?' selected="selected"':'').'>'.$this->extGetLL('div_Levels_0').'</option>';
267 $options.='<option value="1"'.($this->uc['TSFE_adminConfig']['cache_clearCacheLevels']==1?' selected="selected"':'').'>'.$this->extGetLL('div_Levels_1').'</option>';
268 $options.='<option value="2"'.($this->uc['TSFE_adminConfig']['cache_clearCacheLevels']==2?' selected="selected"':'').'>'.$this->extGetLL('div_Levels_2').'</option>';
269 $out.=$this->extGetItem('cache_clearLevels', '<select name="TSFE_ADMIN_PANEL[cache_clearCacheLevels]">'.$options.'</select>'.
270 '<input type="hidden" name="TSFE_ADMIN_PANEL[cache_clearCacheId]" value="'.$GLOBALS['TSFE']->id.'" /><input type="submit" value="'.$this->extGetLL('update').'" />');
271
272 // Generating tree:
273 $depth=$this->extGetFeAdminValue('cache','clearCacheLevels');
274 $outTable='';
275 $this->extPageInTreeInfo=array();
276 $this->extPageInTreeInfo[]=array($GLOBALS['TSFE']->page['uid'],$GLOBALS['TSFE']->page['title'],$depth+1);
277 $this->extGetTreeList($GLOBALS['TSFE']->id, $depth,0,$this->getPagePermsClause(1));
278 reset($this->extPageInTreeInfo);
279 while(list(,$row)=each($this->extPageInTreeInfo)) {
280 $outTable.='<tr><td nowrap="nowrap"><img src="clear.gif" width="'.(($depth+1-$row[2])*18).'" height="1" alt="" /><img src="t3lib/gfx/i/pages.gif" width="18" height="16" align="absmiddle" border="0" alt="" />'.$this->extFw($row[1]).'</td><td><img src="clear.gif" width="10" height="1" alt="" /></td><td>'.$this->extFw($this->extGetNumberOfCachedPages($row[0])).'</td></tr>';
281 }
282 $outTable='<br /><table border="0" cellpadding="0" cellspacing="0">'.$outTable.'</table>';
283 $outTable.='<input type="submit" name="TSFE_ADMIN_PANEL[action][clearCache]" value="'.$this->extGetLL('cache_doit').'" />';
284 $out.=$this->extGetItem('cache_cacheEntries', $outTable);
285
286 }
287 return $out;
288 }
289
290 /**
291 * Creates the content for the "publish" section ("module") of the Admin Panel
292 *
293 * @param string Optional start-value; The generated content is added to this variable.
294 * @return string HTML content for the section. Consists of a string with table-rows with four columns.
295 * @see extPrintFeAdminDialog()
296 */
297 function extGetCategory_publish($out='') {
298 $out.=$this->extGetHead('publish');
299 if ($this->uc['TSFE_adminConfig']['display_publish']) {
300 $this->extNeedUpdate=1;
301 $options='';
302 $options.='<option value="0"'.($this->uc['TSFE_adminConfig']['publish_levels']==0?' selected="selected"':'').'>'.$this->extGetLL('div_Levels_0').'</option>';
303 $options.='<option value="1"'.($this->uc['TSFE_adminConfig']['publish_levels']==1?' selected="selected"':'').'>'.$this->extGetLL('div_Levels_1').'</option>';
304 $options.='<option value="2"'.($this->uc['TSFE_adminConfig']['publish_levels']==2?' selected="selected"':'').'>'.$this->extGetLL('div_Levels_2').'</option>';
305 $out.=$this->extGetItem('publish_levels', '<select name="TSFE_ADMIN_PANEL[publish_levels]">'.$options.'</select>'.
306 '<input type="hidden" name="TSFE_ADMIN_PANEL[publish_id]" value="'.$GLOBALS['TSFE']->id.'" /><input type="submit" value="'.$this->extGetLL('update').'" />');
307
308 // Generating tree:
309 $depth=$this->extGetFeAdminValue('publish','levels');
310 $outTable='';
311 $this->extPageInTreeInfo=array();
312 $this->extPageInTreeInfo[]=array($GLOBALS['TSFE']->page['uid'],$GLOBALS['TSFE']->page['title'],$depth+1);
313 $this->extGetTreeList($GLOBALS['TSFE']->id, $depth,0,$this->getPagePermsClause(1));
314 reset($this->extPageInTreeInfo);
315 while(list(,$row)=each($this->extPageInTreeInfo)) {
316 $outTable.='<tr><td nowrap="nowrap"><img src="clear.gif" width="'.(($depth+1-$row[2])*18).'" height="1" alt="" /><img src="t3lib/gfx/i/pages.gif" width="18" height="16" align="absmiddle" border="0" alt="" />'.$this->extFw($row[1]).'</td><td><img src="clear.gif" width="10" height="1" alt="" /></td><td>'.$this->extFw('...').'</td></tr>';
317 }
318 $outTable='<br /><table border="0" cellpadding="0" cellspacing="0">'.$outTable.'</table>';
319 $outTable.='<input type="submit" name="TSFE_ADMIN_PANEL[action][publish]" value="'.$this->extGetLL('publish_doit').'" />';
320 $out.=$this->extGetItem('publish_tree', $outTable);
321 }
322 return $out;
323 }
324
325 /**
326 * Creates the content for the "edit" section ("module") of the Admin Panel
327 *
328 * @param string Optional start-value; The generated content is added to this variable.
329 * @return string HTML content for the section. Consists of a string with table-rows with four columns.
330 * @see extPrintFeAdminDialog()
331 */
332 function extGetCategory_edit($out='') {
333 $out.=$this->extGetHead('edit');
334 if ($this->uc['TSFE_adminConfig']['display_edit']) {
335
336 // If another page module was specified, replace the default Page module with the new one
337 $newPageModule = trim($GLOBALS['BE_USER']->getTSConfigVal('options.overridePageModule'));
338 $pageModule = t3lib_BEfunc::isModuleSetInTBE_MODULES($newPageModule) ? $newPageModule : 'web_layout';
339
340 $this->extNeedUpdate=1;
341 $out.=$this->extGetItem('edit_displayFieldIcons', '<input type="hidden" name="TSFE_ADMIN_PANEL[edit_displayFieldIcons]" value="0" /><input type="checkbox" name="TSFE_ADMIN_PANEL[edit_displayFieldIcons]" value="1"'.($this->uc['TSFE_adminConfig']['edit_displayFieldIcons']?' checked="checked"':'').' />');
342 $out.=$this->extGetItem('edit_displayIcons', '<input type="hidden" name="TSFE_ADMIN_PANEL[edit_displayIcons]" value="0" /><input type="checkbox" name="TSFE_ADMIN_PANEL[edit_displayIcons]" value="1"'.($this->uc['TSFE_adminConfig']['edit_displayIcons']?' checked="checked"':'').' />');
343 $out.=$this->extGetItem('edit_editFormsOnPage', '<input type="hidden" name="TSFE_ADMIN_PANEL[edit_editFormsOnPage]" value="0" /><input type="checkbox" name="TSFE_ADMIN_PANEL[edit_editFormsOnPage]" value="1"'.($this->uc['TSFE_adminConfig']['edit_editFormsOnPage']?' checked="checked"':'').' />');
344 $out.=$this->extGetItem('edit_editNoPopup', '<input type="hidden" name="TSFE_ADMIN_PANEL[edit_editNoPopup]" value="0" /><input type="checkbox" name="TSFE_ADMIN_PANEL[edit_editNoPopup]" value="1"'.($this->uc['TSFE_adminConfig']['edit_editNoPopup']?' checked="checked"':'').' />');
345
346 $out.=$this->extGetItem('', $this->ext_makeToolBar());
347 if (!t3lib_div::GPvar('ADMCMD_view')) {
348 $out.=$this->extGetItem('', '<a href="#" onclick="'.
349 htmlspecialchars('
350 if (parent.opener && parent.opener.top && parent.opener.top.TS) {
351 parent.opener.top.fsMod.recentIds["web"]='.intval($GLOBALS['TSFE']->page['uid']).';
352 if (parent.opener.top.content && parent.opener.top.content.nav_frame && parent.opener.top.content.nav_frame.refresh_nav) {
353 parent.opener.top.content.nav_frame.refresh_nav();
354 }
355 parent.opener.top.goToModule("'.$pageModule.'");
356 parent.opener.top.focus();
357 } else {
358 vHWin=window.open(\''.TYPO3_mainDir.'alt_main.php\',\''.md5('Typo3Backend-'.$GLOBALS['TYPO3_CONF_VARS']['SYS']['sitename']).'\',\'status=1,menubar=1,scrollbars=1,resizable=1\');
359 vHWin.focus();
360 }
361 return false;
362 ').
363 '">'.$this->extFw($this->extGetLL('edit_openAB')).'</a>');
364 }
365 }
366 return $out;
367 }
368
369 /**
370 * Creates the content for the "tsdebug" section ("module") of the Admin Panel
371 *
372 * @param string Optional start-value; The generated content is added to this variable.
373 * @return string HTML content for the section. Consists of a string with table-rows with four columns.
374 * @see extPrintFeAdminDialog()
375 */
376 function extGetCategory_tsdebug($out='') {
377 $out.=$this->extGetHead('tsdebug');
378 if ($this->uc['TSFE_adminConfig']['display_tsdebug']) {
379 $this->extNeedUpdate=1;
380 $out.=$this->extGetItem('tsdebug_tree', '<input type="hidden" name="TSFE_ADMIN_PANEL[tsdebug_tree]" value="0" /><input type="checkbox" name="TSFE_ADMIN_PANEL[tsdebug_tree]" value="1"'.($this->uc['TSFE_adminConfig']['tsdebug_tree']?' checked="checked"':'').' />');
381 $out.=$this->extGetItem('tsdebug_displayTimes', '<input type="hidden" name="TSFE_ADMIN_PANEL[tsdebug_displayTimes]" value="0" /><input type="checkbox" name="TSFE_ADMIN_PANEL[tsdebug_displayTimes]" value="1"'.($this->uc['TSFE_adminConfig']['tsdebug_displayTimes']?' checked="checked"':'').' />');
382 $out.=$this->extGetItem('tsdebug_displayMessages', '<input type="hidden" name="TSFE_ADMIN_PANEL[tsdebug_displayMessages]" value="0" /><input type="checkbox" name="TSFE_ADMIN_PANEL[tsdebug_displayMessages]" value="1"'.($this->uc['TSFE_adminConfig']['tsdebug_displayMessages']?' checked="checked"':'').' />');
383 $out.=$this->extGetItem('tsdebug_LR', '<input type="hidden" name="TSFE_ADMIN_PANEL[tsdebug_LR]" value="0" /><input type="checkbox" name="TSFE_ADMIN_PANEL[tsdebug_LR]" value="1"'.($this->uc['TSFE_adminConfig']['tsdebug_LR']?' checked="checked"':'').' />');
384 $out.=$this->extGetItem('tsdebug_displayContent', '<input type="hidden" name="TSFE_ADMIN_PANEL[tsdebug_displayContent]" value="0" /><input type="checkbox" name="TSFE_ADMIN_PANEL[tsdebug_displayContent]" value="1"'.($this->uc['TSFE_adminConfig']['tsdebug_displayContent']?' checked="checked"':'').' />');
385 $out.=$this->extGetItem('tsdebug_displayQueries', '<input type="hidden" name="TSFE_ADMIN_PANEL[tsdebug_displayQueries]" value="0" /><input type="checkbox" name="TSFE_ADMIN_PANEL[tsdebug_displayQueries]" value="1"'.($this->uc['TSFE_adminConfig']['tsdebug_displayQueries']?' checked="checked"':'').' />');
386
387 $out.=$this->extGetItem('tsdebug_forceTemplateParsing', '<input type="hidden" name="TSFE_ADMIN_PANEL[tsdebug_forceTemplateParsing]" value="0" /><input type="checkbox" name="TSFE_ADMIN_PANEL[tsdebug_forceTemplateParsing]" value="1"'.($this->uc['TSFE_adminConfig']['tsdebug_forceTemplateParsing']?' checked="checked"':'').' />');
388
389 $GLOBALS['TT']->printConf['flag_tree'] = $this->extGetFeAdminValue('tsdebug','tree');
390 $GLOBALS['TT']->printConf['allTime'] = $this->extGetFeAdminValue('tsdebug','displayTimes');
391 $GLOBALS['TT']->printConf['flag_messages'] = $this->extGetFeAdminValue('tsdebug','displayMessages');
392 $GLOBALS['TT']->printConf['flag_content'] = $this->extGetFeAdminValue('tsdebug','displayContent');
393 $GLOBALS['TT']->printConf['flag_queries'] = $this->extGetFeAdminValue('tsdebug','displayQueries');
394 $out.='<tr><td><img src="clear.gif" width="50" height="1" alt="" /></td><td colspan="3">'.$GLOBALS['TT']->printTSlog().'</td></tr>';
395 }
396 return $out;
397 }
398
399 /**
400 * Creates the content for the "info" section ("module") of the Admin Panel
401 *
402 * @param string Optional start-value; The generated content is added to this variable.
403 * @return string HTML content for the section. Consists of a string with table-rows with four columns.
404 * @see extPrintFeAdminDialog()
405 */
406 function extGetCategory_info($out='') {
407 $out.=$this->extGetHead('info');
408 if ($this->uc['TSFE_adminConfig']['display_info']) {
409
410 if (is_array($GLOBALS['TSFE']->imagesOnPage) && $this->extGetFeAdminValue('cache','noCache')) {
411 reset($GLOBALS['TSFE']->imagesOnPage);
412 $theBytes=0;
413 $count=0;
414 $fileTable='';
415 while(list(,$file)=each($GLOBALS['TSFE']->imagesOnPage)) {
416 $fs=@filesize($file);
417 $fileTable.='<tr><td>'.$this->extFw($file).'</td><td align="right">'.$this->extFw(t3lib_div::formatSize($fs)).'</td></tr>';
418 $theBytes+=$fs;
419 $count++;
420 }
421 $fileTable.='<tr><td><strong>'.$this->extFw('Total number of images:').'</strong></td><td>'.$this->extFw($count).'</td></tr>';
422 $fileTable.='<tr><td><strong>'.$this->extFw('Total image file sizes:').'</strong></td><td align="right">'.$this->extFw(t3lib_div::formatSize($theBytes)).'</td></tr>';
423 $fileTable.='<tr><td><strong>'.$this->extFw('Document size:').'</strong></td><td align="right">'.$this->extFw(t3lib_div::formatSize(strlen($GLOBALS['TSFE']->content))).'</td></tr>';
424 $fileTable.='<tr><td><strong>'.$this->extFw('Total page load:').'</strong></td><td align="right">'.$this->extFw(t3lib_div::formatSize(strlen($GLOBALS['TSFE']->content)+$theBytes)).'</td></tr>';
425 $fileTable.='<tr><td>&nbsp;</td></tr>';
426 }
427
428 $fileTable.='<tr><td>'.$this->extFw('id:').'</td><td>'.$this->extFw($GLOBALS['TSFE']->id).'</td></tr>';
429 $fileTable.='<tr><td>'.$this->extFw('type:').'</td><td>'.$this->extFw($GLOBALS['TSFE']->type).'</td></tr>';
430 $fileTable.='<tr><td>'.$this->extFw('gr_list:').'</td><td>'.$this->extFw($GLOBALS['TSFE']->gr_list).'</td></tr>';
431 $fileTable.='<tr><td>'.$this->extFw('no_cache:').'</td><td>'.$this->extFw($GLOBALS['TSFE']->no_cache).'</td></tr>';
432 $fileTable.='<tr><td>'.$this->extFw('fe_user, name:').'</td><td>'.$this->extFw($GLOBALS['TSFE']->fe_user->user['username']).'</td></tr>';
433 $fileTable.='<tr><td>'.$this->extFw('fe_user, uid:').'</td><td>'.$this->extFw($GLOBALS['TSFE']->fe_user->user['uid']).'</td></tr>';
434 $fileTable.='<tr><td>&nbsp;</td></tr>';
435
436 // parsetime:
437 $fileTable.='<tr><td>'.$this->extFw('Total parsetime:').'</td><td>'.$this->extFw($GLOBALS['TSFE']->scriptParseTime.' ms').'</td></tr>';
438
439 $fileTable='<table border="0" cellpadding="0" cellspacing="0">'.$fileTable.'</table>';
440
441 $out.='<tr><td><img src="clear.gif" width="50" height="1" alt="" /></td><td colspan="3">'.$fileTable.'</td></tr>';
442 }
443 return $out;
444 }
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463 /*****************************************************
464 *
465 * Admin Panel Layout Helper functions
466 *
467 ****************************************************/
468
469 /**
470 * Returns a row (with colspan=4) which is a header for a section in the Admin Panel.
471 * It will have a plus/minus icon and a label which is linked so that it submits the form which surrounds the whole Admin Panel when clicked, alterting the TSFE_ADMIN_PANEL[display_'.$pre.'] value
472 * See the functions extGetCategory_*
473 *
474 * @param string The suffix to the display_ label. Also selects the label from the LOCAL_LANG array.
475 * @return string HTML table row.
476 * @access private
477 * @see extGetItem()
478 */
479 function extGetHead($pre) {
480 $out.='<img src="t3lib/gfx/ol/blank.gif" width="18" height="16" align="absmiddle" border="0" alt="" />';
481 $out.='<img src="t3lib/gfx/ol/'.($this->uc['TSFE_adminConfig']['display_'.$pre]?'minus':'plus').'bullet.gif" width="18" height="16" align="absmiddle" border="0" alt="" />';
482 $out.=$this->extFw($this->extGetLL($pre));
483 $out=$this->extItemLink($pre,$out);
484 return '<tr><td bgcolor="#ABBBB4" colspan="4" nowrap="nowrap">'.$out.'<input type="hidden" name="TSFE_ADMIN_PANEL[display_'.$pre.']" value="'.$this->uc['TSFE_adminConfig']['display_'.$pre].'" /></td></tr>';
485 }
486
487 /**
488 * Wraps a string in a link which will open/close a certain part of the Admin Panel
489 *
490 * @param string The code for the display_ label/key
491 * @param string Input string
492 * @return string Linked input string
493 * @access private
494 * @see extGetHead()
495 */
496 function extItemLink($pre,$str) {
497 return '<a href="#" onclick="'.
498 htmlspecialchars('document.TSFE_ADMIN_PANEL_FORM[\'TSFE_ADMIN_PANEL[display_'.$pre.']\'].value='.($this->uc['TSFE_adminConfig']['display_'.$pre]?'0':'1').'; document.TSFE_ADMIN_PANEL_FORM.submit(); return false;').
499 '">'.$str.'</a>';
500 }
501
502 /**
503 * Returns a row (with 4 columns) for content in a section of the Admin Panel.
504 * It will take $pre as a key to a label to display and $element as the content to put into the forth cell.
505 *
506 * @param string Key to label
507 * @param string The HTML content for the forth table cell.
508 * @return string HTML table row.
509 * @access private
510 * @see extGetHead()
511 */
512 function extGetItem($pre,$element) {
513 return '<tr>
514 <td><img src="clear.gif" width="50" height="1" alt="" /></td>
515 <td nowrap="nowrap">'.($pre ? $this->extFw($this->extGetLL($pre)) : '&nbsp;').'</td>
516 <td><img src="clear.gif" width="10" height="1" alt="" /></td>
517 <td>'.$element.'</td>
518 </tr>';
519
520 }
521
522 /**
523 * Wraps a string in a font-tag with verdana, size 1 and black
524 *
525 * @param string The string to wrap
526 * @return string
527 */
528 function extFw($str) {
529 return '<font face="Verdana" size="1" color="black"'.($GLOBALS['CLIENT']['FORMSTYLE']?' style="color:black;"':'').'>'.$str.'</font>';
530 }
531
532 /**
533 * Creates the tool bar links for the "edit" section of the Admin Panel.
534 *
535 * @return string A string containing images wrapped in <a>-tags linking them to proper functions.
536 */
537 function ext_makeToolBar() {
538 // If mod.web_list.newContentWiz.overrideWithExtension is set, use that extension's create new content wizard instead:
539 $tmpTSc = t3lib_BEfunc::getModTSconfig($this->pageinfo['uid'],'mod.web_list');
540 $tmpTSc = $tmpTSc ['properties']['newContentWiz.']['overrideWithExtension'];
541 $newContentWizScriptPath = t3lib_extMgm::isLoaded($tmpTSc) ? (t3lib_extMgm::extRelPath($tmpTSc).'mod1/db_new_content_el.php') : (TYPO3_mainDir.'sysext/cms/layout/db_new_content_el.php');
542
543 $toolBar='';
544 $id = $GLOBALS['TSFE']->id;
545 $toolBar.='<a href="'.htmlspecialchars(TYPO3_mainDir.'show_rechis.php?element='.rawurlencode('pages:'.$id).'&returnUrl='.rawurlencode(t3lib_div::getIndpEnv('REQUEST_URI'))).'#latest">'.
546 '<img src="t3lib/gfx/history2.gif" width="13" height="12" hspace="2" border="0" align="top" title="'.$this->extGetLL('edit_recordHistory').'" alt="" /></a>';
547 $toolBar.='<a href="'.htmlspecialchars($newContentWizScriptPath.'?id='.$id.'&returnUrl='.rawurlencode(t3lib_div::getIndpEnv('REQUEST_URI'))).'">'.
548 '<img src="t3lib/gfx/new_record.gif" width="16" height="12" hspace="1" border="0" align="top" title="'.$this->extGetLL('edit_newContentElement').'" alt="" /></a>';
549 $toolBar.='<a href="'.htmlspecialchars(TYPO3_mainDir.'move_el.php?table=pages&uid='.$id.'&returnUrl='.rawurlencode(t3lib_div::getIndpEnv('REQUEST_URI'))).'">'.
550 '<img src="t3lib/gfx/move_page.gif" width="11" height="12" hspace="2" border="0" align="top" title="'.$this->extGetLL('edit_move_page').'" alt="" /></a>';
551 $toolBar.='<a href="'.htmlspecialchars(TYPO3_mainDir.'db_new.php?id='.$id.'&pagesOnly=1&returnUrl='.rawurlencode(t3lib_div::getIndpEnv('REQUEST_URI'))).'">'.
552 '<img src="t3lib/gfx/new_page.gif" width="13" height="12" hspace="0" border="0" align="top" title="'.$this->extGetLL('edit_newPage').'" alt="" /></a>';
553
554 $params='&edit[pages]['.$id.']=edit';
555 $toolBar.='<a href="'.htmlspecialchars(TYPO3_mainDir.'alt_doc.php?'.$params.'&noView=1&returnUrl='.rawurlencode(t3lib_div::getIndpEnv('REQUEST_URI'))).'">'.
556 '<img src="t3lib/gfx/edit2.gif" width="11" height="12" hspace="2" border="0" align="top" title="'.$this->extGetLL('edit_editPageHeader').'" alt="" /></a>';
557 if ($this->check('modules','web_list')) {
558 $toolBar.='<a href="'.htmlspecialchars(TYPO3_mainDir.'db_list.php?id='.$id.'&returnUrl='.rawurlencode(t3lib_div::getIndpEnv('REQUEST_URI'))).'">'.
559 '<img src="t3lib/gfx/list.gif" width="11" height="11" hspace="2" border="0" align="top" title="'.$this->extGetLL('edit_db_list').'" alt="" /></a>';
560 }
561 return $toolBar;
562 }
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582 /*****************************************************
583 *
584 * TSFE BE user Access Functions
585 *
586 ****************************************************/
587
588 /**
589 * Evaluates if the Backend User has read access to the input page record.
590 * The evaluation is based on both read-permission and whether the page is found in one of the users webmounts. Only if both conditions are true will the function return true.
591 * Read access means that previewing is allowed etc.
592 * Used in index_ts.php
593 *
594 * @param array The page record to evaluate for
595 * @return boolean True if read access
596 */
597 function extPageReadAccess($pageRec) {
598 return $this->isInWebMount($pageRec['uid']) && $this->doesUserHaveAccess($pageRec,1);
599 }
600
601 /**
602 * Checks if a Admin Panel section ("module") is available for the user. If so, true is returned.
603 *
604 * @param string The module key, eg. "edit", "preview", "info" etc.
605 * @return boolean
606 * @see extPrintFeAdminDialog()
607 */
608 function extAdmModuleEnabled($key) {
609 // Returns true if the module checked is "preview" and the forcePreview flag is set.
610 if ($key=="preview" && $this->ext_forcePreview) return true;
611 // If key is not set, only "all" is checked
612 if ($this->extAdminConfig['enable.']['all']) return true;
613 if ($this->extAdminConfig['enable.'][$key]) {
614 return true;
615 }
616 }
617
618 /**
619 * Saves any change in settings made in the Admin Panel.
620 * Called from index_ts.php right after access check for the Admin Panel
621 *
622 * @return void
623 */
624 function extSaveFeAdminConfig() {
625 if (is_array($GLOBALS['HTTP_POST_VARS']['TSFE_ADMIN_PANEL'])) {
626 // Setting
627 $input = $GLOBALS['HTTP_POST_VARS']['TSFE_ADMIN_PANEL'];
628 $this->uc['TSFE_adminConfig'] = array_merge(!is_array($this->uc['TSFE_adminConfig'])?array():$this->uc['TSFE_adminConfig'], $input); // Candidate for t3lib_div::array_merge() if integer-keys will some day make trouble...
629 unset($this->uc['TSFE_adminConfig']['action']);
630
631 // Actions:
632 if ($input['action']['clearCache'] && $this->extAdmModuleEnabled('cache')) {
633 $this->extPageInTreeInfo=array();
634 $theStartId = intval($input['cache_clearCacheId']);
635 $GLOBALS['TSFE']->clearPageCacheContent_pidList($this->extGetTreeList($theStartId, $this->extGetFeAdminValue('cache','clearCacheLevels'),0,$this->getPagePermsClause(1)).$theStartId);
636 }
637 if ($input['action']['publish'] && $this->extAdmModuleEnabled('publish')) {
638 $theStartId = intval($input['publish_id']);
639 $this->extPublishList = $this->extGetTreeList($theStartId, $this->extGetFeAdminValue('publish','levels'),0,$this->getPagePermsClause(1)).$theStartId;
640 }
641
642 // Saving
643 $this->writeUC();
644 }
645 $GLOBALS['TT']->LR = $this->extGetFeAdminValue('tsdebug','LR');
646 if ($this->extGetFeAdminValue('cache','noCache')) {$GLOBALS['TSFE']->set_no_cache();}
647 }
648
649 /**
650 * Returns the value for a Admin Panel setting. You must specify both the module-key and the internal setting key.
651 *
652 * @param string Module key
653 * @param string Setting key
654 * @return string The setting value
655 */
656 function extGetFeAdminValue($pre,$val='') {
657 if ($this->extAdmModuleEnabled($pre)) { // Check if module is enabled.
658 // Exceptions where the values can be overridden from backend:
659 if ($pre.'_'.$val == 'edit_displayIcons' && $this->extAdminConfig['module.']['edit.']['forceDisplayIcons']) {
660 return true;
661 }
662 if ($pre.'_'.$val == 'edit_displayFieldIcons' && $this->extAdminConfig['module.']['edit.']['forceDisplayFieldIcons']) {
663 return true;
664 }
665
666 $retVal = $val ? $this->uc['TSFE_adminConfig'][$pre.'_'.$val] : 1;
667
668 if ($pre=='preview' && $this->ext_forcePreview) {
669 if (!$val) {
670 return true;
671 } else {
672 return $retVal;
673 }
674 }
675
676 // regular check:
677 if ($this->extIsAdmMenuOpen($pre)) { // See if the menu is expanded!
678 return $retVal;
679 }
680 }
681 }
682
683 /**
684 * Returns true if admin panel module is open
685 *
686 * @param string Module key
687 * @return boolean True, if the admin panel is open for the specified admin panel module key.
688 */
689 function extIsAdmMenuOpen($pre) {
690 return $this->uc['TSFE_adminConfig']['display_top'] && $this->uc['TSFE_adminConfig']['display_'.$pre];
691 }
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708 /*****************************************************
709 *
710 * TSFE BE user Access Functions
711 *
712 ****************************************************/
713
714 /**
715 * Generates a list of Page-uid's from $id. List does not include $id itself
716 * The only pages excluded from the list are deleted pages.
717 *
718 * @param integer Start page id
719 * @param integer Depth to traverse down the page tree.
720 * @param integer $begin is an optional integer that determines at which level in the tree to start collecting uid's. Zero means 'start right away', 1 = 'next level and out'
721 * @param string Perms clause
722 * @return string Returns the list with a comma in the end (if any pages selected!)
723 */
724 function extGetTreeList($id,$depth,$begin=0,$perms_clause) {
725 $depth=intval($depth);
726 $begin=intval($begin);
727 $id=intval($id);
728 $theList='';
729
730 if ($id && $depth>0) {
731 $query = 'SELECT uid,title FROM pages WHERE pid='.$id.' AND doktype IN ('.$GLOBALS['TYPO3_CONF_VARS']['FE']['content_doktypes'].') AND NOT deleted AND '.$perms_clause;
732 $res = mysql(TYPO3_db, $query);
733 echo mysql_error();
734 while ($row = mysql_fetch_assoc($res)) {
735 if ($begin<=0) {
736 $theList.=$row['uid'].',';
737 $this->extPageInTreeInfo[]=array($row['uid'],$row['title'],$depth);
738 }
739 if ($depth>1) {
740 $theList.=$this->extGetTreeList($row['uid'], $depth-1,$begin-1,$perms_clause);
741 }
742 }
743 }
744 return $theList;
745 }
746
747 /**
748 * Returns the number of cached pages for a page id.
749 *
750 * @param integer The page id.
751 * @return integer The number of pages for this page in the table "cache_pages"
752 */
753 function extGetNumberOfCachedPages($page_id) {
754 $res = mysql (TYPO3_db, 'SELECT count(*) FROM cache_pages WHERE page_id='.intval($page_id));
755 list($num) = mysql_fetch_row($res);
756 return $num;
757 }
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779 /*****************************************************
780 *
781 * Localization handling
782 *
783 ****************************************************/
784
785 /**
786 * Returns the label for key, $key. If a translation for the language set in $this->uc['lang'] is found that is returned, otherwise the default value.
787 * IF the global variable $LOCAL_LANG is NOT an array (yet) then this function loads the global $LOCAL_LANG array with the content of "sysext/lang/locallang_tsfe.php" so that the values therein can be used for labels in the Admin Panel
788 *
789 * @param string Key for a label in the $LOCAL_LANG array of "sysext/lang/locallang_tsfe.php"
790 * @return string The value for the $key
791 */
792 function extGetLL($key) {
793 global $LOCAL_LANG;
794 if (!is_array($LOCAL_LANG)) {
795 include('./'.TYPO3_mainDir.'sysext/lang/locallang_tsfe.php');
796 if (!is_array($LOCAL_LANG)) $LOCAL_LANG=array();
797 }
798
799 $labelStr = htmlspecialchars($GLOBALS['LANG']->getLL($key)); // Label string in the default backend output charset.
800
801 // Convert to utf-8, then to entities:
802 if ($GLOBALS['LANG']->charSet!='utf-8') {
803 $labelStr = $GLOBALS['LANG']->csConvObj->utf8_encode($labelStr,$GLOBALS['LANG']->charSet);
804 }
805 $labelStr = $GLOBALS['LANG']->csConvObj->utf8_to_entities($labelStr);
806
807 // Return the result:
808 return $labelStr;
809 }
810
811
812
813
814
815
816
817
818
819
820
821
822
823 /*****************************************************
824 *
825 * Frontend Editing
826 *
827 ****************************************************/
828
829 /**
830 * Returns true in an edit-action is sent from the Admin Panel
831 *
832 * @return boolean
833 * @see index_ts.php
834 */
835 function extIsEditAction() {
836 $TSFE_EDIT = $GLOBALS['HTTP_POST_VARS']['TSFE_EDIT'];
837 if (is_array($TSFE_EDIT)) {
838 /* $cmd=(string)$TSFE_EDIT['cmd'];
839 if ($cmd!="edit" && $cmd!='new') {
840 return true;
841 }*/
842 if ($TSFE_EDIT['cancel']) {
843 unset($TSFE_EDIT['cmd']);
844 } elseif (($cmd!='edit' || (is_array($TSFE_EDIT['data']) && ($TSFE_EDIT['update'] || $TSFE_EDIT['update_close']))) && $cmd!='new') {
845 // $cmd can be a command like "hide" or "move". If $cmd is "edit" or "new" it's an indication to show the formfields. But if data is sent with update-flag then $cmd = edit is accepted because edit may be sendt because of .keepGoing flag.
846 return true;
847 }
848 }
849 }
850
851 /**
852 * Returns true if an edit form is shown on the page.
853 * Used from index_ts.php where a true return-value will result in classes etc. being included.
854 *
855 * @return boolean
856 * @see index_ts.php
857 */
858 function extIsFormShown() {
859 $TSFE_EDIT = $GLOBALS['HTTP_POST_VARS']['TSFE_EDIT'];
860 if (is_array($TSFE_EDIT)) {
861 $cmd=(string)$TSFE_EDIT['cmd'];
862 if ($cmd=='edit' || $cmd=='new') {
863 return true;
864 }
865 }
866 }
867
868 /**
869 * Management of the on-page frontend editing forms and edit panels.
870 * Basically taking in the data and commands and passes them on to the proper classes as they should be.
871 *
872 * @return void
873 * @see index_ts.php
874 */
875 function extEditAction() {
876 global $TCA;
877 // Commands:
878 $TSFE_EDIT = $GLOBALS['HTTP_POST_VARS']['TSFE_EDIT'];
879
880 list($table,$uid) = explode(':',$TSFE_EDIT['record']);
881 if ($TSFE_EDIT['cmd'] && $table && $uid && isset($TCA[$table])) {
882 $tce = t3lib_div::makeInstance('t3lib_TCEmain');
883 $recData=array();
884 $cmdData=array();
885 $cmd=$TSFE_EDIT['cmd'];
886 switch($cmd) {
887 case 'hide':
888 case 'unhide':
889 $hideField = $TCA[$table]['ctrl']['enablecolumns']['disabled'];
890 if ($hideField) {
891 $recData[$table][$uid][$hideField]=($cmd=='hide'?1:0);
892 $tce->start($recData,Array());
893 $tce->process_datamap();
894 }
895 break;
896 case 'up':
897 case 'down':
898 $sortField = $TCA[$table]['ctrl']['sortby'];
899 if ($sortField) {
900 if ($cmd=='up') {
901 $op= '<';
902 $desc=' DESC';
903 } else {
904 $op= '>';
905 $desc='';
906 }
907 // Get self:
908 $fields = array_unique(t3lib_div::trimExplode(',',$TCA[$table]['ctrl']['copyAfterDuplFields'].',uid,pid,'.$sortField,1));
909 $query='SELECT '.implode(',',$fields).' FROM '.$table.' WHERE uid='.$uid;
910 $res = mysql(TYPO3_db,$query);
911 if ($row=mysql_fetch_assoc($res)) {
912 // record before or after
913 $preview = $this->extGetFeAdminValue('preview');
914 $copyAfterFieldsQuery = '';
915 if ($preview) {$ignore = array('starttime'=>1, 'endtime'=>1, 'disabled'=>1, 'fe_group'=>1);}
916 if ($TCA[$table]['ctrl']['copyAfterDuplFields']) {
917 $cAFields = t3lib_div::trimExplode(',',$TCA[$table]['ctrl']['copyAfterDuplFields'],1);
918 while(list(,$fN)=each($cAFields)) {
919 $copyAfterFieldsQuery.=' AND '.$fN.'="'.$row[$fN].'"';
920 }
921 }
922
923 $query='SELECT uid,pid FROM '.$table.' WHERE pid='.$row['pid'].
924 ' AND '.$sortField.$op.intval($row[$sortField]).
925 $copyAfterFieldsQuery.
926 t3lib_pageSelect::enableFields($table,'',$ignore).
927 ' ORDER BY '.$sortField.$desc.
928 ' LIMIT 2';
929
930 $res = mysql(TYPO3_db,$query);
931 if ($row2=mysql_fetch_assoc($res)) {
932 if($cmd=='down') {
933 $cmdData[$table][$uid]['move']= -$row2['uid'];
934 } elseif ($row3=mysql_fetch_assoc($res)) { // Must take the second record above...
935 $cmdData[$table][$uid]['move']= -$row3['uid'];
936 } else { // ... and if that does not exist, use pid
937 $cmdData[$table][$uid]['move']= $row['pid'];
938 }
939 } elseif ($cmd=='up') {
940 $cmdData[$table][$uid]['move']= $row['pid'];
941 }
942 }
943 if (count($cmdData)) {
944 $tce->start(Array(),$cmdData);
945 $tce->process_cmdmap();
946 }
947 }
948 break;
949 case 'delete':
950 $cmdData[$table][$uid]['delete']= 1;
951 if (count($cmdData)) {
952 $tce->start(Array(),$cmdData);
953 $tce->process_cmdmap();
954 }
955 break;
956 }
957 }
958 // Data:
959 if (($TSFE_EDIT['doSave'] || $TSFE_EDIT['update'] || $TSFE_EDIT['update_close']) && is_array($TSFE_EDIT['data'])) {
960 $tce = t3lib_div::makeInstance('t3lib_TCEmain');
961 # $tce->stripslashes_values=0; // This line is NOT needed because $TSFE_EDIT['data'] is already slashed and needs slashes stripped.
962 $tce->start($TSFE_EDIT['data'],Array());
963 $tce->process_uploads($GLOBALS['HTTP_POST_FILES']);
964 $tce->process_datamap();
965 }
966 }
967 }
968
969
970 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_tsfebeuserauth.php']) {
971 include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_tsfebeuserauth.php']);
972 }
973 ?>