00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00195
00196
00197
00198 require_once (PATH_t3lib.'class.t3lib_loaddbgroup.php');
00199 require_once (PATH_t3lib.'class.t3lib_parsehtml_proc.php');
00200 require_once (PATH_t3lib.'class.t3lib_stdgraphic.php');
00201 require_once (PATH_t3lib.'class.t3lib_basicfilefunc.php');
00202 require_once (PATH_t3lib."class.t3lib_refindex.php");
00203 require_once (PATH_t3lib.'class.t3lib_flexformtools.php');
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00229 class t3lib_TCEmain {
00230
00231
00232
00233
00234
00235
00236 var $storeLogMessages = TRUE;
00237 var $enableLogging = TRUE;
00238 var $reverseOrder = FALSE;
00239 var $checkSimilar = TRUE;
00240 var $stripslashes_values = TRUE;
00241 var $checkStoredRecords = TRUE;
00242 var $checkStoredRecords_loose = TRUE;
00243 var $deleteTree = FALSE;
00244 var $neverHideAtCopy = FALSE;
00245 var $dontProcessTransformations = FALSE;
00246 var $bypassWorkspaceRestrictions = FALSE;
00247
00248 var $copyWhichTables = '*';
00249 var $generalComment = '';
00250
00251 var $copyTree = 0;
00252
00253 var $defaultValues = array();
00254 var $overrideValues = array();
00255 var $alternativeFileName = array();
00256 var $data_disableFields=array();
00257 var $suggestedInsertUids=array();
00258
00259 var $callBackObj;
00260
00261
00262
00263
00264
00265
00266
00267 var $autoVersionIdMap = Array();
00268 var $substNEWwithIDs = Array();
00269 var $substNEWwithIDs_table = Array();
00270 var $copyMappingArray_merged = Array();
00271 var $copiedFileMap = Array();
00272 var $errorLog = Array();
00273
00274
00275
00276
00277
00278
00279
00280
00281 var $BE_USER;
00282 var $userid;
00283 var $username;
00284 var $admin;
00285
00286 var $defaultPermissions = array(
00287 'user' => 'show,edit,delete,new,editcontent',
00288 'group' => 'show,edit,new,editcontent',
00289 'everybody' => ''
00290 );
00291
00292 var $exclude_array;
00293 var $datamap = Array();
00294 var $cmdmap = Array();
00295
00296
00297 var $pMap = Array(
00298 'show' => 1,
00299 'edit' => 2,
00300 'delete' => 4,
00301 'new' => 8,
00302 'editcontent' => 16
00303 );
00304 var $sortIntervals = 256;
00305
00306
00307 var $recUpdateAccessCache = Array();
00308 var $recInsertAccessCache = Array();
00309 var $isRecordInWebMount_Cache=array();
00310 var $isInWebMount_Cache=array();
00311 var $cachedTSconfig = array();
00312 var $pageCache = Array();
00313 var $checkWorkspaceCache = Array();
00314
00315
00316 var $dbAnalysisStore=array();
00317 var $removeFilesStore=array();
00318 var $uploadedFileArray = array();
00319 var $registerDBList=array();
00320 var $copyMappingArray = Array();
00321
00322
00323 var $fileFunc;
00324 var $checkValue_currentRecord=array();
00325 var $autoVersioningUpdate = FALSE;
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00348 function start($data,$cmd,$altUserObject='') {
00349
00350
00351 $this->BE_USER = is_object($altUserObject) ? $altUserObject : $GLOBALS['BE_USER'];
00352 $this->userid = $this->BE_USER->user['uid'];
00353 $this->username = $this->BE_USER->user['username'];
00354 $this->admin = $this->BE_USER->user['admin'];
00355
00356 if ($GLOBALS['BE_USER']->uc['recursiveDelete']) {
00357 $this->deleteTree = 1;
00358 }
00359
00360
00361 $defaultPermissions = $GLOBALS['TYPO3_CONF_VARS']['BE']['defaultPermissions'];
00362 if (isset($defaultPermissions['user'])) {$this->defaultPermissions['user'] = $defaultPermissions['user'];}
00363 if (isset($defaultPermissions['group'])) {$this->defaultPermissions['group'] = $defaultPermissions['group'];}
00364 if (isset($defaultPermissions['everybody'])) {$this->defaultPermissions['everybody'] = $defaultPermissions['everybody'];}
00365
00366
00367 $this->exclude_array = $this->admin ? array() : $this->getExcludeListArray();
00368
00369
00370 if (is_array($data)) {
00371 reset($data);
00372 $this->datamap = $data;
00373 }
00374 if (is_array($cmd)) {
00375 reset($cmd);
00376 $this->cmdmap = $cmd;
00377 }
00378 }
00379
00387 function setMirror($mirror) {
00388 if (is_array($mirror)) {
00389 reset($mirror);
00390 while(list($table,$uid_array)=each($mirror)) {
00391 if (isset($this->datamap[$table])) {
00392 reset($uid_array);
00393 while (list($id,$uidList) = each($uid_array)) {
00394 if (isset($this->datamap[$table][$id])) {
00395 $theIdsInArray = t3lib_div::trimExplode(',',$uidList,1);
00396 while(list(,$copyToUid)=each($theIdsInArray)) {
00397 $this->datamap[$table][$copyToUid] = $this->datamap[$table][$id];
00398 }
00399 }
00400 }
00401 }
00402 }
00403 }
00404 }
00405
00412 function setDefaultsFromUserTS($userTS) {
00413 global $TCA;
00414 if (is_array($userTS)) {
00415 foreach($userTS as $k => $v) {
00416 $k = substr($k,0,-1);
00417 if ($k && is_array($v) && isset($TCA[$k])) {
00418 if (is_array($this->defaultValues[$k])) {
00419 $this->defaultValues[$k] = array_merge($this->defaultValues[$k],$v);
00420 } else {
00421 $this->defaultValues[$k] = $v;
00422 }
00423 }
00424 }
00425 }
00426 }
00427
00435 function process_uploads($postFiles) {
00436
00437 if (is_array($postFiles)) {
00438
00439
00440 if ($this->BE_USER->workspace!==0 && $this->BE_USER->workspaceRec['freeze']) {
00441 $this->newlog('All editing in this workspace has been frozen!',1);
00442 return FALSE;
00443 }
00444
00445 reset($postFiles);
00446 $subA = current($postFiles);
00447 if (is_array($subA)) {
00448 if (is_array($subA['name']) && is_array($subA['type']) && is_array($subA['tmp_name']) && is_array($subA['size'])) {
00449
00450 $this->uploadedFileArray=array();
00451
00452
00453 foreach($subA as $key => $values) {
00454 $this->process_uploads_traverseArray($this->uploadedFileArray,$values,$key);
00455 }
00456 } else {
00457 $this->uploadedFileArray=$subA;
00458 }
00459 }
00460 }
00461 }
00462
00473 function process_uploads_traverseArray(&$outputArr,$inputArr,$keyToSet) {
00474 if (is_array($inputArr)) {
00475 foreach($inputArr as $key => $value) {
00476 $this->process_uploads_traverseArray($outputArr[$key],$inputArr[$key],$keyToSet);
00477 }
00478 } else {
00479 $outputArr[$keyToSet]=$inputArr;
00480 }
00481 }
00482
00483
00484
00485
00486
00487
00488
00489
00490
00491
00492
00493
00494
00495
00496
00497
00498
00499
00500
00501
00502
00509 function process_datamap() {
00510 global $TCA, $TYPO3_CONF_VARS;
00511
00512
00513 if ($this->BE_USER->workspace!==0 && $this->BE_USER->workspaceRec['freeze']) {
00514 $this->newlog('All editing in this workspace has been frozen!',1);
00515 return FALSE;
00516 }
00517
00518
00519 $hookObjectsArr = array();
00520 if (is_array ($TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['processDatamapClass'])) {
00521 foreach ($TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['processDatamapClass'] as $classRef) {
00522 $hookObjectsArr[] = &t3lib_div::getUserObj($classRef);
00523 }
00524 }
00525
00526
00527 $orderOfTables = Array();
00528 if (isset($this->datamap['pages'])) {
00529 $orderOfTables[]='pages';
00530 }
00531 reset($this->datamap);
00532 while (list($table,) = each($this->datamap)) {
00533 if ($table!='pages') {
00534 $orderOfTables[]=$table;
00535 }
00536 }
00537
00538
00539 foreach($orderOfTables as $table) {
00540
00541
00542
00543
00544
00545
00546 $modifyAccessList = $this->checkModifyAccessList($table);
00547 if (!$modifyAccessList) {
00548 $id = 0;
00549 $this->log($table,$id,2,0,1,"Attempt to modify table '%s' without permission",1,array($table));
00550 }
00551 if (isset($TCA[$table]) && !$this->tableReadOnly($table) && is_array($this->datamap[$table]) && $modifyAccessList) {
00552 if ($this->reverseOrder) {
00553 $this->datamap[$table] = array_reverse($this->datamap[$table], 1);
00554 }
00555
00556
00557
00558
00559 foreach($this->datamap[$table] as $id => $incomingFieldArray) {
00560 if (is_array($incomingFieldArray)) {
00561
00562
00563 foreach($hookObjectsArr as $hookObj) {
00564 if (method_exists($hookObj, 'processDatamap_preProcessFieldArray')) {
00565 $hookObj->processDatamap_preProcessFieldArray($incomingFieldArray, $table, $id, $this);
00566 }
00567 }
00568
00569
00570
00571
00572 $createNewVersion = FALSE;
00573 $recordAccess = FALSE;
00574 $old_pid_value = '';
00575 $resetRejected = FALSE;
00576 $this->autoVersioningUpdate = FALSE;
00577
00578 if (!t3lib_div::testInt($id)) {
00579 $fieldArray = $this->newFieldArray($table);
00580 if (isset($incomingFieldArray['pid'])) {
00581
00582 $pid_value = $incomingFieldArray['pid'];
00583
00584
00585 $OK = 1;
00586 if (strstr($pid_value,'NEW')) {
00587 if (substr($pid_value,0,1)=='-') {$negFlag=-1;$pid_value=substr($pid_value,1);} else {$negFlag=1;}
00588 if (isset($this->substNEWwithIDs[$pid_value])) {
00589 $old_pid_value = $pid_value;
00590 $pid_value=intval($negFlag*$this->substNEWwithIDs[$pid_value]);
00591 } else {$OK = 0;}
00592 } elseif ($pid_value>=0 && $this->BE_USER->workspace!==0 && $TCA[$table]['ctrl']['versioning_followPages']) {
00593 if ($WSdestPage = t3lib_BEfunc::getWorkspaceVersionOfRecord($this->BE_USER->workspace, 'pages', $pid_value, 'uid,t3ver_swapmode')) {
00594 if ($WSdestPage['t3ver_swapmode']==0) {
00595 $pid_value = $WSdestPage['uid'];
00596 }
00597 }
00598 }
00599 $pid_value = intval($pid_value);
00600
00601
00602 if ($OK) {
00603 $sortRow = $TCA[$table]['ctrl']['sortby'];
00604 if ($pid_value>=0) {
00605 if ($sortRow) {
00606 $fieldArray[$sortRow] = $this->getSortNumber($table,0,$pid_value);
00607 }
00608 $fieldArray['pid'] = $pid_value;
00609 } else {
00610 if ($sortRow) {
00611 $tempArray=$this->getSortNumber($table,0,$pid_value);
00612 $fieldArray['pid'] = $tempArray['pid'];
00613 $fieldArray[$sortRow] = $tempArray['sortNumber'];
00614 } else {
00615 $tempdata = $this->recordInfo($table,abs($pid_value),'pid');
00616 $fieldArray['pid']=$tempdata['pid'];
00617 }
00618 }
00619 }
00620 }
00621 $theRealPid = $fieldArray['pid'];
00622
00623
00624 if ($theRealPid>=0) {
00625 $recordAccess = $this->checkRecordInsertAccess($table,$theRealPid);
00626 if ($recordAccess) {
00627 $this->addDefaultPermittedLanguageIfNotSet($table,$incomingFieldArray);
00628 $recordAccess = $this->BE_USER->recordEditAccessInternals($table,$incomingFieldArray,TRUE);
00629 if (!$recordAccess) {
00630 $this->newlog("recordEditAccessInternals() check failed. [".$this->BE_USER->errorMsg."]",1);
00631 } elseif(!$this->bypassWorkspaceRestrictions) {
00632
00633 if ($res = $this->BE_USER->workspaceAllowLiveRecordsInPID($theRealPid,$table)) {
00634 if ($res<0) {
00635 $recordAccess = FALSE;
00636 $this->newlog('Stage for versioning root point and users access level did not allow for editing',1);
00637 }
00638 } else {
00639 if ($TCA[$table]['ctrl']['versioningWS']) {
00640 $createNewVersion = TRUE;
00641 } else {
00642 $recordAccess = FALSE;
00643 $this->newlog('Record could not be created in this workspace in this branch',1);
00644 }
00645 }
00646 }
00647 }
00648 } else {
00649 debug('Internal ERROR: pid should not be less than zero!');
00650 }
00651 $status = 'new';
00652 } else {
00653 $fieldArray = array();
00654 $recordAccess = $this->checkRecordUpdateAccess($table,$id);
00655 if (!$recordAccess) {
00656 $propArr = $this->getRecordProperties($table,$id);
00657 $this->log($table,$id,2,0,1,"Attempt to modify record '%s' (%s) without permission. Or non-existing page.",2,array($propArr['header'],$table.':'.$id),$propArr['event_pid']);
00658 } else {
00659 $recordAccess = $this->BE_USER->recordEditAccessInternals($table,$id);
00660 if (!$recordAccess) {
00661 $propArr = $this->getRecordProperties($table,$id);
00662 $this->newlog("recordEditAccessInternals() check failed. [".$this->BE_USER->errorMsg."]",1);
00663 } else {
00664 $tempdata = $this->recordInfo($table,$id,'pid'.($TCA[$table]['ctrl']['versioningWS']?',t3ver_wsid,t3ver_stage':''));
00665 $theRealPid = $tempdata['pid'];
00666
00667
00668 if ($TCA[$table]['ctrl']['versioningWS'] && $tempdata['t3ver_stage']<0) {
00669 $resetRejected = TRUE;
00670 }
00671
00672
00673 if (!$this->bypassWorkspaceRestrictions && $errorCode = $this->BE_USER->workspaceCannotEditRecord($table,$tempdata)) {
00674 $recordAccess = FALSE;
00675
00676
00677 if ($this->BE_USER->workspaceAllowAutoCreation($table,$id,$theRealPid)) {
00678 $tce = t3lib_div::makeInstance('t3lib_TCEmain');
00679 $tce->stripslashes_values = 0;
00680
00681
00682 $cmd = array();
00683 $cmd[$table][$id]['version'] = array(
00684 'action' => 'new',
00685 'treeLevels' => -1,
00686 'label' => 'Auto-created for WS #'.$this->BE_USER->workspace
00687 );
00688 $tce->start(array(),$cmd);
00689 $tce->process_cmdmap();
00690 $this->errorLog = array_merge($this->errorLog,$tce->errorLog);
00691
00692 if ($tce->copyMappingArray[$table][$id]) {
00693 $this->uploadedFileArray[$table][$tce->copyMappingArray[$table][$id]] = $this->uploadedFileArray[$table][$id];
00694 $id = $this->autoVersionIdMap[$table][$id] = $tce->copyMappingArray[$table][$id];
00695 $recordAccess = TRUE;
00696 $this->autoVersioningUpdate = TRUE;
00697 } else $this->newlog("Could not be edited in offline workspace in the branch where found (failure state: '".$errorCode."'). Auto-creation of version failed!",1);
00698 } else $this->newlog("Could not be edited in offline workspace in the branch where found (failure state: '".$errorCode."'). Auto-creation of version not allowed in workspace!",1);
00699 }
00700 }
00701 }
00702 $status = 'update';
00703 }
00704
00705
00706 if ($recordAccess) {
00707
00708 list($tscPID) = t3lib_BEfunc::getTSCpid($table,$id,$old_pid_value ? $old_pid_value : $fieldArray['pid']);
00709 $TSConfig = $this->getTCEMAIN_TSconfig($tscPID);
00710 if ($status=='new' && $table=='pages' && is_array($TSConfig['permissions.'])) {
00711 $fieldArray = $this->setTSconfigPermissions($fieldArray,$TSConfig['permissions.']);
00712 }
00713 if ($createNewVersion) {
00714 $newVersion_placeholderFieldArray = $fieldArray;
00715 }
00716
00717
00718 $fieldArray = $this->fillInFieldArray($table,$id,$fieldArray,$incomingFieldArray,$theRealPid,$status,$tscPID);
00719
00720
00721
00722
00723 $fieldArray = $this->overrideFieldArray($table,$fieldArray);
00724 if ($createNewVersion) {
00725 $newVersion_placeholderFieldArray = $this->overrideFieldArray($table,$newVersion_placeholderFieldArray);
00726 }
00727
00728
00729 if ($status=='new') {
00730 if ($TCA[$table]['ctrl']['crdate']) {
00731 $fieldArray[$TCA[$table]['ctrl']['crdate']]=time();
00732 if ($createNewVersion) $newVersion_placeholderFieldArray[$TCA[$table]['ctrl']['crdate']]=time();
00733 }
00734 if ($TCA[$table]['ctrl']['cruser_id']) {
00735 $fieldArray[$TCA[$table]['ctrl']['cruser_id']]=$this->userid;
00736 if ($createNewVersion) $newVersion_placeholderFieldArray[$TCA[$table]['ctrl']['cruser_id']]=$this->userid;
00737 }
00738 } elseif ($this->checkSimilar) {
00739 $fieldArray = $this->compareFieldArrayWithCurrentAndUnset($table,$id,$fieldArray);
00740 }
00741 if ($TCA[$table]['ctrl']['tstamp'] && count($fieldArray)) {
00742 $fieldArray[$TCA[$table]['ctrl']['tstamp']]=time();
00743 if ($createNewVersion) $newVersion_placeholderFieldArray[$TCA[$table]['ctrl']['tstamp']]=time();
00744 }
00745 if ($resetRejected) {
00746 $fieldArray['t3ver_stage'] = 0;
00747 }
00748
00749
00750 foreach($hookObjectsArr as $hookObj) {
00751 if (method_exists($hookObj, 'processDatamap_postProcessFieldArray')) {
00752 $hookObj->processDatamap_postProcessFieldArray($status, $table, $id, $fieldArray, $this);
00753 }
00754 }
00755
00756
00757
00758 if (is_array($fieldArray)) {
00759 if ($status=='new') {
00760 if ($createNewVersion) {
00761 $versioningType = $table==='pages' ? $this->BE_USER->workspaceVersioningTypeGetClosest(t3lib_div::intInRange($TYPO3_CONF_VARS['BE']['newPagesVersioningType'],-1,1)) : -1;
00762 if ($this->BE_USER->workspaceVersioningTypeAccess($versioningType)) {
00763 $newVersion_placeholderFieldArray['t3ver_label'] = 'INITIAL PLACEHOLDER';
00764 $newVersion_placeholderFieldArray['t3ver_state'] = 1;
00765 $newVersion_placeholderFieldArray['t3ver_wsid'] = $this->BE_USER->workspace;
00766 $newVersion_placeholderFieldArray[$TCA[$table]['ctrl']['label']] = '[PLACEHOLDER, WS#'.$this->BE_USER->workspace.']';
00767 $this->insertDB($table,$id,$newVersion_placeholderFieldArray,FALSE);
00768
00769
00770 $fieldArray['pid'] = -1;
00771 $fieldArray['t3ver_oid'] = $this->substNEWwithIDs[$id];
00772 $fieldArray['t3ver_id'] = 1;
00773 $fieldArray['t3ver_state'] = -1;
00774 $fieldArray['t3ver_label'] = 'First draft version';
00775 $fieldArray['t3ver_wsid'] = $this->BE_USER->workspace;
00776 if ($table==='pages') {
00777 $fieldArray['t3ver_swapmode'] = $versioningType;
00778 }
00779 $phShadowId = $this->insertDB($table,$id,$fieldArray,TRUE,0,TRUE);
00780 if ($phShadowId) {
00781 $this->placeholderShadowing($table,$phShadowId);
00782 }
00783 } else $this->newlog('Versioning type "'.$versioningType.'" was not allowed, so could not create new record.',1);
00784 } else {
00785 $this->insertDB($table,$id,$fieldArray,FALSE,$incomingFieldArray['uid']);
00786 }
00787 } else {
00788 $this->updateDB($table,$id,$fieldArray);
00789 $this->placeholderShadowing($table,$id);
00790 }
00791 }
00792
00793
00794 foreach($hookObjectsArr as $hookObj) {
00795 if (method_exists($hookObj, 'processDatamap_afterDatabaseOperations')) {
00796 $hookObj->processDatamap_afterDatabaseOperations($status, $table, $id, $fieldArray, $this);
00797 }
00798 }
00799 }
00800 }
00801 }
00802 }
00803 }
00804 $this->dbAnalysisStoreExec();
00805 $this->removeRegisteredFiles();
00806 }
00807
00815 function placeholderShadowing($table,$id) {
00816 global $TCA;
00817
00818 if ($liveRec = t3lib_BEfunc::getLiveVersionOfRecord($table,$id,'*')) {
00819 if ((int)$liveRec['t3ver_state']===1) {
00820 $justStoredRecord = t3lib_BEfunc::getRecord($table,$id);
00821 $newRecord = array();
00822
00823 $shadowColumns = t3lib_div::trimExplode(',', $TCA[$table]['ctrl']['shadowColumnsForNewPlaceholders'],1);
00824 foreach($shadowColumns as $fieldName) {
00825 if (strcmp($justStoredRecord[$fieldName],$liveRec[$fieldName])) {
00826 $newRecord[$fieldName] = $justStoredRecord[$fieldName];
00827 }
00828 }
00829
00830 if (count($newRecord)) {
00831 $this->newlog('Shadowing done on fields '.implode(',',array_keys($newRecord)).' in Placeholder record '.$table.':'.$liveRec['uid'].' (offline version UID='.$id.')');
00832 $this->updateDB($table,$liveRec['uid'],$newRecord);
00833 }
00834 }
00835 }
00836 }
00837
00851 function fillInFieldArray($table,$id,$fieldArray,$incomingFieldArray,$realPid,$status,$tscPID) {
00852 global $TCA;
00853
00854
00855 t3lib_div::loadTCA($table);
00856 $originalLanguageRecord = NULL;
00857 $originalLanguage_diffStorage = NULL;
00858 $diffStorageFlag = FALSE;
00859
00860
00861 if (strstr($id,'NEW')) {
00862 $currentRecord = $checkValueRecord = $fieldArray;
00863
00864
00865
00866 if (is_array($incomingFieldArray) && is_array($checkValueRecord)) {
00867 $checkValueRecord = t3lib_div::array_merge_recursive_overrule($checkValueRecord, $incomingFieldArray);
00868 }
00869 } else {
00870 $currentRecord = $checkValueRecord = $this->recordInfo($table,$id,'*');
00871
00872
00873 if (is_array($currentRecord)
00874 && $TCA[$table]['ctrl']['transOrigDiffSourceField']
00875 && $TCA[$table]['ctrl']['languageField']
00876 && $currentRecord[$TCA[$table]['ctrl']['languageField']] > 0
00877 && $TCA[$table]['ctrl']['transOrigPointerField']
00878 && intval($currentRecord[$TCA[$table]['ctrl']['transOrigPointerField']]) > 0) {
00879
00880 $lookUpTable = $TCA[$table]['ctrl']['transOrigPointerTable'] ? $TCA[$table]['ctrl']['transOrigPointerTable'] : $table;
00881 $originalLanguageRecord = $this->recordInfo($lookUpTable,$currentRecord[$TCA[$table]['ctrl']['transOrigPointerField']],'*');
00882 t3lib_BEfunc::workspaceOL($lookUpTable,$originalLanguageRecord);
00883 $originalLanguage_diffStorage = unserialize($currentRecord[$TCA[$table]['ctrl']['transOrigDiffSourceField']]);
00884 }
00885 }
00886 $this->checkValue_currentRecord = $checkValueRecord;
00887
00888
00889
00890
00891
00892
00893
00894
00895
00896
00897 foreach($incomingFieldArray as $field => $fieldValue) {
00898 if (!in_array($table.'-'.$field, $this->exclude_array) && !$this->data_disableFields[$table][$id][$field]) {
00899
00900
00901 $languageDeny = $TCA[$table]['ctrl']['languageField'] && !strcmp($TCA[$table]['ctrl']['languageField'], $field) && !$this->BE_USER->checkLanguageAccess($fieldValue);
00902
00903 if (!$languageDeny) {
00904
00905 if ($this->stripslashes_values) {
00906 if (is_array($fieldValue)) {
00907 t3lib_div::stripSlashesOnArray($fieldValue);
00908 } else $fieldValue = stripslashes($fieldValue);
00909 }
00910
00911 switch ($field) {
00912 case 'uid':
00913 case 'pid':
00914
00915 break;
00916 case 'perms_userid':
00917 case 'perms_groupid':
00918 case 'perms_user':
00919 case 'perms_group':
00920 case 'perms_everybody':
00921
00922 if ($table=='pages' && ($this->admin || $status=='new' || $this->pageInfo($id,'perms_userid')==$this->userid) ) {
00923 $value=intval($fieldValue);
00924 switch($field) {
00925 case 'perms_userid':
00926 $fieldArray[$field]=$value;
00927 break;
00928 case 'perms_groupid':
00929 $fieldArray[$field]=$value;
00930 break;
00931 default:
00932 if ($value>=0 && $value<pow(2,5)) {
00933 $fieldArray[$field]=$value;
00934 }
00935 break;
00936 }
00937 }
00938 break;
00939 case 't3ver_oid':
00940 case 't3ver_id':
00941 case 't3ver_wsid':
00942 case 't3ver_state':
00943 case 't3ver_swapmode':
00944 case 't3ver_count':
00945 case 't3ver_stage':
00946 case 't3ver_tstamp':
00947
00948 break;
00949 default:
00950 if (isset($TCA[$table]['columns'][$field])) {
00951
00952 $res = $this->checkValue($table,$field,$fieldValue,$id,$status,$realPid,$tscPID);
00953 if (isset($res['value'])) {
00954 $fieldArray[$field]=$res['value'];
00955
00956
00957 if ($TCA[$table]['ctrl']['transOrigDiffSourceField']) {
00958 $originalLanguage_diffStorage[$field] = $originalLanguageRecord[$field];
00959 $diffStorageFlag = TRUE;
00960 }
00961 }
00962 } elseif ($TCA[$table]['ctrl']['origUid']===$field) {
00963 $fieldArray[$field] = $fieldValue;
00964 }
00965 break;
00966 }
00967 }
00968 }
00969 }
00970
00971
00972 if ($diffStorageFlag && !isset($fieldArray[$TCA[$table]['ctrl']['transOrigDiffSourceField']])) {
00973 $fieldArray[$TCA[$table]['ctrl']['transOrigDiffSourceField']] = serialize($originalLanguage_diffStorage);
00974 }
00975
00976
00977 $types_fieldConfig = t3lib_BEfunc::getTCAtypes($table,$currentRecord);
00978 $theTypeString = t3lib_BEfunc::getTCAtypeValue($table,$currentRecord);
00979 if (is_array($types_fieldConfig)) {
00980 reset($types_fieldConfig);
00981 while(list(,$vconf) = each($types_fieldConfig)) {
00982
00983 $eFile = t3lib_parsehtml_proc::evalWriteFile($vconf['spec']['static_write'],array_merge($currentRecord,$fieldArray));
00984
00985
00986 if (!$this->dontProcessTransformations) {
00987 if (isset($fieldArray[$vconf['field']])) {
00988
00989 switch((string)$incomingFieldArray['_TRANSFORM_'.$vconf['field']]) {
00990 case 'RTE':
00991 $RTEsetup = $this->BE_USER->getTSConfig('RTE',t3lib_BEfunc::getPagesTSconfig($tscPID));
00992 $thisConfig = t3lib_BEfunc::RTEsetup($RTEsetup['properties'],$table,$vconf['field'],$theTypeString);
00993
00994
00995 $RTErelPath = is_array($eFile) ? dirname($eFile['relEditFile']) : '';
00996
00997
00998 $RTEobj = &t3lib_BEfunc::RTEgetObj();
00999 if (is_object($RTEobj)) {
01000 $fieldArray[$vconf['field']] = $RTEobj->transformContent('db',$fieldArray[$vconf['field']],$table,$vconf['field'],$currentRecord,$vconf['spec'],$thisConfig,$RTErelPath,$currentRecord['pid']);
01001 } else {
01002 debug('NO RTE OBJECT FOUND!');
01003 }
01004 break;
01005 }
01006 }
01007 }
01008
01009
01010 if (is_array($eFile)) {
01011 $mixedRec = array_merge($currentRecord,$fieldArray);
01012 $SW_fileContent = t3lib_div::getUrl($eFile['editFile']);
01013 $parseHTML = t3lib_div::makeInstance('t3lib_parsehtml_proc');
01014 $parseHTML->init('','');
01015
01016 $eFileMarker = $eFile['markerField']&&trim($mixedRec[$eFile['markerField']]) ? trim($mixedRec[$eFile['markerField']]) : '###TYPO3_STATICFILE_EDIT###';
01017 $insertContent = str_replace($eFileMarker,'',$mixedRec[$eFile['contentField']]);
01018
01019 $SW_fileNewContent = $parseHTML->substituteSubpart($SW_fileContent, $eFileMarker, chr(10).$insertContent.chr(10), 1, 1);
01020 t3lib_div::writeFile($eFile['editFile'],$SW_fileNewContent);
01021
01022
01023 if (!strstr($id,'NEW') && $eFile['statusField']) {
01024 $GLOBALS['TYPO3_DB']->exec_UPDATEquery(
01025 $table,
01026 'uid='.intval($id),
01027 array(
01028 $eFile['statusField'] => $eFile['relEditFile'].' updated '.date('d-m-Y H:i:s').', bytes '.strlen($mixedRec[$eFile['contentField']])
01029 )
01030 );
01031 }
01032 } elseif ($eFile && is_string($eFile)) {
01033 $this->log($table,$id,2,0,1,"Write-file error: '%s'",13,array($eFile),$realPid);
01034 }
01035 }
01036 }
01037
01038 return $fieldArray;
01039 }
01040
01041
01042
01043
01044
01045
01046
01047
01048
01049
01050
01051
01052
01053
01054
01055
01056
01057
01072 function checkValue($table,$field,$value,$id,$status,$realPid,$tscPID) {
01073 global $TCA, $PAGES_TYPES;
01074 t3lib_div::loadTCA($table);
01075
01076 $res = Array();
01077 $recFID = $table.':'.$id.':'.$field;
01078
01079
01080 if ($table=='pages' && $field=='doktype') {
01081
01082 if (! ($this->admin || t3lib_div::inList($this->BE_USER->groupData['pagetypes_select'],$value))) {
01083 $propArr = $this->getRecordProperties($table,$id);
01084 $this->log($table,$id,5,0,1,"You cannot change the 'doktype' of page '%s' to the desired value.",1,array($propArr['header']),$propArr['event_pid']);
01085 return $res;
01086 };
01087 if ($status=='update') {
01088
01089 $onlyAllowedTables = isset($PAGES_TYPES[$value]['onlyAllowedTables']) ? $PAGES_TYPES[$value]['onlyAllowedTables'] : $PAGES_TYPES['default']['onlyAllowedTables'];
01090 if ($onlyAllowedTables) {
01091 $theWrongTables = $this->doesPageHaveUnallowedTables($id,$value);
01092 if ($theWrongTables) {
01093 $propArr = $this->getRecordProperties($table,$id);
01094 $this->log($table,$id,5,0,1,"'doktype' of page '%s' could not be changed because the page contains records from disallowed tables; %s",2,array($propArr['header'],$theWrongTables),$propArr['event_pid']);
01095 return $res;
01096 }
01097 }
01098 }
01099 }
01100
01101
01102 $curValueRec = $this->recordInfo($table,$id,$field);
01103 $curValue = $curValueRec[$field];
01104
01105
01106 $tcaFieldConf = $TCA[$table]['columns'][$field]['config'];
01107
01108
01109 $res = $this->checkValue_SW($res,$value,$tcaFieldConf,$table,$id,$curValue,$status,$realPid,$recFID,$field,$this->uploadedFileArray[$table][$id][$field],$tscPID);
01110
01111 return $res;
01112 }
01113
01132 function checkValue_SW($res,$value,$tcaFieldConf,$table,$id,$curValue,$status,$realPid,$recFID,$field,$uploadedFiles,$tscPID) {
01133
01134 $PP = array($table,$id,$curValue,$status,$realPid,$recFID,$tscPID);
01135
01136 switch ($tcaFieldConf['type']) {
01137 case 'text':
01138 case 'passthrough':
01139 case 'user':
01140 $res['value'] = $value;
01141 break;
01142 case 'input':
01143 $res = $this->checkValue_input($res,$value,$tcaFieldConf,$PP,$field);
01144 break;
01145 case 'check':
01146 $res = $this->checkValue_check($res,$value,$tcaFieldConf,$PP);
01147 break;
01148 case 'radio':
01149 $res = $this->checkValue_radio($res,$value,$tcaFieldConf,$PP);
01150 break;
01151 case 'group':
01152 case 'select':
01153 $res = $this->checkValue_group_select($res,$value,$tcaFieldConf,$PP,$uploadedFiles,$field);
01154 break;
01155 case 'flex':
01156 if ($field) {
01157 $res = $this->checkValue_flex($res,$value,$tcaFieldConf,$PP,$uploadedFiles,$field);
01158 }
01159 break;
01160 default:
01161 #debug(array($tcaFieldConf,$res,$value),'NON existing field type:');
01162 break;
01163 }
01164
01165 return $res;
01166 }
01167
01178 function checkValue_input($res,$value,$tcaFieldConf,$PP,$field='') {
01179 list($table,$id,$curValue,$status,$realPid,$recFID) = $PP;
01180
01181
01182 if (intval($tcaFieldConf['max'])>0) {$value = substr($value,0,intval($tcaFieldConf['max']));}
01183
01184
01185 if ($tcaFieldConf['range'] && $value!=$tcaFieldConf['checkbox']) {
01186 if (isset($tcaFieldConf['range']['