[TASK] Remove function index
[Packages/TYPO3.CMS.git] / typo3 / sysext / cms / tslib / class.tslib_fetce.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 * Form-data processing
29 * Included from index_ts.php
30 *
31 * Revised for TYPO3 3.6 June/2003 by Kasper Skårhøj
32 *
33 * @author Kasper Skårhøj <kasperYYYY@typo3.com>
34 */
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54 /**
55 * Form-data processing class.
56 * Used by the FE_DATA object found in TSref. Quite old fashioned and used only by a few extensions, like good old 'tt_guest' and 'tt_board'
57 *
58 * @author Kasper Skårhøj <kasperYYYY@typo3.com>
59 * @package TYPO3
60 * @subpackage tslib
61 * @deprecated since TYPO3 3.6
62 */
63 class tslib_feTCE {
64
65 var $extScripts=array();
66 var $extScriptsConf=array();
67 var $newData=array();
68 var $extraList = 'pid';
69
70 /**
71 * Starting the processing of user input.
72 * Traverses the input data and fills in the array, $this->extScripts with references to files which are then included by includeScripts() (called AFTER start() in tslib_fe)
73 * These scripts will then put the content into the database.
74 *
75 * @param array Input data coming from typ. $_POST['data'] vars
76 * @param array TypoScript configuration for the FEDATA object, $this->config['FEData.']
77 * @return void
78 * @see tslib_fe::fe_tce(), includeScripts()
79 */
80 function start($data,$FEData) {
81 foreach ($data as $table => $id_arr) {
82 t3lib_div::loadTCA($table);
83 if (is_array($id_arr)) {
84 $sep=$FEData[$table.'.']['separator']?$FEData[$table.'.']['separator']:LF;
85 foreach ($id_arr as $id => $field_arr) {
86 $this->newData[$table][$id]=Array();
87 if (strstr($id,'NEW')) { // NEW
88 // Defaults:
89 if ($FEData[$table.'.']['default.']) {
90 $this->newData[$table][$id] = $FEData[$table.'.']['default.'];
91 }
92 if ($FEData[$table.'.']['autoInsertPID']) {
93 $this->newData[$table][$id]['pid'] = intval($GLOBALS['TSFE']->page['uid']);
94 }
95 // Insert external data:
96 if (is_array($field_arr)) {
97 foreach ($field_arr as $field => $value) {
98 if ($FEData[$table.'.']['allowNew.'][$field]) {
99 if (is_array($value)) {
100 $this->newData[$table][$id][$field] = implode($sep,$value);
101 } else {
102 $this->newData[$table][$id][$field] = $value;
103 }
104 }
105 }
106 }
107 // Double post check
108 $dPC_field = $FEData[$table.'.']['doublePostCheck'];
109 if (is_array($this->newData[$table][$id]) && $dPC_field) {
110 $doublePostCheckKey = $this->calcDoublePostKey($this->newData[$table][$id]);
111 if ($this->checkDoublePostExist($table,$dPC_field,$doublePostCheckKey)) {
112 unset($this->newData[$table][$id]); // Unsetting the whole thing, because it's not going to be saved.
113 $GLOBALS['TT']->setTSlogMessage('"FEData": Submitted record to table $table was doublePosted (key: $doublePostCheckKey). Nothing saved.',2);
114 } else {
115 $this->newData[$table][$id][$dPC_field] = $doublePostCheckKey; // Setting key value
116 $this->extraList.=','.$dPC_field;
117 }
118 }
119 } else { // EDIT
120 // Insert external data:
121 if (is_array($field_arr)) {
122 foreach ($field_arr as $field => $value) {
123 if ($FEData[$table.'.']['allowEdit.'][$field]) {
124 if (is_array($value)) {
125 $this->newData[$table][$id][$field] = implode($sep,$value);
126 } else {
127 $this->newData[$table][$id][$field] = $value;
128 }
129 }
130 }
131 }
132 // Internal Override
133 if (is_array($FEData[$table.'.']['overrideEdit.'])) {
134 foreach ($FEData[$table.'.']['overrideEdit.'] as $field => $value) {
135 $this->newData[$table][$id][$field] = $value;
136 }
137 }
138 }
139 if ($FEData[$table.'.']['userIdColumn']) {
140 $this->newData[$table][$id][$FEData[$table.'.']['userIdColumn']] = intval($GLOBALS['TSFE']->fe_user->user['uid']);
141 }
142 }
143 $incFile = $GLOBALS['TSFE']->tmpl->getFileName($FEData[$table.'.']['processScript']);
144 if ($incFile) {
145 $this->extScripts[$table]=$incFile;
146 $this->extScriptsConf[$table]=$FEData[$table.'.']['processScript.'];
147 }
148 }
149 }
150 }
151
152 /**
153 * Checking if a "double-post" exists already.
154 * "Double-posting" is if someone refreshes a page with a form for the message board or guestbook and thus submits the element twice. Checking for double-posting prevents the second submission from being stored. This is done by saving the first record with a MD5 hash of the content - if this hash exists already, the record cannot be saved.
155 *
156 * @param string The database table to check
157 * @param string The fieldname from the database table to search
158 * @param integer The hash value to search for.
159 * @return integer The number of found rows. If zero then no "double-post" was found and its all OK.
160 * @access private
161 */
162 function checkDoublePostExist($table,$doublePostField,$key) {
163 return $GLOBALS['TYPO3_DB']->exec_SELECTcountRows(
164 '*',
165 $table,
166 $doublePostField . '=' . intval($key)
167 );
168 }
169
170 /**
171 * Creates the double-post hash value from the input array
172 *
173 * @param array The array with key/values to hash
174 * @return integer And unsigned 32bit integer hash
175 * @access private
176 */
177 function calcDoublePostKey($array) {
178 ksort($array); // Sorting by key
179 $doublePostCheckKey = hexdec(substr(md5(serialize($array)),0,8)); // Making key
180 return $doublePostCheckKey;
181 }
182
183 /**
184 * Includes the submit scripts found in ->extScripts (filled in by the start() function)
185 *
186 * @return void
187 * @see tslib_fe::fe_tce(), includeScripts()
188 */
189 function includeScripts() {
190 foreach ($this->extScripts as $incFile_table => $incFile) {
191 if (@is_file($incFile) && $GLOBALS['TSFE']->checkFileInclude($incFile)) {
192 include($incFile); // Always start the incFiles with a check of the object fe_tce. is_object($this);
193 $GLOBALS['TT']->setTSlogMessage('Included '.$incFile,0);
194 } else $GLOBALS['TT']->setTSlogMessage('"'.$incFile.'" was not found!',2);
195 }
196 }
197
198 /**
199 * Method available to the submit scripts for creating insert queries.
200 * Automatically adds tstamp, crdate, cruser_id field/value pairs.
201 * Will allow only field names which are either found in $GLOBALS['TCA'][...][columns] OR in the $this->extraList
202 * Executes an insert query!
203 *
204 * @param string The table name for which to create the insert statement
205 * @param array Array with key/value pairs being field/values (already escaped)
206 * @return void
207 */
208 function execNEWinsert($table, $dataArr) {
209 $extraList=$this->extraList;
210 if ($GLOBALS['TCA'][$table]['ctrl']['tstamp']) {
211 $field = $GLOBALS['TCA'][$table]['ctrl']['tstamp'];
212 $dataArr[$field] = $GLOBALS['EXEC_TIME'];
213 $extraList .= ',' . $field;
214 }
215 if ($GLOBALS['TCA'][$table]['ctrl']['crdate']) {
216 $field = $GLOBALS['TCA'][$table]['ctrl']['crdate'];
217 $dataArr[$field] = $GLOBALS['EXEC_TIME'];
218 $extraList .= ',' . $field;
219 }
220 if ($GLOBALS['TCA'][$table]['ctrl']['cruser_id']) {
221 $field = $GLOBALS['TCA'][$table]['ctrl']['cruser_id'];
222 $dataArr[$field] = 0;
223 $extraList .= ',' . $field;
224 }
225
226 unset($dataArr['uid']); // uid can never be set
227 $insertFields = array();
228
229 foreach($dataArr as $f => $v) {
230 if (t3lib_div::inList($extraList,$f) || isset($GLOBALS['TCA'][$table]['columns'][$f])) {
231 $insertFields[$f] = $v;
232 }
233 }
234
235 $GLOBALS['TYPO3_DB']->exec_INSERTquery($table, $insertFields);
236 }
237
238 /**
239 * Clear cache for page id.
240 * If the page id is the current page, then set_no_cache() is called (so page caching is disabled)
241 *
242 * @param integer The page id for which to clear the cache
243 * @return void
244 * @see tslib_fe::set_no_cache()
245 */
246 function clear_cacheCmd($cacheCmd) {
247 $cacheCmd = intval($cacheCmd);
248
249 if ($cacheCmd) {
250 $pageCache = $GLOBALS['typo3CacheManager']->getCache('cache_pages')->flushByTag('pageId_' . $cacheCmd);
251
252 if ($cacheCmd == intval($GLOBALS['TSFE']->id)) {
253 // Setting no_cache TRUE if the cleared-cache page is the current page!
254 $GLOBALS['TSFE']->set_no_cache();
255 }
256 }
257 }
258
259 /**
260 * Return TypoScript configuration for a table name
261 *
262 * @param string The table name for which to return TypoScript configuration (From TS: FEData.[table])
263 * @return array TypoScript properties from FEData.[table] - if exists.
264 */
265 function getConf($table) {
266 return $this->extScriptsConf[$table];
267 }
268 }
269
270
271
272 if (defined('TYPO3_MODE') && isset($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS']['tslib/class.tslib_fetce.php'])) {
273 include_once($GLOBALS['TYPO3_CONF_VARS'][TYPO3_MODE]['XCLASS']['tslib/class.tslib_fetce.php']);
274 }
275
276 ?>