[BUGFIX] Prevent compression of scripts that use ajax.php
[Packages/TYPO3.CMS.git] / t3lib / class.t3lib_scbase.php
1 <?php
2 /***************************************************************
3 * Copyright notice
4 *
5 * (c) 1999-2011 Kasper Skårhøj (kasperYYYY@typo3.com)
6 * All rights reserved
7 *
8 * This script is part of the TYPO3 project. The TYPO3 project is
9 * free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
13 *
14 * The GNU General Public License can be found at
15 * http://www.gnu.org/copyleft/gpl.html.
16 * A copy is found in the textfile GPL.txt and important notices to the license
17 * from the author is found in LICENSE.txt distributed with these scripts.
18 *
19 *
20 * This script is distributed in the hope that it will be useful,
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 * GNU General Public License for more details.
24 *
25 * This copyright notice MUST APPEAR in all copies of the script!
26 ***************************************************************/
27 /**
28 * Contains the parent class for 'ScriptClasses' in backend modules.
29 *
30 * Revised for TYPO3 3.6 July/2003 by Kasper Skårhøj
31 *
32 * @author Kasper Skårhøj <kasperYYYY@typo3.com>
33 */
34
35
36 /**
37 * EXAMPLE PROTOTYPE
38 *
39 * As for examples there are lots of them if you search for classes which extends 't3lib_SCbase'.
40 * However you can see a prototype example of how a module might use this class in an index.php file typically hosting a backend module.
41 * NOTICE: This example only outlines the basic structure of how this class is used. You should consult the documentation and other real-world examples for some actual things to do when building modules.
42 *
43 * // TYPICAL 'HEADER' OF A BACKEND MODULE:
44 * unset($MCONF);
45 * require ('conf.php');
46 * require ($BACK_PATH.'init.php');
47 * require ($BACK_PATH.'template.php');
48 * $GLOBALS['LANG']->includeLLFile('EXT:prototype/locallang.php');
49 * $GLOBALS['BE_USER']->modAccess($MCONF,1);
50 *
51 * // SC_mod_prototype EXTENDS THE CLASS t3lib_SCbase with a main() and printContent() function:
52 * class SC_mod_prototype extends t3lib_SCbase {
53 * // MAIN FUNCTION - HERE YOU CREATE THE MODULE CONTENT IN $this->content
54 * function main() {
55 * // TYPICALLY THE INTERNAL VAR, $this->doc is instantiated like this:
56 * $this->doc = t3lib_div::makeInstance('mediumDoc');
57 * // TYPICALLY THE INTERNAL VAR, $this->backPath is set like this:
58 * $this->backPath = $this->doc->backPath = $GLOBALS['BACK_PATH'];
59 * // ... AND OF COURSE A LOT OF OTHER THINGS GOES ON - LIKE PUTTING CONTENT INTO $this->content
60 * $this->content='';
61 * }
62 * // PRINT CONTENT - DONE AS THE LAST THING
63 * function printContent() {
64 * echo $this->content;
65 * }
66 * }
67 *
68 * // CHECKING IF THERE ARE AN EXTENSION CLASS CONFIGURED FOR THIS CLASS:
69 * if (defined('TYPO3_MODE') && isset($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS']['ext/prototype/index.php'])) {
70 * include_once($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS']['ext/prototype/index.php']);
71 * }
72 *
73 * // MAKE INSTANCE OF THE SCRIPT CLASS AND CALL init()
74 * $SOBE = t3lib_div::makeInstance('SC_mod_prototype');
75 * $SOBE->init();
76 *
77 * // AFTER INIT THE INTERNAL ARRAY ->include_once MAY HOLD FILENAMES TO INCLUDE
78 * foreach($SOBE->include_once as $INC_FILE) include_once($INC_FILE);
79 *
80 * // THEN WE WILL CHECK IF THERE IS A 'SUBMODULE' REGISTERED TO BE INITIALIZED AS WELL:
81 * $SOBE->checkExtObj();
82 *
83 * // THEN WE CALL THE main() METHOD AND THIS SHOULD SPARK THE CREATION OF THE MODULE OUTPUT.
84 * $SOBE->main();
85 * // FINALLY THE printContent() FUNCTION WILL OUTPUT THE ACCUMULATED CONTENT
86 * $SOBE->printContent();
87 */
88
89 /**
90 * Parent class for 'ScriptClasses' in backend modules.
91 * See example comment above.
92 *
93 * @author Kasper Skårhøj <kasperYYYY@typo3.com>
94 * @package TYPO3
95 * @subpackage t3lib
96 * @see t3lib_extobjbase
97 */
98 class t3lib_SCbase {
99
100 /**
101 * Loaded with the global array $MCONF which holds some module configuration from the conf.php file of backend modules.
102 * @see init()
103 */
104 var $MCONF = array();
105
106 /**
107 * The integer value of the GET/POST var, 'id'. Used for submodules to the 'Web' module (page id)
108 * @see init()
109 */
110 var $id;
111
112 /**
113 * The value of GET/POST var, 'CMD'
114 * @see init()
115 */
116 var $CMD;
117
118 /**
119 * A WHERE clause for selection records from the pages table based on read-permissions of the current backend user.
120 * @see init()
121 */
122 var $perms_clause;
123
124
125 /**
126 * The module menu items array. Each key represents a key for which values can range between the items in the array of that key.
127 * @see init()
128 */
129 var $MOD_MENU = array(
130 'function' => array()
131 );
132
133 /**
134 * Current settings for the keys of the MOD_MENU array
135 * @see $MOD_MENU
136 */
137 var $MOD_SETTINGS = array();
138
139 /**
140 * Module TSconfig based on PAGE TSconfig / USER TSconfig
141 * @see menuConfig()
142 */
143 var $modTSconfig;
144
145 /**
146 * If type is 'ses' then the data is stored as session-lasting data. This means that it'll be wiped out the next time the user logs in.
147 * Can be set from extension classes of this class before the init() function is called.
148 *
149 * @see menuConfig(), t3lib_BEfunc::getModuleData()
150 */
151 var $modMenu_type = '';
152
153 /**
154 * dontValidateList can be used to list variables that should not be checked if their value is found in the MOD_MENU array. Used for dynamically generated menus.
155 * Can be set from extension classes of this class before the init() function is called.
156 *
157 * @see menuConfig(), t3lib_BEfunc::getModuleData()
158 */
159 var $modMenu_dontValidateList = '';
160
161 /**
162 * List of default values from $MOD_MENU to set in the output array (only if the values from MOD_MENU are not arrays)
163 * Can be set from extension classes of this class before the init() function is called.
164 *
165 * @see menuConfig(), t3lib_BEfunc::getModuleData()
166 */
167 var $modMenu_setDefaultList = '';
168
169 /**
170 * Contains module configuration parts from TBE_MODULES_EXT if found
171 *
172 * @see handleExternalFunctionValue()
173 */
174 var $extClassConf;
175
176 /**
177 * Contains absolute paths to class files to include from the global scope. This is done in the module index.php files after calling the init() function
178 *
179 * @see handleExternalFunctionValue()
180 */
181 var $include_once = array();
182
183 /**
184 * Generally used for accumulating the output content of backend modules
185 */
186 var $content = '';
187
188 /**
189 * Generally used to hold an instance of the 'template' class from typo3/template.php
190 *
191 * @var template
192 */
193 var $doc;
194
195 /**
196 * May contain an instance of a 'Function menu module' which connects to this backend module.
197 *
198 * @see checkExtObj()
199 */
200 var $extObj;
201
202
203 /**
204 * Initializes the backend module by setting internal variables, initializing the menu.
205 *
206 * @return void
207 * @see menuConfig()
208 */
209 function init() {
210 // name might be set from outside
211 if (!$this->MCONF['name']) {
212 $this->MCONF = $GLOBALS['MCONF'];
213 }
214 $this->id = intval(t3lib_div::_GP('id'));
215 $this->CMD = t3lib_div::_GP('CMD');
216 $this->perms_clause = $GLOBALS['BE_USER']->getPagePermsClause(1);
217 $this->menuConfig();
218 $this->handleExternalFunctionValue();
219 }
220
221 /**
222 * Initializes the internal MOD_MENU array setting and unsetting items based on various conditions. It also merges in external menu items from the global array TBE_MODULES_EXT (see mergeExternalItems())
223 * Then MOD_SETTINGS array is cleaned up (see t3lib_BEfunc::getModuleData()) so it contains only valid values. It's also updated with any SET[] values submitted.
224 * Also loads the modTSconfig internal variable.
225 *
226 * @return void
227 * @see init(), $MOD_MENU, $MOD_SETTINGS, t3lib_BEfunc::getModuleData(), mergeExternalItems()
228 */
229 function menuConfig() {
230 // page/be_user TSconfig settings and blinding of menu-items
231 $this->modTSconfig = t3lib_BEfunc::getModTSconfig($this->id, 'mod.' . $this->MCONF['name']);
232 $this->MOD_MENU['function'] = $this->mergeExternalItems($this->MCONF['name'], 'function', $this->MOD_MENU['function']);
233 $this->MOD_MENU['function'] = t3lib_BEfunc::unsetMenuItems($this->modTSconfig['properties'], $this->MOD_MENU['function'], 'menu.function');
234
235 #debug($this->MOD_MENU['function'],$this->MCONF['name']);
236 #debug($this->modTSconfig['properties']);
237
238 $this->MOD_SETTINGS = t3lib_BEfunc::getModuleData(
239 $this->MOD_MENU,
240 t3lib_div::_GP('SET'),
241 $this->MCONF['name'],
242 $this->modMenu_type,
243 $this->modMenu_dontValidateList,
244 $this->modMenu_setDefaultList
245 );
246 }
247
248 /**
249 * Merges menu items from global array $TBE_MODULES_EXT
250 *
251 * @param string Module name for which to find value
252 * @param string Menu key, eg. 'function' for the function menu.
253 * @param array The part of a MOD_MENU array to work on.
254 * @return array Modified array part.
255 * @access private
256 * @see t3lib_extMgm::insertModuleFunction(), menuConfig()
257 */
258 function mergeExternalItems($modName, $menuKey, $menuArr) {
259 $mergeArray = $GLOBALS['TBE_MODULES_EXT'][$modName]['MOD_MENU'][$menuKey];
260 if (is_array($mergeArray)) {
261 foreach ($mergeArray as $k => $v) {
262 if ((string) $v['ws'] === '' ||
263 ($GLOBALS['BE_USER']->workspace === 0 && t3lib_div::inList($v['ws'], 'online')) ||
264 ($GLOBALS['BE_USER']->workspace === -1 && t3lib_div::inList($v['ws'], 'offline')) ||
265 ($GLOBALS['BE_USER']->workspace > 0 && t3lib_div::inList($v['ws'], 'custom'))) {
266 $menuArr[$k] = $GLOBALS['LANG']->sL($v['title']);
267 }
268 }
269 }
270 return $menuArr;
271 }
272
273 /**
274 * Loads $this->extClassConf with the configuration for the CURRENT function of the menu.
275 * If for this array the key 'path' is set then that is expected to be an absolute path to a file which should be included - so it is set in the internal array $this->include_once
276 *
277 * @param string The key to MOD_MENU for which to fetch configuration. 'function' is default since it is first and foremost used to get information per "extension object" (I think that is what its called)
278 * @param string The value-key to fetch from the config array. If NULL (default) MOD_SETTINGS[$MM_key] will be used. This is usefull if you want to force another function than the one defined in MOD_SETTINGS[function]. Call this in init() function of your Script Class: handleExternalFunctionValue('function', $forcedSubModKey)
279 * @return void
280 * @see getExternalItemConfig(), $include_once, init()
281 */
282 function handleExternalFunctionValue($MM_key = 'function', $MS_value = NULL) {
283 $MS_value = is_null($MS_value) ? $this->MOD_SETTINGS[$MM_key] : $MS_value;
284 $this->extClassConf = $this->getExternalItemConfig($this->MCONF['name'], $MM_key, $MS_value);
285 if (is_array($this->extClassConf) && $this->extClassConf['path']) {
286 $this->include_once[] = $this->extClassConf['path'];
287 }
288 }
289
290 /**
291 * Returns configuration values from the global variable $TBE_MODULES_EXT for the module given.
292 * For example if the module is named "web_info" and the "function" key ($menuKey) of MOD_SETTINGS is "stat" ($value) then you will have the values of $TBE_MODULES_EXT['webinfo']['MOD_MENU']['function']['stat'] returned.
293 *
294 * @param string Module name
295 * @param string Menu key, eg. "function" for the function menu. See $this->MOD_MENU
296 * @param string Optionally the value-key to fetch from the array that would otherwise have been returned if this value was not set. Look source...
297 * @return mixed The value from the TBE_MODULES_EXT array.
298 * @see handleExternalFunctionValue()
299 */
300 function getExternalItemConfig($modName, $menuKey, $value = '') {
301 return strcmp($value, '') ? $GLOBALS['TBE_MODULES_EXT'][$modName]['MOD_MENU'][$menuKey][$value] : $GLOBALS['TBE_MODULES_EXT'][$modName]['MOD_MENU'][$menuKey];
302 }
303
304 /**
305 * Creates an instance of the class found in $this->extClassConf['name'] in $this->extObj if any (this should hold three keys, "name", "path" and "title" if a "Function menu module" tries to connect...)
306 * This value in extClassConf might be set by an extension (in a ext_tables/ext_localconf file) which thus "connects" to a module.
307 * The array $this->extClassConf is set in handleExternalFunctionValue() based on the value of MOD_SETTINGS[function]
308 * (Should be) called from global scope right after inclusion of files from the ->include_once array.
309 * If an instance is created it is initiated with $this passed as value and $this->extClassConf as second argument. Further the $this->MOD_SETTING is cleaned up again after calling the init function.
310 *
311 * @return void
312 * @see handleExternalFunctionValue(), t3lib_extMgm::insertModuleFunction(), $extObj
313 */
314 function checkExtObj() {
315 if (is_array($this->extClassConf) && $this->extClassConf['name']) {
316 $this->extObj = t3lib_div::makeInstance($this->extClassConf['name']);
317 $this->extObj->init($this, $this->extClassConf);
318 // Re-write:
319 $this->MOD_SETTINGS = t3lib_BEfunc::getModuleData(
320 $this->MOD_MENU,
321 t3lib_div::_GP('SET'),
322 $this->MCONF['name'],
323 $this->modMenu_type,
324 $this->modMenu_dontValidateList,
325 $this->modMenu_setDefaultList
326 );
327 }
328 }
329
330 /**
331 * Calls the checkExtObj function in sub module if present.
332 *
333 * @return void
334 */
335 function checkSubExtObj() {
336 if (is_object($this->extObj)) {
337 $this->extObj->checkExtObj();
338 }
339 }
340
341 /**
342 * Calls the 'header' function inside the "Function menu module" if present.
343 * A header function might be needed to add JavaScript or other stuff in the head. This can't be done in the main function because the head is already written.
344 * example call in the header function:
345 * $this->pObj->doc->JScode = $this->pObj->doc->wrapScriptTags(' ...
346 *
347 * @return void
348 */
349 function extObjHeader() {
350 if (is_callable(array($this->extObj, 'head'))) {
351 $this->extObj->head();
352 }
353 }
354
355 /**
356 * Calls the 'main' function inside the "Function menu module" if present
357 *
358 * @return void
359 */
360 function extObjContent() {
361 $this->extObj->pObj = $this;
362
363 if (is_callable(array($this->extObj, 'main'))) {
364 $this->content .= $this->extObj->main();
365 }
366 }
367 }
368
369 ?>