Documentation TYPO3 par Ameos |
00001 <?php 00002 /*************************************************************** 00003 * Copyright notice 00004 * 00005 * (c) 1999-2005 Kasper Skaarhoj (kasperYYYY@typo3.com) 00006 * All rights reserved 00007 * 00008 * This script is part of the TYPO3 project. The TYPO3 project is 00009 * free software; you can redistribute it and/or modify 00010 * it under the terms of the GNU General Public License as published by 00011 * the Free Software Foundation; either version 2 of the License, or 00012 * (at your option) any later version. 00013 * 00014 * The GNU General Public License can be found at 00015 * http://www.gnu.org/copyleft/gpl.html. 00016 * A copy is found in the textfile GPL.txt and important notices to the license 00017 * from the author is found in LICENSE.txt distributed with these scripts. 00018 * 00019 * 00020 * This script is distributed in the hope that it will be useful, 00021 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00022 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00023 * GNU General Public License for more details. 00024 * 00025 * This copyright notice MUST APPEAR in all copies of the script! 00026 ***************************************************************/ 00092 require_once (PATH_t3lib.'class.t3lib_basicfilefunc.php'); // For use with images. 00093 00094 00095 00096 00097 00098 00099 00100 00101 00102 00103 00104 00105 00106 00107 00108 00109 00110 00111 00112 00113 00114 00115 00116 00117 00118 00119 00132 class user_feAdmin { 00133 00134 // External, static: 00135 var $recInMarkersHSC = TRUE; // If true, values from the record put into markers going out into HTML will be passed through htmlspecialchars()! 00136 00137 var $dataArr = array(); 00138 var $failureMsg = array(); 00139 var $theTable = ''; 00140 var $thePid = 0; 00141 var $markerArray = array(); 00142 var $templateCode=''; 00143 var $cObj; 00144 00145 var $cmd; 00146 var $preview; 00147 var $backURL; 00148 var $recUid; 00149 var $failure=0; // is set if data did not have the required fields set. 00150 var $error=''; 00151 var $saved=0; // is set if data is saved 00152 var $requiredArr; 00153 var $currentArr = array(); 00154 var $previewLabel=''; 00155 var $nc = ''; // '&no_cache=1' if you want that parameter sent. 00156 var $additionalUpdateFields=''; 00157 var $emailMarkPrefix = 'EMAIL_TEMPLATE_'; 00158 var $codeLength; 00159 var $cmdKey; 00160 var $fileFunc=''; // Set to a basic_filefunc object 00161 var $filesStoredInUploadFolders=array(); // This array will hold the names of files transferred to the uploads/* folder if any. If the records are NOT saved, these files should be deleted!! Currently this is not working! 00162 00163 // Internal vars, dynamic: 00164 var $unlinkTempFiles = array(); // Is loaded with all temporary filenames used for upload which should be deleted before exit... 00165 00179 function init($content,$conf) { 00180 $this->conf = $conf; 00181 00182 // template file is fetched. 00183 $this->templateCode = $this->conf['templateContent'] ? $this->conf['templateContent'] : $this->cObj->fileResource($this->conf['templateFile']); 00184 00185 // Getting the cmd var 00186 $this->cmd = (string)t3lib_div::_GP('cmd'); 00187 // Getting the preview var 00188 $this->preview = (string)t3lib_div::_GP('preview'); 00189 // backURL is a given URL to return to when login is performed 00190 $this->backURL = t3lib_div::_GP('backURL'); 00191 // Uid to edit: 00192 $this->recUid = t3lib_div::_GP('rU'); 00193 // Authentication code: 00194 $this->authCode = t3lib_div::_GP('aC'); 00195 // get table 00196 $this->theTable = $this->conf['table']; 00197 00198 $this->nc = $this->conf['no_cache'] ? '&no_cache=1' : $this->nc; 00199 // pid 00200 $this->thePid = intval($this->conf['pid']) ? intval($this->conf['pid']) : $GLOBALS['TSFE']->id; 00201 // 00202 $this->codeLength = intval($this->conf['authcodeFields.']['codeLength']) ? intval($this->conf['authcodeFields.']['codeLength']) : 8; 00203 00204 // Setting the hardcoded lists of fields allowed for editing and creation. 00205 $this->fieldList=implode(',',t3lib_div::trimExplode(',',$GLOBALS['TCA'][$this->theTable]['feInterface']['fe_admin_fieldList'],1)); 00206 00207 // globally substituted markers, fonts and colors. 00208 $splitMark = md5(microtime()); 00209 list($this->markerArray['###GW1B###'],$this->markerArray['###GW1E###']) = explode($splitMark,$this->cObj->stdWrap($splitMark,$this->conf['wrap1.'])); 00210 list($this->markerArray['###GW2B###'],$this->markerArray['###GW2E###']) = explode($splitMark,$this->cObj->stdWrap($splitMark,$this->conf['wrap2.'])); 00211 $this->markerArray['###GC1###'] = $this->cObj->stdWrap($this->conf['color1'],$this->conf['color1.']); 00212 $this->markerArray['###GC2###'] = $this->cObj->stdWrap($this->conf['color2'],$this->conf['color2.']); 00213 $this->markerArray['###GC3###'] = $this->cObj->stdWrap($this->conf['color3'],$this->conf['color3.']); 00214 00215 // Initialize markerArray, setting FORM_URL and HIDDENFIELDS 00216 $this->markerArray['###FORM_URL###'] = 'index.php?id='.$GLOBALS['TSFE']->id.'&type='.$GLOBALS['TSFE']->type.$this->nc.$this->conf['addParams']; 00217 $this->markerArray['###FORM_URL_ENC###'] = rawurlencode($this->markerArray['###FORM_URL###']); 00218 $this->markerArray['###FORM_URL_HSC###'] = htmlspecialchars($this->markerArray['###FORM_URL###']); 00219 00220 $this->markerArray['###BACK_URL###'] = $this->backURL; 00221 $this->markerArray['###BACK_URL_ENC###'] = rawurlencode($this->markerArray['###BACK_URL###']); 00222 $this->markerArray['###BACK_URL_HSC###'] = htmlspecialchars($this->markerArray['###BACK_URL###']); 00223 00224 $this->markerArray['###THE_PID###'] = $this->thePid; 00225 $this->markerArray['###REC_UID###'] = $this->recUid; 00226 $this->markerArray['###AUTH_CODE###'] = $this->authCode; 00227 $this->markerArray['###THIS_ID###'] = $GLOBALS['TSFE']->id; 00228 $this->markerArray['###THIS_URL###'] = htmlspecialchars(t3lib_div::getIndpEnv('TYPO3_REQUEST_DIR')); 00229 $this->markerArray['###HIDDENFIELDS###'] = 00230 ($this->cmd?'<input type="hidden" name="cmd" value="'.htmlspecialchars($this->cmd).'" />':''). 00231 ($this->authCode?'<input type="hidden" name="aC" value="'.htmlspecialchars($this->authCode).'" />':''). 00232 ($this->backURL?'<input type="hidden" name="backURL" value="'.htmlspecialchars($this->backURL).'" />':''); 00233 00234 00235 // Setting cmdKey which is either 'edit' or 'create' 00236 switch($this->cmd) { 00237 case 'edit': 00238 $this->cmdKey='edit'; 00239 break; 00240 default: 00241 $this->cmdKey='create'; 00242 break; 00243 } 00244 // Setting requiredArr to the fields in 'required' intersected field the total field list in order to remove invalid fields. 00245 $this->requiredArr = array_intersect( 00246 t3lib_div::trimExplode(',',$this->conf[$this->cmdKey.'.']['required'],1), 00247 t3lib_div::trimExplode(',',$this->conf[$this->cmdKey.'.']['fields'],1) 00248 ); 00249 00250 // Setting incoming data. Non-stripped 00251 $fe=t3lib_div::_GP('FE'); 00252 $this->dataArr = $fe[$this->theTable]; // Incoming data. 00253 00254 // Checking template file and table value 00255 if (!$this->templateCode) { 00256 $content = 'No template file found: '.$this->conf['templateFile']; 00257 return $content; 00258 } 00259 00260 if (!$this->theTable || !$this->fieldList) { 00261 $content = 'Wrong table: '.$this->theTable; 00262 return $content; // Not listed or editable table! 00263 } 00264 00265 // ***************** 00266 // If data is submitted, we take care of it here. 00267 // ******************* 00268 if ($this->cmd=='delete' && !$this->preview && !t3lib_div::_GP('doNotSave')) { // Delete record if delete command is sent + the preview flag is NOT set. 00269 $this->deleteRecord(); 00270 } 00271 // If incoming data is seen... 00272 if (is_array($this->dataArr)) { 00273 // Evaluation of data: 00274 $this->parseValues(); 00275 $this->overrideValues(); 00276 $this->evalValues(); 00277 if ($this->conf['evalFunc']) { 00278 $this->dataArr = $this->userProcess('evalFunc',$this->dataArr); 00279 } 00280 00281 /* 00282 debug($this->dataArr); 00283 debug($this->failure); 00284 debug($this->preview); 00285 */ 00286 // if not preview and no failures, then set data... 00287 if (!$this->failure && !$this->preview && !t3lib_div::_GP('doNotSave')) { // doNotSave is a global var (eg a 'Cancel' submit button) that prevents the data from being processed 00288 $this->save(); 00289 } else { 00290 if ($this->conf['debug']) debug($this->failure); 00291 } 00292 } else { 00293 $this->defaultValues(); // If no incoming data, this will set the default values. 00294 $this->preview = 0; // No preview if data is not received 00295 } 00296 if ($this->failure) {$this->preview=0;} // No preview flag if a evaluation failure has occured 00297 $this->previewLabel = $this->preview ? '_PREVIEW' : ''; // Setting preview label prefix. 00298 00299 00300 // ********************* 00301 // DISPLAY FORMS: 00302 // *********************** 00303 if ($this->saved) { 00304 // Clear page cache 00305 $this->clearCacheIfSet(); 00306 00307 // Displaying the page here that says, the record has been saved. You're able to include the saved values by markers. 00308 switch($this->cmd) { 00309 case 'delete': 00310 $key='DELETE'; 00311 break; 00312 case 'edit': 00313 $key='EDIT'; 00314 break; 00315 default: 00316 $key='CREATE'; 00317 break; 00318 } 00319 // Output message 00320 $templateCode = $this->cObj->getSubpart($this->templateCode, '###TEMPLATE_'.$key.'_SAVED###'); 00321 $this->setCObjects($templateCode,$this->currentArr); 00322 $markerArray = $this->cObj->fillInMarkerArray($this->markerArray, $this->currentArr, '', TRUE, 'FIELD_', $this->recInMarkersHSC); 00323 $content = $this->cObj->substituteMarkerArray($templateCode, $markerArray); 00324 00325 // email message: 00326 $this->compileMail( 00327 $key.'_SAVED', 00328 array($this->currentArr), 00329 $this->currentArr[$this->conf['email.']['field']], 00330 $this->conf['setfixed.'] 00331 ); 00332 00333 } elseif ($this->error) { // If there was an error, we return the template-subpart with the error message 00334 $templateCode = $this->cObj->getSubpart($this->templateCode, $this->error); 00335 $this->setCObjects($templateCode); 00336 $content = $this->cObj->substituteMarkerArray($templateCode, $this->markerArray); 00337 } else { 00338 // Finally, if there has been no attempt to save. That is either preview or just displaying and empty or not correctly filled form: 00339 if (!$this->cmd) { 00340 $this->cmd=$this->conf['defaultCmd']; 00341 } 00342 if ($this->conf['debug']) debug('Display form: '.$this->cmd,1); 00343 switch($this->cmd) { 00344 case 'setfixed': 00345 $content = $this->procesSetFixed(); 00346 break; 00347 case 'infomail': 00348 $content = $this->sendInfoMail(); 00349 break; 00350 case 'delete': 00351 $content = $this->displayDeleteScreen(); 00352 break; 00353 case 'edit': 00354 $content = $this->displayEditScreen(); 00355 break; 00356 case 'create': 00357 $content = $this->displayCreateScreen(); 00358 break; 00359 } 00360 } 00361 00362 // Delete temp files: 00363 foreach($this->unlinkTempFiles as $tempFileName) { 00364 t3lib_div::unlink_tempfile($tempFileName); 00365 } 00366 00367 // Return content: 00368 return $content; 00369 } 00370 00371 00372 00373 00374 00375 00376 00377 00378 00379 00380 00381 00382 00383 00384 00385 00386 00387 00388 00389 00390 00391 00392 00393 /***************************************** 00394 * 00395 * Data processing 00396 * 00397 *****************************************/ 00398 00408 function parseValues() { 00409 if (is_array($this->conf['parseValues.'])) { 00410 reset($this->conf['parseValues.']); 00411 while(list($theField,$theValue)=each($this->conf['parseValues.'])) { 00412 $listOfCommands = t3lib_div::trimExplode(',',$theValue,1); 00413 while(list(,$cmd)=each($listOfCommands)) { 00414 $cmdParts = split('\[|\]',$cmd); // Point is to enable parameters after each command enclosed in brackets [..]. These will be in position 1 in the array. 00415 $theCmd=trim($cmdParts[0]); 00416 switch($theCmd) { 00417 case 'int': 00418 $this->dataArr[$theField]=intval($this->dataArr[$theField]); 00419 break; 00420 case 'lower': 00421 case 'upper': 00422 $this->dataArr[$theField] = $this->cObj->caseshift($this->dataArr[$theField],$theCmd); 00423 break; 00424 case 'nospace': 00425 $this->dataArr[$theField] = str_replace(' ', '', $this->dataArr[$theField]); 00426 break; 00427 case 'alpha': 00428 $this->dataArr[$theField] = ereg_replace('[^a-zA-Z]','',$this->dataArr[$theField]); 00429 break; 00430 case 'num': 00431 $this->dataArr[$theField] = ereg_replace('[^0-9]','',$this->dataArr[$theField]); 00432 break; 00433 case 'alphanum': 00434 $this->dataArr[$theField] = ereg_replace('[^a-zA-Z0-9]','',$this->dataArr[$theField]); 00435 break; 00436 case 'alphanum_x': 00437 $this->dataArr[$theField] = ereg_replace('[^a-zA-Z0-9_-]','',$this->dataArr[$theField]); 00438 break; 00439 case 'trim': 00440 $this->dataArr[$theField] = trim($this->dataArr[$theField]); 00441 break; 00442 case 'random': 00443 $this->dataArr[$theField] = substr(md5(uniqid(microtime(),1)),0,intval($cmdParts[1])); 00444 break; 00445 case 'files': 00446 if ($this->cmdKey=='create' && !t3lib_div::_GP('doNotSave')) { 00447 $this->processFiles($cmdParts,$theField); 00448 } else unset($this->dataArr[$theField]); // Fields with files cannot be edited - only created. 00449 break; 00450 case 'setEmptyIfAbsent': 00451 if (!isset($this->dataArr[$theField])) { 00452 $this->dataArr[$theField]=''; 00453 } 00454 break; 00455 case 'multiple': 00456 if (is_array($this->dataArr[$theField])) { 00457 $this->dataArr[$theField] = implode(',',$this->dataArr[$theField]); 00458 } 00459 break; 00460 case 'checkArray': 00461 if (is_array($this->dataArr[$theField])) { 00462 reset($this->dataArr[$theField]); 00463 $val = 0; 00464 while(list($kk,$vv)=each($this->dataArr[$theField])) { 00465 $kk = t3lib_div::intInRange($kk,0); 00466 if ($kk<=30) { 00467 if ($vv) { 00468 $val|=pow(2,$kk); 00469 } 00470 } 00471 } 00472 $this->dataArr[$theField] = $val; 00473 } else {$this->dataArr[$theField]=0;} 00474 break; 00475 case 'uniqueHashInt': 00476 $otherFields = t3lib_div::trimExplode(';',$cmdParts[1],1); 00477 $hashArray=array(); 00478 while(list(,$fN)=each($otherFields)) { 00479 $vv = $this->dataArr[$fN]; 00480 $vv = ereg_replace('[[:space:]]','',$vv); 00481 $vv = ereg_replace('[^[:alnum:]]','',$vv); 00482 $vv = strtolower($vv); 00483 $hashArray[]=$vv; 00484 } 00485 $this->dataArr[$theField]=hexdec(substr(md5(serialize($hashArray)),0,8)); 00486 break; 00487 } 00488 } 00489 } 00490 } 00491 } 00492 00503 function processFiles($cmdParts,$theField) { 00504 //debug($_FILES); 00505 // First, make an array with the filename and file reference, whether the file is just uploaded or a preview 00506 $filesArr = array(); 00507 00508 if (is_string($this->dataArr[$theField])) { // files from preview. 00509 $tmpArr = explode(',',$this->dataArr[$theField]); 00510 reset($tmpArr); 00511 while(list(,$val)=each($tmpArr)) { 00512 $valParts = explode('|',$val); 00513 $filesArr[] = array ( 00514 'name'=>$valParts[1], 00515 'tmp_name'=>PATH_site.'typo3temp/'.$valParts[0] 00516 ); 00517 } 00518 } elseif (is_array($_FILES['FE'][$this->theTable][$theField]['name'])) { // Files from upload 00519 reset($_FILES['FE'][$this->theTable][$theField]['name']); 00520 while(list($kk,$vv)=each($_FILES['FE'][$this->theTable][$theField]['name'])) { 00521 if ($vv) { 00522 $tmpFile = t3lib_div::upload_to_tempfile($_FILES['FE'][$this->theTable][$theField]['tmp_name'][$kk]); 00523 if ($tmpFile) { 00524 $this->unlinkTempFiles[]=$tmpFile; 00525 $filesArr[] = array ( 00526 'name'=>$vv, 00527 'tmp_name'=>$tmpFile 00528 ); 00529 } 00530 } 00531 } 00532 } elseif (is_array($_FILES['FE']['name'][$this->theTable][$theField])) { // Files from upload 00533 reset($_FILES['FE']['name'][$this->theTable][$theField]); 00534 while(list($kk,$vv)=each($_FILES['FE']['name'][$this->theTable][$theField])) { 00535 if ($vv) { 00536 $tmpFile = t3lib_div::upload_to_tempfile($_FILES['FE']['tmp_name'][$this->theTable][$theField][$kk]); 00537 if ($tmpFile) { 00538 $this->unlinkTempFiles[]=$tmpFile; 00539 $filesArr[] = array ( 00540 'name'=>$vv, 00541 'tmp_name'=>$tmpFile 00542 ); 00543 } 00544 } 00545 } 00546 } 00547 00548 // Then verify the files in that array; check existence, extension and size 00549 $this->dataArr[$theField]=''; 00550 $finalFilesArr=array(); 00551 if (count($filesArr)) { 00552 $extArray = t3lib_div::trimExplode(';',strtolower($cmdParts[1]),1); 00553 $maxSize = intval($cmdParts[3]); 00554 reset($filesArr); 00555 while(list(,$infoArr)=each($filesArr)) { 00556 $fI = pathinfo($infoArr['name']); 00557 if (t3lib_div::verifyFilenameAgainstDenyPattern($fI['name'])) { 00558 if (!count($extArray) || in_array(strtolower($fI['extension']), $extArray)) { 00559 $tmpFile = $infoArr['tmp_name']; 00560 if (@is_file($tmpFile)) { 00561 if (!$maxSize || filesize($tmpFile)<$maxSize*1024) { 00562 $finalFilesArr[]=$infoArr; 00563 } elseif ($this->conf['debug']) {debug('Size is beyond '.$maxSize.' kb ('.filesize($tmpFile).' bytes) and the file cannot be saved.');} 00564 } elseif ($this->conf['debug']) {debug('Surprisingly there was no file for '.$vv.' in '.$tmpFile);} 00565 } elseif ($this->conf['debug']) {debug('Extension "'.$fI['extension'].'" not allowed');} 00566 } elseif ($this->conf['debug']) {debug('Filename matched illegal pattern.');} 00567 } 00568 } 00569 // Copy the files in the resulting array to the proper positions based on preview/non-preview. 00570 reset($finalFilesArr); 00571 $fileNameList=array(); 00572 while(list(,$infoArr)=each($finalFilesArr)) { 00573 if ($this->isPreview()) { // If the form is a preview form (and data is therefore not going into the database...) do this. 00574 $this->createFileFuncObj(); 00575 $fI = pathinfo($infoArr['name']); 00576 $tmpFilename = $this->theTable.'_'.t3lib_div::shortmd5(uniqid($infoArr['name'])).'.'.$fI['extension']; 00577 $theDestFile = $this->fileFunc->getUniqueName($this->fileFunc->cleanFileName($tmpFilename), PATH_site.'typo3temp/'); 00578 t3lib_div::upload_copy_move($infoArr['tmp_name'],$theDestFile); 00579 // Setting the filename in the list 00580 $fI2 = pathinfo($theDestFile); 00581 $fileNameList[] = $fI2['basename'].'|'.$infoArr['name']; 00582 } else { 00583 $this->createFileFuncObj(); 00584 $GLOBALS['TSFE']->includeTCA(); 00585 t3lib_div::loadTCA($this->theTable); 00586 if (is_array($GLOBALS['TCA'][$this->theTable]['columns'][$theField])) { 00587 $uploadPath = $GLOBALS['TCA'][$this->theTable]['columns'][$theField]['config']['uploadfolder']; 00588 } 00589 if ($uploadPath) { 00590 $theDestFile = $this->fileFunc->getUniqueName($this->fileFunc->cleanFileName($infoArr['name']), PATH_site.$uploadPath); 00591 t3lib_div::upload_copy_move($infoArr['tmp_name'],$theDestFile); 00592 // Setting the filename in the list 00593 $fI2 = pathinfo($theDestFile); 00594 $fileNameList[] = $fI2['basename']; 00595 $this->filesStoredInUploadFolders[]=$theDestFile; 00596 } 00597 } 00598 // Implode the list of filenames 00599 $this->dataArr[$theField] = implode(',',$fileNameList); 00600 } 00601 } 00602 00609 function overrideValues() { 00610 // Addition of overriding values 00611 if (is_array($this->conf[$this->cmdKey.'.']['overrideValues.'])) { 00612 reset($this->conf[$this->cmdKey.'.']['overrideValues.']); 00613 while(list($theField,$theValue)=each($this->conf[$this->cmdKey.'.']['overrideValues.'])) { 00614 $this->dataArr[$theField] = $theValue; 00615 } 00616 } 00617 } 00618 00625 function defaultValues() { 00626 // Addition of default values 00627 if (is_array($this->conf[$this->cmdKey.'.']['defaultValues.'])) { 00628 reset($this->conf[$this->cmdKey.'.']['defaultValues.']); 00629 while(list($theField,$theValue)=each($this->conf[$this->cmdKey.'.']['defaultValues.'])) { 00630 $this->dataArr[$theField] = $theValue; 00631 } 00632 } 00633 } 00634 00644 function evalValues() { 00645 // Check required, set failure if not ok. 00646 reset($this->requiredArr); 00647 $tempArr=array(); 00648 while(list(,$theField)=each($this->requiredArr)) { 00649 if (!trim($this->dataArr[$theField])) { 00650 $tempArr[]=$theField; 00651 } 00652 } 00653 00654 // Evaluate: This evaluates for more advanced things than 'required' does. But it returns the same error code, so you must let the required-message tell, if further evaluation has failed! 00655 $recExist=0; 00656 if (is_array($this->conf[$this->cmdKey.'.']['evalValues.'])) { 00657 switch($this->cmd) { 00658 case 'edit': 00659 if (isset($this->dataArr['pid'])) { // This may be tricked if the input has the pid-field set but the edit-field list does NOT allow the pid to be edited. Then the pid may be false. 00660 $recordTestPid = intval($this->dataArr['pid']); 00661 } else { 00662 $tempRecArr = $GLOBALS['TSFE']->sys_page->getRawRecord($this->theTable,$this->dataArr['uid']); 00663 $recordTestPid = intval($tempRecArr['pid']); 00664 } 00665 $recExist=1; 00666 break; 00667 default: 00668 $recordTestPid = $this->thePid ? $this->thePid : t3lib_div::intval_positive($this->dataArr['pid']); 00669 break; 00670 } 00671 00672 reset($this->conf[$this->cmdKey.'.']['evalValues.']); 00673 while(list($theField,$theValue)=each($this->conf[$this->cmdKey.'.']['evalValues.'])) { 00674 $listOfCommands = t3lib_div::trimExplode(',',$theValue,1); 00675 while(list(,$cmd)=each($listOfCommands)) { 00676 $cmdParts = split('\[|\]',$cmd); // Point is to enable parameters after each command enclosed in brackets [..]. These will be in position 1 in the array. 00677 $theCmd = trim($cmdParts[0]); 00678 switch($theCmd) { 00679 case 'uniqueGlobal': 00680 if ($DBrows = $GLOBALS['TSFE']->sys_page->getRecordsByField($this->theTable,$theField,$this->dataArr[$theField],'','','','1')) { 00681 if (!$recExist || $DBrows[0]['uid']!=$this->dataArr['uid']) { // Only issue an error if the record is not existing (if new...) and if the record with the false value selected was not our self. 00682 $tempArr[]=$theField; 00683 $this->failureMsg[$theField][] = $this->getFailure($theField, $theCmd, 'The value existed already. Enter a new value.'); 00684 } 00685 } 00686 break; 00687 case 'uniqueLocal': 00688 if ($DBrows = $GLOBALS['TSFE']->sys_page->getRecordsByField($this->theTable,$theField,$this->dataArr[$theField], 'AND pid IN ('.$recordTestPid.')','','','1')) { 00689 if (!$recExist || $DBrows[0]['uid']!=$this->dataArr['uid']) { // Only issue an error if the record is not existing (if new...) and if the record with the false value selected was not our self. 00690 $tempArr[]=$theField; 00691 $this->failureMsg[$theField][] = $this->getFailure($theField, $theCmd, 'The value existed already. Enter a new value.'); 00692 } 00693 } 00694 break; 00695 case 'twice': 00696 if (strcmp($this->dataArr[$theField], $this->dataArr[$theField.'_again'])) { 00697 $tempArr[]=$theField; 00698 $this->failureMsg[$theField][] = $this->getFailure($theField, $theCmd, 'You must enter the same value twice'); 00699 } 00700 break; 00701 case 'email': 00702 if (!$this->cObj->checkEmail($this->dataArr[$theField])) { 00703 $tempArr[]=$theField; 00704 $this->failureMsg[$theField][] = $this->getFailure($theField, $theCmd, 'You must enter a valid email address'); 00705 } 00706 break; 00707 case 'required': 00708 if (!trim($this->dataArr[$theField])) { 00709 $tempArr[]=$theField; 00710 $this->failureMsg[$theField][] = $this->getFailure($theField, $theCmd, 'You must enter a value!'); 00711 } 00712 break; 00713 case 'atLeast': 00714 $chars=intval($cmdParts[1]); 00715 if (strlen($this->dataArr[$theField])<$chars) { 00716 $tempArr[]=$theField; 00717 $this->failureMsg[$theField][] = sprintf($this->getFailure($theField, $theCmd, 'You must enter at least %s characters!'), $chars); 00718 } 00719 break; 00720 case 'atMost': 00721 $chars=intval($cmdParts[1]); 00722 if (strlen($this->dataArr[$theField])>$chars) { 00723 $tempArr[]=$theField; 00724 $this->failureMsg[$theField][] = sprintf($this->getFailure($theField, $theCmd, 'You must enter at most %s characters!'), $chars); 00725 } 00726 break; 00727 case 'inBranch': 00728 $pars = explode(';',$cmdParts[1]); 00729 if (intval($pars[0])) { 00730 $pid_list = $this->cObj->getTreeList( 00731 intval($pars[0]), 00732 intval($pars[1]) ? intval($pars[1]) : 999, 00733 intval($pars[2]) 00734 ); 00735 if (!$pid_list || !t3lib_div::inList($pid_list,$this->dataArr[$theField])) { 00736 $tempArr[]=$theField; 00737 $this->failureMsg[$theField][] = sprintf($this->getFailure($theField, $theCmd, 'The value was not a valid valud from this list: %s'), $pid_list); 00738 } 00739 } 00740 break; 00741 case 'unsetEmpty': 00742 if (!$this->dataArr[$theField]) { 00743 $hash = array_flip($tempArr); 00744 unset($hash[$theField]); 00745 $tempArr = array_keys($hash); 00746 unset($this->failureMsg[$theField]); 00747 unset($this->dataArr[$theField]); // This should prevent the field from entering the database. 00748 } 00749 break; 00750 } 00751 } 00752 $this->markerArray['###EVAL_ERROR_FIELD_'.$theField.'###'] = is_array($this->failureMsg[$theField]) ? implode('<br />',$this->failureMsg[$theField]) : ''; 00753 } 00754 } 00755 $this->failure=implode(',',$tempArr); //$failure will show which fields were not OK 00756 } 00757 00766 function userProcess($mConfKey,$passVar) { 00767 if ($this->conf[$mConfKey]) { 00768 $funcConf = $this->conf[$mConfKey.'.']; 00769 $funcConf['parentObj']=&$this; 00770 $passVar = $GLOBALS['TSFE']->cObj->callUserFunction($this->conf[$mConfKey], $funcConf, $passVar); 00771 } 00772 return $passVar; 00773 } 00774 00784 function userProcess_alt($confVal,$confArr,$passVar) { 00785 if ($confVal) { 00786 $funcConf = $confArr; 00787 $funcConf['parentObj']=&$this; 00788 $passVar = $GLOBALS['TSFE']->cObj->callUserFunction($confVal, $funcConf, $passVar); 00789 } 00790 return $passVar; 00791 } 00792 00793 00794 00795 00796 00797 00798 00799 00800 00801 00802 00803 00804 00805 00806 00807 00808 00809 00810 00811 00812 00813 00814 /***************************************** 00815 * 00816 * Database manipulation functions 00817 * 00818 *****************************************/ 00819 00826 function save() { 00827 switch($this->cmd) { 00828 case 'edit': 00829 $theUid = $this->dataArr['uid']; 00830 $origArr = $GLOBALS['TSFE']->sys_page->getRawRecord($this->theTable,$theUid); // Fetches the original record to check permissions 00831 if ($this->conf['edit'] && ($GLOBALS['TSFE']->loginUser || $this->aCAuth($origArr))) { // Must be logged in in order to edit (OR be validated by email) 00832 $newFieldList = implode(',',array_intersect(explode(',',$this->fieldList),t3lib_div::trimExplode(',',$this->conf['edit.']['fields'],1))); 00833 if ($this->aCAuth($origArr) || $this->cObj->DBmayFEUserEdit($this->theTable,$origArr,$GLOBALS['TSFE']->fe_user->user,$this->conf['allowedGroups'],$this->conf['fe_userEditSelf'])) { 00834 $this->cObj->DBgetUpdate($this->theTable, $theUid, $this->dataArr, $newFieldList, TRUE); 00835 $this->currentArr = $GLOBALS['TSFE']->sys_page->getRawRecord($this->theTable,$theUid); 00836 $this->userProcess_alt($this->conf['edit.']['userFunc_afterSave'],$this->conf['edit.']['userFunc_afterSave.'],array('rec'=>$this->currentArr, 'origRec'=>$origArr)); 00837 $this->saved=1; 00838 } else { 00839 $this->error='###TEMPLATE_NO_PERMISSIONS###'; 00840 } 00841 } 00842 break; 00843 default: 00844 if ($this->conf['create']) { 00845 $newFieldList = implode(',',array_intersect(explode(',',$this->fieldList),t3lib_div::trimExplode(',',$this->conf['create.']['fields'],1))); 00846 $this->cObj->DBgetInsert($this->theTable, $this->thePid, $this->dataArr, $newFieldList, TRUE); 00847 $newId = $GLOBALS['TYPO3_DB']->sql_insert_id(); 00848 00849 if ($this->theTable=='fe_users' && $this->conf['fe_userOwnSelf']) { // enables users, creating logins, to own them self. 00850 $extraList=''; 00851 $dataArr = array(); 00852 if ($GLOBALS['TCA'][$this->theTable]['ctrl']['fe_cruser_id']) { 00853 $field=$GLOBALS['TCA'][$this->theTable]['ctrl']['fe_cruser_id']; 00854 $dataArr[$field]=$newId; 00855 $extraList.=','.$field; 00856 } 00857 if ($GLOBALS['TCA'][$this->theTable]['ctrl']['fe_crgroup_id']) { 00858 $field=$GLOBALS['TCA'][$this->theTable]['ctrl']['fe_crgroup_id']; 00859 list($dataArr[$field])=explode(',',$this->dataArr['usergroup']); 00860 $dataArr[$field]=intval($dataArr[$field]); 00861 $extraList.=','.$field; 00862 } 00863 if (count($dataArr)) { 00864 $this->cObj->DBgetUpdate($this->theTable, $newId, $dataArr, $extraList, TRUE); 00865 } 00866 } 00867 00868 $this->currentArr = $GLOBALS['TSFE']->sys_page->getRawRecord($this->theTable,$newId); 00869 $this->userProcess_alt($this->conf['create.']['userFunc_afterSave'],$this->conf['create.']['userFunc_afterSave.'],array('rec'=>$this->currentArr)); 00870 $this->saved=1; 00871 } 00872 break; 00873 } 00874 } 00875 00884 function deleteRecord() { 00885 if ($this->conf['delete']) { // If deleting is enabled 00886 $origArr = $GLOBALS['TSFE']->sys_page->getRawRecord($this->theTable, $this->recUid); 00887 if ($GLOBALS['TSFE']->loginUser || $this->aCAuth($origArr)) { // Must be logged in OR be authenticated by the aC code in order to delete 00888 // If the recUid selects a record.... (no check here) 00889 if (is_array($origArr)) { 00890 if ($this->aCAuth($origArr) || $this->cObj->DBmayFEUserEdit($this->theTable,$origArr, $GLOBALS['TSFE']->fe_user->user,$this->conf['allowedGroups'],$this->conf['fe_userEditSelf'])) { // Display the form, if access granted. 00891 if (!$GLOBALS['TCA'][$this->theTable]['ctrl']['delete']) { // If the record is fully deleted... then remove the image (or any file) attached. 00892 $this->deleteFilesFromRecord($this->recUid); 00893 } 00894 $this->cObj->DBgetDelete($this->theTable, $this->recUid, TRUE); 00895 $this->currentArr = $origArr; 00896 $this->saved = 1; 00897 } else { 00898 $this->error = '###TEMPLATE_NO_PERMISSIONS###'; 00899 } 00900 } 00901 } 00902 } 00903 } 00904 00914 function deleteFilesFromRecord($uid) { 00915 $table = $this->theTable; 00916 $rec = $GLOBALS['TSFE']->sys_page->getRawRecord($table,$uid); 00917 00918 $GLOBALS['TSFE']->includeTCA(); 00919 t3lib_div::loadTCA($table); 00920 reset($GLOBALS['TCA'][$table]['columns']); 00921 $iFields=array(); 00922 while(list($field,$conf)=each($GLOBALS['TCA'][$table]['columns'])) { 00923 if ($conf['config']['type']=='group' && $conf['config']['internal_type']=='file') { 00924 00925 $GLOBALS['TYPO3_DB']->exec_UPDATEquery($table, 'uid='.intval($uid), array($field => '')); 00926 00927 $delFileArr = explode(',',$rec[$field]); 00928 reset($delFileArr); 00929 while(list(,$n)=each($delFileArr)) { 00930 if ($n) { 00931 $fpath = $conf['config']['uploadfolder'].'/'.$n; 00932 unlink($fpath); 00933 } 00934 } 00935 } 00936 } 00937 } 00938 00939 00940 00941 00942 00943 00944 00945 00946 00947 00948 00949 00950 00951 00952 00953 00954 00955 00956 00957 00958 00959 /***************************************** 00960 * 00961 * Command "display" functions 00962 * 00963 *****************************************/ 00964 00971 function displayDeleteScreen() { 00972 if ($this->conf['delete']) { // If deleting is enabled 00973 $origArr = $GLOBALS['TSFE']->sys_page->getRawRecord($this->theTable, $this->recUid); 00974 if ($GLOBALS['TSFE']->loginUser || $this->aCAuth($origArr)) { // Must be logged in OR be authenticated by the aC code in order to delete 00975 // If the recUid selects a record.... (no check here) 00976 if (is_array($origArr)) { 00977 if ($this->aCAuth($origArr) || $this->cObj->DBmayFEUserEdit($this->theTable,$origArr, $GLOBALS['TSFE']->fe_user->user,$this->conf['allowedGroups'],$this->conf['fe_userEditSelf'])) { // Display the form, if access granted. 00978 $this->markerArray['###HIDDENFIELDS###'].= '<input type="hidden" name="rU" value="'.$this->recUid.'" />'; 00979 $content = $this->getPlainTemplate('###TEMPLATE_DELETE_PREVIEW###', $origArr); 00980 } else { // Else display error, that you could not edit that particular record... 00981 $content = $this->getPlainTemplate('###TEMPLATE_NO_PERMISSIONS###'); 00982 } 00983 } 00984 } else { // Finally this is if there is no login user. This must tell that you must login. Perhaps link to a page with create-user or login information. 00985 $content = $this->getPlainTemplate('###TEMPLATE_AUTH###'); 00986 } 00987 } else { 00988 $content.='Delete-option is not set in TypoScript'; 00989 } 00990 return $content; 00991 } 00992 00999 function displayCreateScreen() { 01000 if ($this->conf['create']) { 01001 $templateCode = $this->cObj->getSubpart($this->templateCode, ((!$GLOBALS['TSFE']->loginUser||$this->conf['create.']['noSpecialLoginForm'])?'###TEMPLATE_CREATE'.$this->previewLabel.'###':'###TEMPLATE_CREATE_LOGIN'.$this->previewLabel.'###')); 01002 $failure = t3lib_div::_GP('noWarnings')?'':$this->failure; 01003 if (!$failure) $templateCode = $this->cObj->substituteSubpart($templateCode, '###SUB_REQUIRED_FIELDS_WARNING###', ''); 01004 01005 $templateCode = $this->removeRequired($templateCode,$failure); 01006 $this->setCObjects($templateCode); 01007 01008 $markerArray = $this->cObj->fillInMarkerArray($this->markerArray, $this->dataArr, '', TRUE, 'FIELD_', $this->recInMarkersHSC); 01009 if ($this->conf['create.']['preview'] && !$this->previewLabel) {$markerArray['###HIDDENFIELDS###'].= '<input type="hidden" name="preview" value="1" />';} 01010 $content = $this->cObj->substituteMarkerArray($templateCode, $markerArray); 01011 $content.=$this->cObj->getUpdateJS($this->modifyDataArrForFormUpdate($this->dataArr), $this->theTable.'_form', 'FE['.$this->theTable.']', $this->fieldList.$this->additionalUpdateFields); 01012 } 01013 return $content; 01014 } 01015 01022 function displayEditScreen() { 01023 if ($this->conf['edit']) { // If editing is enabled 01024 $origArr = $GLOBALS['TSFE']->sys_page->getRawRecord($this->theTable, $this->dataArr['uid']?$this->dataArr['uid']:$this->recUid); 01025 01026 if ($GLOBALS['TSFE']->loginUser || $this->aCAuth($origArr)) { // Must be logged in OR be authenticated by the aC code in order to edit 01027 // If the recUid selects a record.... (no check here) 01028 if (is_array($origArr)) { 01029 if ($this->aCAuth($origArr) || $this->cObj->DBmayFEUserEdit($this->theTable,$origArr, $GLOBALS['TSFE']->fe_user->user,$this->conf['allowedGroups'],$this->conf['fe_userEditSelf'])) { // Display the form, if access granted. 01030 $content=$this->displayEditForm($origArr); 01031 } else { // Else display error, that you could not edit that particular record... 01032 $content = $this->getPlainTemplate('###TEMPLATE_NO_PERMISSIONS###'); 01033 } 01034 } elseif ($GLOBALS['TSFE']->loginUser) { // If the recUid did not select a record, we display a menu of records. (eg. if no recUid) 01035 $lockPid = $this->conf['edit.']['menuLockPid'] ? ' AND pid='.intval($this->thePid) : ''; 01036 01037 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*', $this->theTable, '1 '.$lockPid.$this->cObj->DBmayFEUserEditSelect($this->theTable,$GLOBALS['TSFE']->fe_user->user, $this->conf['allowedGroups'],$this->conf['fe_userEditSelf']).$GLOBALS['TSFE']->sys_page->deleteClause($this->theTable)); 01038 01039 if ($GLOBALS['TYPO3_DB']->sql_num_rows($res)) { // If there are menu-items ... 01040 $templateCode = $this->getPlainTemplate('###TEMPLATE_EDITMENU###'); 01041 $out=''; 01042 $itemCode = $this->cObj->getSubpart($templateCode, '###ITEM###'); 01043 while($menuRow = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) { 01044 $markerArray = $this->cObj->fillInMarkerArray(array(), $menuRow, '', TRUE, 'FIELD_', $this->recInMarkersHSC); 01045 $markerArray = $this->setCObjects($itemCode,$menuRow,$markerArray,'ITEM_'); 01046 $out.= $this->cObj->substituteMarkerArray($itemCode, $markerArray); 01047 } 01048 $content=$this->cObj->substituteSubpart($templateCode, '###ALLITEMS###', $out); 01049 } else { // If there are not menu items.... 01050 $content = $this->getPlainTemplate('###TEMPLATE_EDITMENU_NOITEMS###'); 01051 } 01052 } else { 01053 $content = $this->getPlainTemplate('###TEMPLATE_AUTH###'); 01054 } 01055 } else { // Finally this is if there is no login user. This must tell that you must login. Perhaps link to a page with create-user or login information. 01056 $content = $this->getPlainTemplate('###TEMPLATE_AUTH###'); 01057 } 01058 } else { 01059 $content.='Edit-option is not set in TypoScript'; 01060 } 01061 return $content; 01062 } 01063 01073 function displayEditForm($origArr) { 01074 $currentArr = is_array($this->dataArr) ? $this->dataArr+$origArr : $origArr; 01075 01076 if ($this->conf['debug']) debug('displayEditForm(): '.'###TEMPLATE_EDIT'.$this->previewLabel.'###',1); 01077 $templateCode = $this->cObj->getSubpart($this->templateCode, '###TEMPLATE_EDIT'.$this->previewLabel.'###'); 01078 $failure = t3lib_div::_GP('noWarnings')?'':$this->failure; 01079 if (!$failure) {$templateCode = $this->cObj->substituteSubpart($templateCode, '###SUB_REQUIRED_FIELDS_WARNING###', '');} 01080 01081 $templateCode = $this->removeRequired($templateCode,$failure); 01082 01083 $this->setCObjects($templateCode,$currentArr); 01084 01085 $markerArray = $this->cObj->fillInMarkerArray($this->markerArray, $currentArr, '', TRUE, 'FIELD_', $this->recInMarkersHSC); 01086 01087 $markerArray['###HIDDENFIELDS###'].= '<input type="hidden" name="FE['.$this->theTable.'][uid]" value="'.$currentArr['uid'].'" />'; 01088 if ($this->conf['edit.']['preview'] && !$this->previewLabel) {$markerArray['###HIDDENFIELDS###'].= '<input type="hidden" name="preview" value="1" />';} 01089 $content = $this->cObj->substituteMarkerArray($templateCode, $markerArray); 01090 $content.=$this->cObj->getUpdateJS($this->modifyDataArrForFormUpdate($currentArr), $this->theTable.'_form', 'FE['.$this->theTable.']', $this->fieldList.$this->additionalUpdateFields); 01091 01092 return $content; 01093 } 01094 01101 function procesSetFixed() { 01102 if ($this->conf['setfixed']) { 01103 $theUid = intval($this->recUid); 01104 $origArr = $GLOBALS['TSFE']->sys_page->getRawRecord($this->theTable, $theUid); 01105 $fD = t3lib_div::_GP('fD'); 01106 $sFK = t3lib_div::_GP('sFK'); 01107 01108 $fieldArr=array(); 01109 if (is_array($fD) || $sFK=='DELETE') { 01110 if (is_array($fD)) { 01111 reset($fD); 01112 while(list($field,$value)=each($fD)) { 01113 $origArr[$field]=$value; 01114 $fieldArr[]=$field; 01115 } 01116 } 01117 $theCode = $this->setfixedHash($origArr,$origArr['_FIELDLIST']); 01118 if (!strcmp($this->authCode,$theCode)) { 01119 if ($sFK=='DELETE') { 01120 $this->cObj->DBgetDelete($this->theTable, $theUid, TRUE); 01121 } else { 01122 $newFieldList = implode(',',array_intersect(t3lib_div::trimExplode(',',$this->fieldList),t3lib_div::trimExplode(',',implode($fieldArr,','),1))); 01123 $this->cObj->DBgetUpdate($this->theTable, $theUid, $fD, $newFieldList, TRUE); 01124 $this->currentArr = $GLOBALS['TSFE']->sys_page->getRawRecord($this->theTable,$theUid); 01125 $this->userProcess_alt($this->conf['setfixed.']['userFunc_afterSave'],$this->conf['setfixed.']['userFunc_afterSave.'],array('rec'=>$this->currentArr, 'origRec'=>$origArr)); 01126 } 01127 01128 // Outputting template 01129 $this->markerArray = $this->cObj->fillInMarkerArray($this->markerArray, $origArr, '', TRUE, 'FIELD_', $this->recInMarkersHSC); 01130 $content = $this->getPlainTemplate('###TEMPLATE_SETFIXED_OK_'.$sFK.'###'); 01131 if (!$content) {$content = $this->getPlainTemplate('###TEMPLATE_SETFIXED_OK###');} 01132 01133 // Compiling email 01134 $this->compileMail( 01135 'SETFIXED_'.$sFK, 01136 array($origArr), 01137 $origArr[$this->conf['email.']['field']], 01138 $this->conf['setfixed.'] 01139 ); 01140 // Clearing cache if set: 01141 $this->clearCacheIfSet(); 01142 } else $content = $this->getPlainTemplate('###TEMPLATE_SETFIXED_FAILED###'); 01143 } else $content = $this->getPlainTemplate('###TEMPLATE_SETFIXED_FAILED###'); 01144 } 01145 return $content; 01146 } 01147 01148 01149 01150 01151 01152 01153 01154 01155 01156 01157 01158 01159 01160 01161 01162 01163 01164 01165 01166 01167 01168 01169 01170 /***************************************** 01171 * 01172 * Template processing functions 01173 * 01174 *****************************************/ 01175 01176 01177 01190 function removeRequired($templateCode,$failure) { 01191 reset($this->requiredArr); 01192 while(list(,$theField)=each($this->requiredArr)) { 01193 if (!t3lib_div::inList($failure,$theField)) { 01194 $templateCode = $this->cObj->substituteSubpart($templateCode, '###SUB_REQUIRED_FIELD_'.$theField.'###', ''); 01195 } 01196 } 01197 return $templateCode; 01198 } 01199 01208 function getPlainTemplate($key,$r='') { 01209 if ($this->conf['debug']) debug('getPlainTemplate(): '.$key,1); 01210 $templateCode = $this->cObj->getSubpart($this->templateCode, $key); 01211 $this->setCObjects($templateCode,is_array($r)?$r:array()); 01212 return $this->cObj->substituteMarkerArray( 01213 $templateCode, 01214 is_array($r) ? $this->cObj->fillInMarkerArray($this->markerArray, $r, '', TRUE, 'FIELD_', $this->recInMarkersHSC) : $this->markerArray 01215 ); 01216 } 01217 01225 function modifyDataArrForFormUpdate($inputArr) { 01226 if (is_array($this->conf[$this->cmdKey.'.']['evalValues.'])) { 01227 reset($this->conf[$this->cmdKey.'.']['evalValues.']); 01228 while(list($theField,$theValue)=each($this->conf[$this->cmdKey.'.']['evalValues.'])) { 01229 $listOfCommands = t3lib_div::trimExplode(',',$theValue,1); 01230 while(list(,$cmd)=each($listOfCommands)) { 01231 $cmdParts = split('\[|\]',$cmd); // Point is to enable parameters after each command enclosed in brackets [..]. These will be in position 1 in the array. 01232 $theCmd = trim($cmdParts[0]); 01233 switch($theCmd) { 01234 case 'twice': 01235 if (isset($inputArr[$theField])) { 01236 if (!isset($inputArr[$theField.'_again'])) { 01237 $inputArr[$theField.'_again'] = $inputArr[$theField]; 01238 } 01239 $this->additionalUpdateFields.=','.$theField.'_again'; 01240 } 01241 break; 01242 } 01243 } 01244 } 01245 } 01246 if (is_array($this->conf['parseValues.'])) { 01247 reset($this->conf['parseValues.']); 01248 while(list($theField,$theValue)=each($this->conf['parseValues.'])) { 01249 $listOfCommands = t3lib_div::trimExplode(',',$theValue,1); 01250 while(list(,$cmd)=each($listOfCommands)) { 01251 $cmdParts = split('\[|\]',$cmd); // Point is to enable parameters after each command enclosed in brackets [..]. These will be in position 1 in the array. 01252 $theCmd = trim($cmdParts[0]); 01253 switch($theCmd) { 01254 case 'multiple': 01255 if (isset($inputArr[$theField]) && !$this->isPreview()) { 01256 $inputArr[$theField] = explode(',',$inputArr[$theField]); 01257 } 01258 break; 01259 case 'checkArray': 01260 if ($inputArr[$theField] && !$this->isPreview()) { 01261 for($a=0;$a<=30;$a++) { 01262 if ($inputArr[$theField] & pow(2,$a)) { 01263 $alt_theField = $theField.']['.$a; 01264 $inputArr[$alt_theField] = 1; 01265 $this->additionalUpdateFields.=','.$alt_theField; 01266 } 01267 } 01268 } 01269 break; 01270 } 01271 } 01272 } 01273 } 01274 01275 01276 $inputArr = $this->userProcess_alt( 01277 $this->conf['userFunc_updateArray'], 01278 $this->conf['userFunc_updateArray.'], 01279 $inputArr 01280 ); 01281 01282 return $inputArr; 01283 } 01284 01294 function setCObjects($templateCode,$currentArr=array(),$markerArray='',$specialPrefix='') { 01295 if (is_array($this->conf['cObjects.'])) { 01296 reset($this->conf['cObjects.']); 01297 01298 while(list($theKey,$theConf)=each($this->conf['cObjects.'])) { 01299 if (!strstr($theKey,'.')) { 01300 if (strstr($templateCode,'###'.$specialPrefix.'CE_'.$theKey.'###')) { 01301 $cObjCode = $this->cObj->cObjGetSingle($this->conf['cObjects.'][$theKey], $this->conf['cObjects.'][$theKey.'.'], 'cObjects.'.$theKey); 01302 01303 if (!is_array($markerArray)) { 01304 $this->markerArray['###'.$specialPrefix.'CE_'.$theKey.'###'] = $cObjCode; 01305 } else { 01306 $markerArray['###'.$specialPrefix.'CE_'.$theKey.'###'] = $cObjCode; 01307 } 01308 } 01309 if (strstr($templateCode,'###'.$specialPrefix.'PCE_'.$theKey.'###')) { 01310 $local_cObj =t3lib_div::makeInstance('tslib_cObj'); 01311 $local_cObj->start(count($currentArr)?$currentArr:$this->dataArr,$this->theTable); 01312 $cObjCode = $local_cObj->cObjGetSingle($this->conf['cObjects.'][$theKey], $this->conf['cObjects.'][$theKey.'.'], 'cObjects.'.$theKey); 01313 01314 if (!is_array($markerArray)) { 01315 $this->markerArray['###'.$specialPrefix.'PCE_'.$theKey.'###'] = $cObjCode; 01316 } else { 01317 $markerArray['###'.$specialPrefix.'PCE_'.$theKey.'###'] = $cObjCode; 01318 } 01319 } 01320 } 01321 } 01322 } 01323 return $markerArray; 01324 } 01325 01326 01327 01328 01329 01330 01331 01332 01333 01334 01335 01336 01337 01338 01339 01340 01341 01342 01343 01344 /***************************************** 01345 * 01346 * Emailing 01347 * 01348 *****************************************/ 01349 01356 function sendInfoMail() { 01357 if ($this->conf['infomail'] && $this->conf['email.']['field']) { 01358 $fetch = t3lib_div::_GP('fetch'); 01359 if ($fetch) { 01360 // Getting infomail config. 01361 $key= trim(t3lib_div::_GP('key')); 01362 if (is_array($this->conf['infomail.'][$key.'.'])) { 01363 $config = $this->conf['infomail.'][$key.'.']; 01364 } else { 01365 $config = $this->conf['infomail.']['default.']; 01366 } 01367 $pidLock=''; 01368 if (!$config['dontLockPid']) { 01369 $pidLock='AND pid IN ('.$this->thePid.') '; 01370 } 01371 01372 // Getting records 01373 if (t3lib_div::testInt($fetch)) { 01374 $DBrows = $GLOBALS['TSFE']->sys_page->getRecordsByField($this->theTable,'uid',$fetch,$pidLock,'','','1'); 01375 } elseif ($fetch) { // $this->conf['email.']['field'] must be a valid field in the table! 01376 $DBrows = $GLOBALS['TSFE']->sys_page->getRecordsByField($this->theTable,$this->conf['email.']['field'],$fetch,$pidLock,'','','100'); 01377 } 01378 01379 // Processing records 01380 if (is_array($DBrows)) { 01381 $recipient = $DBrows[0][$this->conf['email.']['field']]; 01382 $this->compileMail($config['label'], $DBrows, $recipient, $this->conf['setfixed.']); 01383 } elseif ($this->cObj->checkEmail($fetch)) { 01384 $this->sendMail($fetch, '', trim($this->cObj->getSubpart($this->templateCode, '###'.$this->emailMarkPrefix.'NORECORD###'))); 01385 } 01386 01387 $content = $this->getPlainTemplate('###TEMPLATE_INFOMAIL_SENT###'); 01388 } else { 01389 $content = $this->getPlainTemplate('###TEMPLATE_INFOMAIL###'); 01390 } 01391 } else $content='Error: infomail option is not available or emailField is not setup in TypoScript'; 01392 return $content; 01393 } 01394 01404 function compileMail($key, $DBrows, $recipient, $setFixedConfig=array()) { 01405 $GLOBALS['TT']->push('compileMail'); 01406 $mailContent=''; 01407 $key = $this->emailMarkPrefix.$key; 01408 01409 $userContent['all'] = trim($this->cObj->getSubpart($this->templateCode, '###'.$key.'###')); 01410 $adminContent['all'] = trim($this->cObj->getSubpart($this->templateCode, '###'.$key.'-ADMIN###')); 01411 $userContent['rec'] = $this->cObj->getSubpart($userContent['all'], '###SUB_RECORD###'); 01412 $adminContent['rec'] = $this->cObj->getSubpart($adminContent['all'], '###SUB_RECORD###'); 01413 01414 reset($DBrows); 01415 while(list(,$r)=each($DBrows)) { 01416 $markerArray = $this->cObj->fillInMarkerArray($this->markerArray, $r,'',0); 01417 $markerArray = $this->setCObjects($userContent['rec'].$adminContent['rec'],$r,$markerArray,'ITEM_'); 01418 $markerArray['###SYS_AUTHCODE###'] = $this->authCode($r); 01419 $markerArray = $this->setfixed($markerArray, $setFixedConfig, $r); 01420 01421 if ($userContent['rec']) $userContent['accum'] .=$this->cObj->substituteMarkerArray($userContent['rec'], $markerArray); 01422 if ($adminContent['rec']) $adminContent['accum'].=$this->cObj->substituteMarkerArray($adminContent['rec'], $markerArray); 01423 } 01424 01425 if ($userContent['all']) $userContent['final'] .=$this->cObj->substituteSubpart($userContent['all'], '###SUB_RECORD###', $userContent['accum']); 01426 if ($adminContent['all']) $adminContent['final'].=$this->cObj->substituteSubpart($adminContent['all'], '###SUB_RECORD###', $adminContent['accum']); 01427 01428 if (t3lib_div::testInt($recipient)) { 01429 $fe_userRec = $GLOBALS['TSFE']->sys_page->getRawRecord('fe_users',$recipient); 01430 $recipient=$fe_userRec['email']; 01431 } 01432 01433 $GLOBALS['TT']->setTSlogMessage('Template key: ###'.$key.'###, userContentLength: '.strlen($userContent['final']).', adminContentLength: '.strlen($adminContent['final'])); 01434 01435 $this->sendMail($recipient, $this->conf['email.']['admin'], $userContent['final'], $adminContent['final']); 01436 $GLOBALS['TT']->pull(); 01437 } 01438 01450 function sendMail($recipient, $admin, $content='', $adminContent='') { 01451 // Admin mail: 01452 if ($admin && $adminContent) { 01453 if (!$this->isHTMLContent($adminContent)) { 01454 $admMail = $this->cObj->sendNotifyEmail($adminContent, 01455 $admin, 01456 '', 01457 $this->conf['email.']['from'], 01458 $this->conf['email.']['fromName'], 01459 $recipient 01460 ); 01461 } else { 01462 $this->sendHTMLMail($adminContent, 01463 $admin, 01464 '', 01465 $this->conf['email.']['from'], 01466 $this->conf['email.']['fromName'], 01467 $recipient 01468 ); 01469 } 01470 } 01471 // user mail: 01472 if (!$this->isHTMLContent($content)) { 01473 $this->cObj->sendNotifyEmail($content, 01474 $recipient, 01475 '', // ($admMail ? '' : $admin), // If the special administration mail was not found and send, the regular is... 01476 $this->conf['email.']['from'], 01477 $this->conf['email.']['fromName'] 01478 ); 01479 } else { 01480 $this->sendHTMLMail($content, 01481 $recipient, 01482 '', // ($admMail ? '' : $admin), // If the special administration mail was not found and send, the regular is... 01483 $this->conf['email.']['from'], 01484 $this->conf['email.']['fromName'] 01485 ); 01486 } 01487 } 01488 01495 function isHTMLContent($c) { 01496 $c = trim($c); 01497 $first = strtolower(substr($c,0,6)); 01498 $last = strtolower(substr($c,-7)); 01499 if ($first.$last=='<html></html>') return 1; 01500 } 01501 01516 function sendHTMLMail($content,$recipient,$dummy,$fromEmail,$fromName,$replyTo='') { 01517 if (trim($recipient) && trim($content)) { 01518 $cls=t3lib_div::makeInstanceClassName('t3lib_htmlmail'); 01519 if (class_exists($cls)) { // If htmlmail lib is included, then generate a nice HTML-email 01520 $parts = spliti('<title>|</title>',$content,3); 01521 $subject = trim($parts[1]) ? trim($parts[1]) : 'TYPO3 FE Admin message'; 01522 01523 $Typo3_htmlmail = t3lib_div::makeInstance('t3lib_htmlmail'); 01524 $Typo3_htmlmail->start(); 01525 $Typo3_htmlmail->useBase64(); 01526 01527 $Typo3_htmlmail->subject = $subject; 01528 $Typo3_htmlmail->from_email = $fromEmail; 01529 $Typo3_htmlmail->from_name = $fromName; 01530 $Typo3_htmlmail->replyto_email = $replyTo ? $replyTo : $fromEmail; 01531 $Typo3_htmlmail->replyto_name = $replyTo ? '' : $fromName; 01532 $Typo3_htmlmail->organisation = ''; 01533 $Typo3_htmlmail->priority = 3; 01534 01535 // HTML 01536 $Typo3_htmlmail->theParts['html']['content'] = $content; // Fetches the content of the page 01537 $Typo3_htmlmail->theParts['html']['path'] = ''; 01538 $Typo3_htmlmail->extractMediaLinks(); 01539 $Typo3_htmlmail->extractHyperLinks(); 01540 $Typo3_htmlmail->fetchHTMLMedia(); 01541 $Typo3_htmlmail->substMediaNamesInHTML(0); // 0 = relative 01542 $Typo3_htmlmail->substHREFsInHTML(); 01543 $Typo3_htmlmail->setHTML($Typo3_htmlmail->encodeMsg($Typo3_htmlmail->theParts['html']['content'])); 01544 01545 // PLAIN 01546 $Typo3_htmlmail->addPlain(''); 01547 01548 // SET Headers and Content 01549 $Typo3_htmlmail->setHeaders(); 01550 $Typo3_htmlmail->setContent(); 01551 $Typo3_htmlmail->setRecipient($recipient); 01552 01553 // debug($Typo3_htmlmail->theParts); 01554 $Typo3_htmlmail->sendtheMail(); 01555 } else { 01556 debug('SYSTEM ERROR: No HTML-mail library loaded. Set "page.config.incT3Lib_htmlmail = 1" is your TypoScript template.'); 01557 } 01558 } 01559 } 01560 01561 01562 01563 01564 01565 01566 01567 01568 01569 01570 01571 01572 01573 01574 01575 01576 01577 01578 01579 01580 01581 01582 01583 01584 /***************************************** 01585 * 01586 * Various helper functions 01587 * 01588 *****************************************/ 01589 01590 01600 function aCAuth($r) { 01601 if ($this->authCode && !strcmp($this->authCode,$this->authCode($r))) { 01602 return true; 01603 } 01604 } 01605 01614 function authCode($r,$extra='') { 01615 $l=$this->codeLength; 01616 if ($this->conf['authcodeFields']) { 01617 $fieldArr = t3lib_div::trimExplode(',', $this->conf['authcodeFields'], 1); 01618 $value=''; 01619 while(list(,$field)=each($fieldArr)) { 01620 $value.=$r[$field].'|'; 01621 } 01622 $value.=$extra.'|'.$this->conf['authcodeFields.']['addKey']; 01623 if ($this->conf['authcodeFields.']['addDate']) { 01624 $value.='|'.date($this->conf['authcodeFields.']['addDate']); 01625 } 01626 $value.=$GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey']; 01627 return substr(md5($value), 0,$l); 01628 } 01629 } 01630 01640 function setfixed($markerArray, $setfixed, $r) { 01641 if (is_array($setfixed)) { 01642 reset($setfixed); 01643 while(list($theKey,$data)=each($setfixed)) { 01644 if (!strcmp($theKey,'DELETE')) { 01645 $recCopy = $r; 01646 $string='&cmd=setfixed&sFK='.rawurlencode($theKey).'&rU='.$r['uid']; 01647 $string.='&aC='.$this->setfixedHash($recCopy,$data['_FIELDLIST']); 01648 $markerArray['###SYS_SETFIXED_DELETE###'] = $string; 01649 $markerArray['###SYS_SETFIXED_HSC_DELETE###'] = htmlspecialchars($string); 01650 } elseif (strstr($theKey,'.')) { 01651 $theKey = substr($theKey,0,-1); 01652 if (is_array($data)) { 01653 reset($data); 01654 $recCopy = $r; 01655 $string='&cmd=setfixed&sFK='.rawurlencode($theKey).'&rU='.$r['uid']; 01656 while(list($fieldName,$fieldValue)=each($data)) { 01657 $string.='&fD['.$fieldName.']='.rawurlencode($fieldValue); 01658 $recCopy[$fieldName]=$fieldValue; 01659 } 01660 $string.='&aC='.$this->setfixedHash($recCopy,$data['_FIELDLIST']); 01661 $markerArray['###SYS_SETFIXED_'.$theKey.'###'] = $string; 01662 $markerArray['###SYS_SETFIXED_HSC_'.$theKey.'###'] = htmlspecialchars($string); 01663 } 01664 } 01665 } 01666 } 01667 return $markerArray; 01668 } 01669 01678 function setfixedHash($recCopy,$fields='') { 01679 if ($fields) { 01680 $fieldArr = t3lib_div::trimExplode(',',$fields,1); 01681 reset($fieldArr); 01682 while(list($k,$v)=each($fieldArr)) { 01683 $recCopy_temp[$k]=$recCopy[$v]; 01684 } 01685 } else { 01686 $recCopy_temp=$recCopy; 01687 } 01688 $encStr = implode('|',$recCopy_temp).'|'.$this->conf['authcodeFields.']['addKey'].'|'.$GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey']; 01689 $hash = substr(md5($encStr),0,$this->codeLength); 01690 return $hash; 01691 } 01692 01693 01699 function isPreview() { 01700 return ($this->conf[$this->cmdKey.'.']['preview'] && $this->preview); 01701 } 01702 01708 function createFileFuncObj() { 01709 if (!$this->fileFunc) { 01710 $this->fileFunc = t3lib_div::makeInstance('t3lib_basicFileFunctions'); 01711 } 01712 } 01713 01719 function clearCacheIfSet() { 01720 if ($this->conf['clearCacheOfPages']) { 01721 $cc_pidList = $GLOBALS['TYPO3_DB']->cleanIntList($this->conf['clearCacheOfPages']); 01722 $GLOBALS['TSFE']->clearPageCacheContent_pidList($cc_pidList); 01723 } 01724 } 01725 01734 function getFailure($theField, $theCmd, $label) { 01735 return isset($this->conf['evalErrors.'][$theField.'.'][$theCmd]) ? $this->conf['evalErrors.'][$theField.'.'][$theCmd] : $label; 01736 } 01737 } 01738 01739 01740 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['media/scripts/fe_adminLib.inc']) { 01741 include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['media/scripts/fe_adminLib.inc']); 01742 } 01743 ?>