Documentation TYPO3 par Ameos |
00001 <?php 00002 /*************************************************************** 00003 * Copyright notice 00004 * 00005 * (c) 1999-2004 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 } 01125 01126 // Outputting template 01127 $this->markerArray = $this->cObj->fillInMarkerArray($this->markerArray, $origArr, '', TRUE, 'FIELD_', $this->recInMarkersHSC); 01128 $content = $this->getPlainTemplate('###TEMPLATE_SETFIXED_OK_'.$sFK.'###'); 01129 if (!$content) {$content = $this->getPlainTemplate('###TEMPLATE_SETFIXED_OK###');} 01130 01131 // Compiling email 01132 $this->compileMail( 01133 'SETFIXED_'.$sFK, 01134 array($origArr), 01135 $origArr[$this->conf['email.']['field']], 01136 $this->conf['setfixed.'] 01137 ); 01138 // Clearing cache if set: 01139 $this->clearCacheIfSet(); 01140 } else $content = $this->getPlainTemplate('###TEMPLATE_SETFIXED_FAILED###'); 01141 } else $content = $this->getPlainTemplate('###TEMPLATE_SETFIXED_FAILED###'); 01142 } 01143 return $content; 01144 } 01145 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 * Template processing functions 01171 * 01172 *****************************************/ 01173 01174 01175 01188 function removeRequired($templateCode,$failure) { 01189 reset($this->requiredArr); 01190 while(list(,$theField)=each($this->requiredArr)) { 01191 if (!t3lib_div::inList($failure,$theField)) { 01192 $templateCode = $this->cObj->substituteSubpart($templateCode, '###SUB_REQUIRED_FIELD_'.$theField.'###', ''); 01193 } 01194 } 01195 return $templateCode; 01196 } 01197 01206 function getPlainTemplate($key,$r='') { 01207 if ($this->conf['debug']) debug('getPlainTemplate(): '.$key,1); 01208 $templateCode = $this->cObj->getSubpart($this->templateCode, $key); 01209 $this->setCObjects($templateCode,is_array($r)?$r:array()); 01210 return $this->cObj->substituteMarkerArray( 01211 $templateCode, 01212 is_array($r) ? $this->cObj->fillInMarkerArray($this->markerArray, $r, '', TRUE, 'FIELD_', $this->recInMarkersHSC) : $this->markerArray 01213 ); 01214 } 01215 01223 function modifyDataArrForFormUpdate($inputArr) { 01224 if (is_array($this->conf[$this->cmdKey.'.']['evalValues.'])) { 01225 reset($this->conf[$this->cmdKey.'.']['evalValues.']); 01226 while(list($theField,$theValue)=each($this->conf[$this->cmdKey.'.']['evalValues.'])) { 01227 $listOfCommands = t3lib_div::trimExplode(',',$theValue,1); 01228 while(list(,$cmd)=each($listOfCommands)) { 01229 $cmdParts = split('\[|\]',$cmd); // Point is to enable parameters after each command enclosed in brackets [..]. These will be in position 1 in the array. 01230 $theCmd = trim($cmdParts[0]); 01231 switch($theCmd) { 01232 case 'twice': 01233 if (isset($inputArr[$theField])) { 01234 if (!isset($inputArr[$theField.'_again'])) { 01235 $inputArr[$theField.'_again'] = $inputArr[$theField]; 01236 } 01237 $this->additionalUpdateFields.=','.$theField.'_again'; 01238 } 01239 break; 01240 } 01241 } 01242 } 01243 } 01244 if (is_array($this->conf['parseValues.'])) { 01245 reset($this->conf['parseValues.']); 01246 while(list($theField,$theValue)=each($this->conf['parseValues.'])) { 01247 $listOfCommands = t3lib_div::trimExplode(',',$theValue,1); 01248 while(list(,$cmd)=each($listOfCommands)) { 01249 $cmdParts = split('\[|\]',$cmd); // Point is to enable parameters after each command enclosed in brackets [..]. These will be in position 1 in the array. 01250 $theCmd = trim($cmdParts[0]); 01251 switch($theCmd) { 01252 case 'multiple': 01253 if (isset($inputArr[$theField]) && !$this->isPreview()) { 01254 $inputArr[$theField] = explode(',',$inputArr[$theField]); 01255 } 01256 break; 01257 case 'checkArray': 01258 if ($inputArr[$theField] && !$this->isPreview()) { 01259 for($a=0;$a<=30;$a++) { 01260 if ($inputArr[$theField] & pow(2,$a)) { 01261 $alt_theField = $theField.']['.$a; 01262 $inputArr[$alt_theField] = 1; 01263 $this->additionalUpdateFields.=','.$alt_theField; 01264 } 01265 } 01266 } 01267 break; 01268 } 01269 } 01270 } 01271 } 01272 01273 01274 $inputArr = $this->userProcess_alt( 01275 $this->conf['userFunc_updateArray'], 01276 $this->conf['userFunc_updateArray.'], 01277 $inputArr 01278 ); 01279 01280 return $inputArr; 01281 } 01282 01292 function setCObjects($templateCode,$currentArr=array(),$markerArray='',$specialPrefix='') { 01293 if (is_array($this->conf['cObjects.'])) { 01294 reset($this->conf['cObjects.']); 01295 01296 while(list($theKey,$theConf)=each($this->conf['cObjects.'])) { 01297 if (!strstr($theKey,'.')) { 01298 if (strstr($templateCode,'###'.$specialPrefix.'CE_'.$theKey.'###')) { 01299 $cObjCode = $this->cObj->cObjGetSingle($this->conf['cObjects.'][$theKey], $this->conf['cObjects.'][$theKey.'.'], 'cObjects.'.$theKey); 01300 01301 if (!is_array($markerArray)) { 01302 $this->markerArray['###'.$specialPrefix.'CE_'.$theKey.'###'] = $cObjCode; 01303 } else { 01304 $markerArray['###'.$specialPrefix.'CE_'.$theKey.'###'] = $cObjCode; 01305 } 01306 } 01307 if (strstr($templateCode,'###'.$specialPrefix.'PCE_'.$theKey.'###')) { 01308 $local_cObj =t3lib_div::makeInstance('tslib_cObj'); 01309 $local_cObj->start(count($currentArr)?$currentArr:$this->dataArr,$this->theTable); 01310 $cObjCode = $local_cObj->cObjGetSingle($this->conf['cObjects.'][$theKey], $this->conf['cObjects.'][$theKey.'.'], 'cObjects.'.$theKey); 01311 01312 if (!is_array($markerArray)) { 01313 $this->markerArray['###'.$specialPrefix.'PCE_'.$theKey.'###'] = $cObjCode; 01314 } else { 01315 $markerArray['###'.$specialPrefix.'PCE_'.$theKey.'###'] = $cObjCode; 01316 } 01317 } 01318 } 01319 } 01320 } 01321 return $markerArray; 01322 } 01323 01324 01325 01326 01327 01328 01329 01330 01331 01332 01333 01334 01335 01336 01337 01338 01339 01340 01341 01342 /***************************************** 01343 * 01344 * Emailing 01345 * 01346 *****************************************/ 01347 01354 function sendInfoMail() { 01355 if ($this->conf['infomail'] && $this->conf['email.']['field']) { 01356 $fetch = t3lib_div::_GP('fetch'); 01357 if ($fetch) { 01358 // Getting infomail config. 01359 $key= trim(t3lib_div::_GP('key')); 01360 if (is_array($this->conf['infomail.'][$key.'.'])) { 01361 $config = $this->conf['infomail.'][$key.'.']; 01362 } else { 01363 $config = $this->conf['infomail.']['default.']; 01364 } 01365 $pidLock=''; 01366 if (!$config['dontLockPid']) { 01367 $pidLock='AND pid IN ('.$this->thePid.') '; 01368 } 01369 01370 // Getting records 01371 if (t3lib_div::testInt($fetch)) { 01372 $DBrows = $GLOBALS['TSFE']->sys_page->getRecordsByField($this->theTable,'uid',$fetch,$pidLock,'','','1'); 01373 } elseif ($fetch) { // $this->conf['email.']['field'] must be a valid field in the table! 01374 $DBrows = $GLOBALS['TSFE']->sys_page->getRecordsByField($this->theTable,$this->conf['email.']['field'],$fetch,$pidLock,'','','100'); 01375 } 01376 01377 // Processing records 01378 if (is_array($DBrows)) { 01379 $recipient = $DBrows[0][$this->conf['email.']['field']]; 01380 $this->compileMail($config['label'], $DBrows, $recipient, $this->conf['setfixed.']); 01381 } elseif ($this->cObj->checkEmail($fetch)) { 01382 $this->sendMail($fetch, '', trim($this->cObj->getSubpart($this->templateCode, '###'.$this->emailMarkPrefix.'NORECORD###'))); 01383 } 01384 01385 $content = $this->getPlainTemplate('###TEMPLATE_INFOMAIL_SENT###'); 01386 } else { 01387 $content = $this->getPlainTemplate('###TEMPLATE_INFOMAIL###'); 01388 } 01389 } else $content='Error: infomail option is not available or emailField is not setup in TypoScript'; 01390 return $content; 01391 } 01392 01402 function compileMail($key, $DBrows, $recipient, $setFixedConfig=array()) { 01403 $GLOBALS['TT']->push('compileMail'); 01404 $mailContent=''; 01405 $key = $this->emailMarkPrefix.$key; 01406 01407 $userContent['all'] = trim($this->cObj->getSubpart($this->templateCode, '###'.$key.'###')); 01408 $adminContent['all'] = trim($this->cObj->getSubpart($this->templateCode, '###'.$key.'-ADMIN###')); 01409 $userContent['rec'] = $this->cObj->getSubpart($userContent['all'], '###SUB_RECORD###'); 01410 $adminContent['rec'] = $this->cObj->getSubpart($adminContent['all'], '###SUB_RECORD###'); 01411 01412 reset($DBrows); 01413 while(list(,$r)=each($DBrows)) { 01414 $markerArray = $this->cObj->fillInMarkerArray($this->markerArray, $r,'',0); 01415 $markerArray = $this->setCObjects($userContent['rec'].$adminContent['rec'],$r,$markerArray,'ITEM_'); 01416 $markerArray['###SYS_AUTHCODE###'] = $this->authCode($r); 01417 $markerArray = $this->setfixed($markerArray, $setFixedConfig, $r); 01418 01419 if ($userContent['rec']) $userContent['accum'] .=$this->cObj->substituteMarkerArray($userContent['rec'], $markerArray); 01420 if ($adminContent['rec']) $adminContent['accum'].=$this->cObj->substituteMarkerArray($adminContent['rec'], $markerArray); 01421 } 01422 01423 if ($userContent['all']) $userContent['final'] .=$this->cObj->substituteSubpart($userContent['all'], '###SUB_RECORD###', $userContent['accum']); 01424 if ($adminContent['all']) $adminContent['final'].=$this->cObj->substituteSubpart($adminContent['all'], '###SUB_RECORD###', $adminContent['accum']); 01425 01426 if (t3lib_div::testInt($recipient)) { 01427 $fe_userRec = $GLOBALS['TSFE']->sys_page->getRawRecord('fe_users',$recipient); 01428 $recipient=$fe_userRec['email']; 01429 } 01430 01431 $GLOBALS['TT']->setTSlogMessage('Template key: ###'.$key.'###, userContentLength: '.strlen($userContent['final']).', adminContentLength: '.strlen($adminContent['final'])); 01432 01433 $this->sendMail($recipient, $this->conf['email.']['admin'], $userContent['final'], $adminContent['final']); 01434 $GLOBALS['TT']->pull(); 01435 } 01436 01448 function sendMail($recipient, $admin, $content='', $adminContent='') { 01449 // Admin mail: 01450 if ($admin && $adminContent) { 01451 if (!$this->isHTMLContent($adminContent)) { 01452 $admMail = $this->cObj->sendNotifyEmail($adminContent, 01453 $admin, 01454 '', 01455 $this->conf['email.']['from'], 01456 $this->conf['email.']['fromName'], 01457 $recipient 01458 ); 01459 } else { 01460 $this->sendHTMLMail($adminContent, 01461 $admin, 01462 '', 01463 $this->conf['email.']['from'], 01464 $this->conf['email.']['fromName'], 01465 $recipient 01466 ); 01467 } 01468 } 01469 // user mail: 01470 if (!$this->isHTMLContent($content)) { 01471 $this->cObj->sendNotifyEmail($content, 01472 $recipient, 01473 '', // ($admMail ? '' : $admin), // If the special administration mail was not found and send, the regular is... 01474 $this->conf['email.']['from'], 01475 $this->conf['email.']['fromName'] 01476 ); 01477 } else { 01478 $this->sendHTMLMail($content, 01479 $recipient, 01480 '', // ($admMail ? '' : $admin), // If the special administration mail was not found and send, the regular is... 01481 $this->conf['email.']['from'], 01482 $this->conf['email.']['fromName'] 01483 ); 01484 } 01485 } 01486 01493 function isHTMLContent($c) { 01494 $c = trim($c); 01495 $first = strtolower(substr($c,0,6)); 01496 $last = strtolower(substr($c,-7)); 01497 if ($first.$last=='<html></html>') return 1; 01498 } 01499 01514 function sendHTMLMail($content,$recipient,$dummy,$fromEmail,$fromName,$replyTo='') { 01515 if (trim($recipient) && trim($content)) { 01516 $cls=t3lib_div::makeInstanceClassName('t3lib_htmlmail'); 01517 if (class_exists($cls)) { // If htmlmail lib is included, then generate a nice HTML-email 01518 $parts = spliti('<title>|</title>',$content,3); 01519 $subject = trim($parts[1]) ? trim($parts[1]) : 'TYPO3 FE Admin message'; 01520 01521 $Typo3_htmlmail = t3lib_div::makeInstance('t3lib_htmlmail'); 01522 $Typo3_htmlmail->start(); 01523 $Typo3_htmlmail->useBase64(); 01524 01525 $Typo3_htmlmail->subject = $subject; 01526 $Typo3_htmlmail->from_email = $fromEmail; 01527 $Typo3_htmlmail->from_name = $fromName; 01528 $Typo3_htmlmail->replyto_email = $replyTo ? $replyTo : $fromEmail; 01529 $Typo3_htmlmail->replyto_name = $replyTo ? '' : $fromName; 01530 $Typo3_htmlmail->organisation = ''; 01531 $Typo3_htmlmail->priority = 3; 01532 01533 // HTML 01534 $Typo3_htmlmail->theParts['html']['content'] = $content; // Fetches the content of the page 01535 $Typo3_htmlmail->theParts['html']['path'] = ''; 01536 $Typo3_htmlmail->extractMediaLinks(); 01537 $Typo3_htmlmail->extractHyperLinks(); 01538 $Typo3_htmlmail->fetchHTMLMedia(); 01539 $Typo3_htmlmail->substMediaNamesInHTML(0); // 0 = relative 01540 $Typo3_htmlmail->substHREFsInHTML(); 01541 $Typo3_htmlmail->setHTML($Typo3_htmlmail->encodeMsg($Typo3_htmlmail->theParts['html']['content'])); 01542 01543 // PLAIN 01544 $Typo3_htmlmail->addPlain(''); 01545 01546 // SET Headers and Content 01547 $Typo3_htmlmail->setHeaders(); 01548 $Typo3_htmlmail->setContent(); 01549 $Typo3_htmlmail->setRecipient($recipient); 01550 01551 // debug($Typo3_htmlmail->theParts); 01552 $Typo3_htmlmail->sendtheMail(); 01553 } else { 01554 debug('SYSTEM ERROR: No HTML-mail library loaded. Set "page.config.incT3Lib_htmlmail = 1" is your TypoScript template.'); 01555 } 01556 } 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 * Various helper functions 01585 * 01586 *****************************************/ 01587 01588 01598 function aCAuth($r) { 01599 if ($this->authCode && !strcmp($this->authCode,$this->authCode($r))) { 01600 return true; 01601 } 01602 } 01603 01612 function authCode($r,$extra='') { 01613 $l=$this->codeLength; 01614 if ($this->conf['authcodeFields']) { 01615 $fieldArr = t3lib_div::trimExplode(',', $this->conf['authcodeFields'], 1); 01616 $value=''; 01617 while(list(,$field)=each($fieldArr)) { 01618 $value.=$r[$field].'|'; 01619 } 01620 $value.=$extra.'|'.$this->conf['authcodeFields.']['addKey']; 01621 if ($this->conf['authcodeFields.']['addDate']) { 01622 $value.='|'.date($this->conf['authcodeFields.']['addDate']); 01623 } 01624 $value.=$GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey']; 01625 return substr(md5($value), 0,$l); 01626 } 01627 } 01628 01638 function setfixed($markerArray, $setfixed, $r) { 01639 if (is_array($setfixed)) { 01640 reset($setfixed); 01641 while(list($theKey,$data)=each($setfixed)) { 01642 if (!strcmp($theKey,'DELETE')) { 01643 $recCopy = $r; 01644 $string='&cmd=setfixed&sFK='.rawurlencode($theKey).'&rU='.$r['uid']; 01645 $string.='&aC='.$this->setfixedHash($recCopy,$data['_FIELDLIST']); 01646 $markerArray['###SYS_SETFIXED_DELETE###'] = $string; 01647 $markerArray['###SYS_SETFIXED_HSC_DELETE###'] = htmlspecialchars($string); 01648 } elseif (strstr($theKey,'.')) { 01649 $theKey = substr($theKey,0,-1); 01650 if (is_array($data)) { 01651 reset($data); 01652 $recCopy = $r; 01653 $string='&cmd=setfixed&sFK='.rawurlencode($theKey).'&rU='.$r['uid']; 01654 while(list($fieldName,$fieldValue)=each($data)) { 01655 $string.='&fD['.$fieldName.']='.rawurlencode($fieldValue); 01656 $recCopy[$fieldName]=$fieldValue; 01657 } 01658 $string.='&aC='.$this->setfixedHash($recCopy,$data['_FIELDLIST']); 01659 $markerArray['###SYS_SETFIXED_'.$theKey.'###'] = $string; 01660 $markerArray['###SYS_SETFIXED_HSC_'.$theKey.'###'] = htmlspecialchars($string); 01661 } 01662 } 01663 } 01664 } 01665 return $markerArray; 01666 } 01667 01676 function setfixedHash($recCopy,$fields='') { 01677 if ($fields) { 01678 $fieldArr = t3lib_div::trimExplode(',',$fields,1); 01679 reset($fieldArr); 01680 while(list($k,$v)=each($fieldArr)) { 01681 $recCopy_temp[$k]=$recCopy[$v]; 01682 } 01683 } else { 01684 $recCopy_temp=$recCopy; 01685 } 01686 $encStr = implode('|',$recCopy_temp).'|'.$this->conf['authcodeFields.']['addKey'].'|'.$GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey']; 01687 $hash = substr(md5($encStr),0,$this->codeLength); 01688 return $hash; 01689 } 01690 01691 01697 function isPreview() { 01698 return ($this->conf[$this->cmdKey.'.']['preview'] && $this->preview); 01699 } 01700 01706 function createFileFuncObj() { 01707 if (!$this->fileFunc) { 01708 $this->fileFunc = t3lib_div::makeInstance('t3lib_basicFileFunctions'); 01709 } 01710 } 01711 01717 function clearCacheIfSet() { 01718 if ($this->conf['clearCacheOfPages']) { 01719 $cc_pidList = $GLOBALS['TYPO3_DB']->cleanIntList($this->conf['clearCacheOfPages']); 01720 $GLOBALS['TSFE']->clearPageCacheContent_pidList($cc_pidList); 01721 } 01722 } 01723 01732 function getFailure($theField, $theCmd, $label) { 01733 return isset($this->conf['evalErrors.'][$theField.'.'][$theCmd]) ? $this->conf['evalErrors.'][$theField.'.'][$theCmd] : $label; 01734 } 01735 } 01736 01737 01738 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['media/scripts/fe_adminLib.inc']) { 01739 include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['media/scripts/fe_adminLib.inc']); 01740 } 01741 ?>