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 ***************************************************************/ 00179 require_once(PATH_t3lib.'class.t3lib_diff.php'); 00180 00181 00182 00191 class t3lib_TCEforms { 00192 00193 // variables not commented yet.... (do so...) 00194 var $palFieldArr = array(); 00195 var $disableWizards = 0; 00196 var $isPalettedoc = 0; 00197 var $paletteMargin = 1; 00198 var $defStyle = ''; // 'font-family:Verdana;font-size:10px;'; 00199 var $cachedTSconfig = array(); 00200 var $cachedTSconfig_fieldLevel = array(); 00201 var $transformedRow = array(); 00202 var $extJSCODE = ''; 00203 var $printNeededJS = array(); 00204 var $hiddenFieldAccum=array(); 00205 var $TBE_EDITOR_fieldChanged_func=''; 00206 var $loadMD5_JS=1; 00207 var $prevBorderStyle='[nothing here...]'; // Something unique... 00208 var $allowUpload=0; // If set direct upload fields will be shown 00209 var $titleLen=15; // $BE_USER->uc['titleLen'] but what is default?? 00210 var $defaultLanguageData = array(); // Array where records in the default language is stored. (processed by transferdata) 00211 var $defaultLanguageData_diff = array(); // Array where records in the default language is stored (raw without any processing. used for making diff) 00212 00213 00214 // EXTERNAL, static 00215 var $backPath=''; // Set this to the 'backPath' pointing back to the typo3 admin directory from the script where this form is displayed. 00216 var $returnUrl=''; // Alternative return URL path (default is t3lib_div::linkThisScript()) 00217 var $doSaveFieldName=''; // Can be set to point to a field name in the form which will be set to '1' when the form is submitted with a *save* button. This way the recipient script can determine that the form was submitted for save and not "close" for example. 00218 var $palettesCollapsed=0; // Can be set true/false to whether palettes (secondary options) are in the topframe or in form. True means they are NOT IN-form. So a collapsed palette is one, which is shown in the top frame, not in the page. 00219 var $disableRTE=0; // If set, the RTE is disabled (from form display, eg. by checkbox in the bottom of the page!) 00220 var $globalShowHelp=1; // If false, then all CSH will be disabled, regardless of settings in $this->edit_showFieldHelp 00221 var $fieldOrder=''; // Overrule the field order set in TCA[types][showitem], eg for tt_content this value, 'bodytext,image', would make first the 'bodytext' field, then the 'image' field (if set for display)... and then the rest in the old order. 00222 var $doPrintPalette=1; // If set to false, palettes will NEVER be rendered. 00223 var $clipObj=FALSE; // Set to initialized clipboard object; Then the element browser will offer a link to paste in records from clipboard. 00224 var $enableClickMenu=FALSE; // Enable click menu on reference icons. 00225 var $enableTabMenu = FALSE; // Enable Tab Menus. If set to true, the JavaScript content from template::getDynTabMenuJScode() must be included in the document. 00226 00227 var $form_rowsToStylewidth = 9.58; // Form field width compensation: Factor from NN4 form field widths to style-aware browsers (like NN6+ and MSIE, with the $CLIENT[FORMSTYLE] value set) 00228 var $form_largeComp = 1.33; // Form field width compensation: Compensation for large documents, doc-tab (editing) 00229 var $charsPerRow=40; // The number of chars expected per row when the height of a text area field is automatically calculated based on the number of characters found in the field content. 00230 var $maxTextareaWidth=48; // The maximum abstract value for textareas 00231 var $maxInputWidth=48; // The maximum abstract value for input fields 00232 var $defaultMultipleSelectorStyle='width:250px;'; // Default style for the selector boxes used for multiple items in "select" and "group" types. 00233 00234 00235 // INTERNAL, static 00236 var $prependFormFieldNames = 'data'; // The string to prepend formfield names with. 00237 var $prependFormFieldNames_file = 'data_files'; // The string to prepend FILE form field names with. 00238 var $formName = 'editform'; // The name attribute of the form. 00239 00240 00241 00242 // INTERNAL, dynamic 00243 var $perms_clause=''; // Set by readPerms() (caching) 00244 var $perms_clause_set=0; // Set by readPerms() (caching-flag) 00245 var $edit_showFieldHelp=''; // Used to indicate the mode of CSH (Context Sensitive Help), whether it should be icons-only ('icon'), full description ('text') or not at all (blank). 00246 var $docLarge=0; // If set, the forms will be rendered a little wider, more precisely with a factor of $this->form_largeComp. 00247 var $clientInfo=array(); // Loaded with info about the browser when class is instantiated. 00248 var $RTEenabled=0; // True, if RTE is possible for the current user (based on result from BE_USER->isRTE()) 00249 var $RTEenabled_notReasons=''; // If $this->RTEenabled was false, you can find the reasons listed in this array which is filled with reasons why the RTE could not be loaded) 00250 var $RTEcounter = 0; // Counter that is incremented before an RTE is created. Can be used for unique ids etc. 00251 00252 var $colorScheme; // Contains current color scheme 00253 var $classScheme; // Contains current class scheme 00254 var $defColorScheme; // Contains the default color scheme 00255 var $defClassScheme; // Contains the default class scheme 00256 var $fieldStyle; // Contains field style values 00257 var $borderStyle; // Contains border style values. 00258 00259 var $commentMessages=array(); // An accumulation of messages from the class. 00260 00261 // INTERNAL, templates 00262 var $totalWrap='<hr />|<hr />'; // Total wrapping for the table rows. 00263 var $fieldTemplate='<b>###FIELD_NAME###</b><br />###FIELD_ITEM###<hr />'; // Field template 00264 var $sectionWrap=''; // Wrapping template code for a section 00265 var $palFieldTemplateHeader=''; // Template for palette headers 00266 var $palFieldTemplate=''; // Template for palettes 00267 00268 // INTERNAL, working memory 00269 var $excludeElements=''; // Set to the fields NOT to display, if any. 00270 var $palettesRendered=array(); // During rendering of forms this will keep track of which palettes has already been rendered (so they are not rendered twice by mistake) 00271 var $hiddenFieldListArr = array(); // This array of fields will be set as hidden-fields instead of rendered normally! For instance palette fields edited in the top frame are set as hidden fields since the main form has to submit the values. The top frame actually just sets the value in the main form! 00272 var $requiredFields=array(); // Used to register input-field names, which are required. (Done during rendering of the fields). This information is then used later when the JavaScript is made. 00273 var $requiredElements=array(); // Used to register the min and max number of elements for selectorboxes where that apply (in the "group" type for instance) 00274 var $renderDepth=0; // Keeps track of the rendering depth of nested records. 00275 var $savedSchemes=array(); // Color scheme buffer. 00276 00277 // Internal, registers for user defined functions etc. 00278 var $additionalCode_pre = array(); // Additional HTML code, printed before the form. 00279 var $additionalJS_pre = array(); // Additional JavaScript, printed before the form 00280 var $additionalJS_post = array(); // Additional JavaScript printed after the form 00281 var $additionalJS_submit = array(); // Additional JavaScript executed on submit; If you set "OK" variable it will raise an error about RTEs not being loaded and offer to block further submission. 00282 00283 00284 00285 00286 00287 00288 00294 function t3lib_TCEforms() { 00295 global $CLIENT; 00296 00297 $this->clientInfo = t3lib_div::clientInfo(); 00298 00299 $this->RTEenabled = $GLOBALS['BE_USER']->isRTE(); 00300 if (!$this->RTEenabled) { 00301 $this->RTEenabled_notReasons = implode(chr(10),$GLOBALS['BE_USER']->RTE_errors); 00302 $this->commentMessages[] = 'RTE NOT ENABLED IN SYSTEM due to:'.chr(10).$this->RTEenabled_notReasons; 00303 } 00304 00305 // Default color+class scheme 00306 $this->defColorScheme = array( 00307 $GLOBALS['SOBE']->doc->bgColor, // Background for the field AND palette 00308 t3lib_div::modifyHTMLColorAll($GLOBALS['SOBE']->doc->bgColor,-20), // Background for the field header 00309 t3lib_div::modifyHTMLColorAll($GLOBALS['SOBE']->doc->bgColor,-10), // Background for the palette field header 00310 'black', // Field header font color 00311 '#666666' // Palette field header font color 00312 ); 00313 $this->defColorScheme = array(); 00314 00315 // Override / Setting defaults from TBE_STYLES array 00316 $this->resetSchemes(); 00317 00318 // Setting the current colorScheme to default. 00319 $this->defColorScheme = $this->colorScheme; 00320 $this->defClassScheme = $this->classScheme; 00321 } 00322 00328 function initDefaultBEmode() { 00329 global $BE_USER; 00330 $this->prependFormFieldNames = 'data'; 00331 $this->formName = 'editform'; 00332 $this->setNewBEDesign(); 00333 $this->docLarge = $BE_USER->uc['edit_wideDocument'] ? 1 : 0; 00334 $this->edit_showFieldHelp = $BE_USER->uc['edit_showFieldHelp']; 00335 00336 $this->edit_docModuleUpload = $BE_USER->uc['edit_docModuleUpload']; 00337 $this->titleLen = $BE_USER->uc['titleLen']; 00338 } 00339 00340 00341 00342 00343 00344 00345 00346 00347 00348 00349 00350 00351 00352 00353 00354 00355 00356 /******************************************************* 00357 * 00358 * Rendering the forms, fields etc 00359 * 00360 *******************************************************/ 00361 00373 function getSoloField($table,$row,$theFieldToReturn) { 00374 global $TCA; 00375 00376 if ($TCA[$table]) { 00377 t3lib_div::loadTCA($table); 00378 $typeNum = $this->getRTypeNum($table,$row); 00379 if ($TCA[$table]['types'][$typeNum]) { 00380 $itemList = $TCA[$table]['types'][$typeNum]['showitem']; 00381 if ($itemList) { 00382 $fields = t3lib_div::trimExplode(',',$itemList,1); 00383 $excludeElements = $this->excludeElements = $this->getExcludeElements($table,$row,$typeNum); 00384 00385 reset($fields); 00386 while(list(,$fieldInfo)=each($fields)) { 00387 $parts = explode(';',$fieldInfo); 00388 00389 $theField = trim($parts[0]); 00390 if (!in_array($theField,$excludeElements) && !strcmp($theField,$theFieldToReturn)) { 00391 if ($TCA[$table]['columns'][$theField]) { 00392 $sField = $this->getSingleField($table,$theField,$row,$parts[1],1,$parts[3],$parts[2]); 00393 return $sField['ITEM']; 00394 } 00395 } 00396 } 00397 } 00398 } 00399 } 00400 } 00401 00412 function getMainFields($table,$row,$depth=0) { 00413 global $TCA; 00414 00415 $this->renderDepth=$depth; 00416 00417 // Init vars: 00418 $out_array = array(array()); 00419 $out_array_meta = array(array( 00420 'title' => $this->getLL('l_generalTab') 00421 )); 00422 00423 $out_pointer=0; 00424 $out_sheet=0; 00425 $this->palettesRendered=array(); 00426 $this->palettesRendered[$this->renderDepth][$table]=array(); 00427 00428 if ($TCA[$table]) { 00429 00430 // Load the full TCA for the table. 00431 t3lib_div::loadTCA($table); 00432 00433 // Load the description content for the table. 00434 if ($this->edit_showFieldHelp || $this->doLoadTableDescr($table)) { 00435 $GLOBALS['LANG']->loadSingleTableDescription($table); 00436 } 00437 // Get the current "type" value for the record. 00438 $typeNum = $this->getRTypeNum($table,$row); 00439 00440 // Find the list of fields to display: 00441 if ($TCA[$table]['types'][$typeNum]) { 00442 $itemList = $TCA[$table]['types'][$typeNum]['showitem']; 00443 if ($itemList) { // If such a list existed... 00444 00445 // Explode the field list and possibly rearrange the order of the fields, if configured for 00446 $fields = t3lib_div::trimExplode(',',$itemList,1); 00447 if ($this->fieldOrder) { 00448 $fields = $this->rearrange($fields); 00449 } 00450 00451 // Get excluded fields, added fiels and put it together: 00452 $excludeElements = $this->excludeElements = $this->getExcludeElements($table,$row,$typeNum); 00453 $fields = $this->mergeFieldsWithAddedFields($fields,$this->getFieldsToAdd($table,$row,$typeNum)); 00454 00455 // Traverse the fields to render: 00456 $cc=0; 00457 foreach($fields as $fieldInfo) { 00458 // Exploding subparts of the field configuration: 00459 $parts = explode(';',$fieldInfo); 00460 00461 // Getting the style information out: 00462 $color_style_parts = t3lib_div::trimExplode('-',$parts[4]); 00463 if (strcmp($color_style_parts[0],'')) { 00464 $this->setColorScheme($GLOBALS['TBE_STYLES']['colorschemes'][intval($color_style_parts[0])]); 00465 } 00466 if (strcmp($color_style_parts[1],'')) { 00467 $this->fieldStyle = $GLOBALS['TBE_STYLES']['styleschemes'][intval($color_style_parts[1])]; 00468 if (!isset($this->fieldStyle)) $this->fieldStyle = $GLOBALS['TBE_STYLES']['styleschemes'][0]; 00469 } 00470 if (strcmp($color_style_parts[2],'')) { 00471 $this->wrapBorder($out_array[$out_sheet],$out_pointer); 00472 $this->borderStyle = $GLOBALS['TBE_STYLES']['borderschemes'][intval($color_style_parts[2])]; 00473 if (!isset($this->borderStyle)) $this->borderStyle = $GLOBALS['TBE_STYLES']['borderschemes'][0]; 00474 } 00475 00476 // Render the field: 00477 $theField = $parts[0]; 00478 if (!in_array($theField,$excludeElements)) { 00479 if ($TCA[$table]['columns'][$theField]) { 00480 $sFieldPal=''; 00481 00482 if ($parts[2] && !isset($this->palettesRendered[$this->renderDepth][$table][$parts[2]])) { 00483 $sFieldPal=$this->getPaletteFields($table,$row,$parts[2]); 00484 $this->palettesRendered[$this->renderDepth][$table][$parts[2]] = 1; 00485 } 00486 $sField = $this->getSingleField($table,$theField,$row,$parts[1],0,$parts[3],$parts[2]); 00487 if ($sField) $sField.=$sFieldPal; 00488 00489 $out_array[$out_sheet][$out_pointer].= $sField; 00490 } elseif($theField=='--div--') { 00491 if ($cc>0) { 00492 $out_array[$out_sheet][$out_pointer].=$this->getDivider(); 00493 00494 if ($this->enableTabMenu && $TCA[$table]['ctrl']['dividers2tabs']) { 00495 $this->wrapBorder($out_array[$out_sheet],$out_pointer); 00496 $out_sheet++; 00497 $out_array[$out_sheet] = array(); 00498 $out_array_meta[$out_sheet]['title'] = $this->sL($parts[1]); 00499 } 00500 } else { // Setting alternative title for "General" tab if "--div--" is the very first element. 00501 $out_array_meta[$out_sheet]['title'] = $this->sL($parts[1]); 00502 } 00503 } elseif($theField=='--palette--') { 00504 if ($parts[2] && !isset($this->palettesRendered[$this->renderDepth][$table][$parts[2]])) { 00505 // render a 'header' if not collapsed 00506 if ($TCA[$table]['palettes'][$parts[2]]['canNotCollapse'] AND $parts[1]) { 00507 $out_array[$out_sheet][$out_pointer].=$this->getPaletteFields($table,$row,$parts[2],$this->sL($parts[1])); 00508 } else { 00509 $out_array[$out_sheet][$out_pointer].=$this->getPaletteFields($table,$row,$parts[2],'','',$this->sL($parts[1])); 00510 } 00511 $this->palettesRendered[$this->renderDepth][$table][$parts[2]] = 1; 00512 } 00513 } 00514 } 00515 00516 $cc++; 00517 } 00518 } 00519 } 00520 } 00521 00522 // Wrapping a border around it all: 00523 $this->wrapBorder($out_array[$out_sheet],$out_pointer); 00524 00525 // Resetting styles: 00526 $this->resetSchemes(); 00527 00528 // Rendering Main palette, if any 00529 $mP = $TCA[$table]['ctrl']['mainpalette']; 00530 if ($mP && !isset($this->palettesRendered[$this->renderDepth][$table][$mP])) { 00531 $temp_palettesCollapsed=$this->palettesCollapsed; 00532 $this->palettesCollapsed=0; 00533 $out_array[$out_sheet][$out_pointer].=$this->getPaletteFields($table,$row,$mP,$this->getLL('l_generalOptions')); 00534 $this->palettesCollapsed=$temp_palettesCollapsed; 00535 $this->palettesRendered[$this->renderDepth][$table][$mP] = 1; 00536 } 00537 $this->wrapBorder($out_array[$out_sheet],$out_pointer); 00538 00539 if ($this->renderDepth) { 00540 $this->renderDepth--; 00541 } 00542 00543 00544 // Return the imploded $out_array: 00545 if ($out_sheet>0) { // There were --div-- dividers around... 00546 00547 // Create parts array for the tab menu: 00548 $parts = array(); 00549 foreach($out_array as $idx => $sheetContent) { 00550 $parts[] = array( 00551 'label' => $out_array_meta[$idx]['title'], 00552 'content' => '<table border="0" cellspacing="0" cellpadding="0" width="100%">'. 00553 implode('',$sheetContent). 00554 '</table>' 00555 ); 00556 } 00557 00558 return ' 00559 <tr> 00560 <td colspan="2"> 00561 '.$this->getDynTabMenu($parts, 'TCEforms:'.$table.':'.$row['uid']).' 00562 </td> 00563 </tr>'; 00564 } else { // Only one, so just implode: 00565 return implode('',$out_array[$out_sheet]); 00566 } 00567 } 00568 00579 function getListedFields($table,$row,$list) { 00580 global $TCA; 00581 00582 t3lib_div::loadTCA($table); 00583 if ($this->edit_showFieldHelp || $this->doLoadTableDescr($table)) { 00584 $GLOBALS['LANG']->loadSingleTableDescription($table); 00585 } 00586 00587 $out=''; 00588 $types_fieldConfig=t3lib_BEfunc::getTCAtypes($table,$row,1); 00589 00590 $editFieldList=array_unique(t3lib_div::trimExplode(',',$list,1)); 00591 foreach($editFieldList as $theFieldC) { 00592 list($theField,$palFields) = split('\[|\]',$theFieldC); 00593 $theField = trim($theField); 00594 $palFields = trim($palFields); 00595 if ($TCA[$table]['columns'][$theField]) { 00596 $parts = t3lib_div::trimExplode(';',$types_fieldConfig[$theField]['origString']); 00597 $sField= $this->getSingleField($table,$theField,$row,$parts[1],0,$parts[3],0); // Don't sent palette pointer - there are no options anyways for a field-list. 00598 $out.= $sField; 00599 } elseif($theField=='--div--') { 00600 $out.=$this->getDivider(); 00601 } 00602 if ($palFields) { 00603 $out.=$this->getPaletteFields($table,$row,'','',implode(',',t3lib_div::trimExplode('|',$palFields,1))); 00604 } 00605 } 00606 return $out; 00607 } 00608 00620 function getPaletteFields($table,$row,$palette,$header='',$itemList='',$collapsedHeader='') { 00621 global $TCA; 00622 if (!$this->doPrintPalette) return ''; 00623 00624 $out=''; 00625 $palParts=array(); 00626 t3lib_div::loadTCA($table); 00627 00628 // Getting excludeElements, if any. 00629 if (!is_array($this->excludeElements)) { 00630 $this->excludeElements = $this->getExcludeElements($table,$row,$this->getRTypeNum($table,$row)); 00631 } 00632 00633 // Render the palette TCEform elements. 00634 if ($TCA[$table] && (is_array($TCA[$table]['palettes'][$palette]) || $itemList)) { 00635 $itemList = $itemList?$itemList:$TCA[$table]['palettes'][$palette]['showitem']; 00636 if ($itemList) { 00637 $fields = t3lib_div::trimExplode(',',$itemList,1); 00638 reset($fields); 00639 while(list(,$fieldInfo)=each($fields)) { 00640 $parts = t3lib_div::trimExplode(';',$fieldInfo); 00641 $theField = $parts[0]; 00642 00643 if (!in_array($theField,$this->excludeElements) && $TCA[$table]['columns'][$theField]) { 00644 $this->palFieldArr[$palette][] = $theField; 00645 if ($this->isPalettesCollapsed($table,$palette)) { 00646 $this->hiddenFieldListArr[] = $theField; 00647 } 00648 00649 $part=$this->getSingleField($table,$theField,$row,$parts[1],1,'',$parts[2]); 00650 if (is_array($part)) { 00651 $palParts[]=$part; 00652 } 00653 } 00654 } 00655 } 00656 } 00657 // Put palette together if there are fields in it: 00658 if (count($palParts)) { 00659 if ($header) { 00660 $out.= $this->intoTemplate(array( 00661 'HEADER' => htmlspecialchars($header) 00662 ), 00663 $this->palFieldTemplateHeader 00664 ); 00665 } 00666 $out.= $this->intoTemplate(array( 00667 'PALETTE' => $this->printPalette($palParts) 00668 ), 00669 $this->palFieldTemplate 00670 ); 00671 } 00672 // If a palette is collapsed (not shown in form, but in top frame instead) AND a collapse header string is given, then make that string a link to activate the palette. 00673 if ($this->isPalettesCollapsed($table,$palette) && $collapsedHeader) { 00674 $pC= $this->intoTemplate(array( 00675 'PALETTE' => $this->wrapOpenPalette('<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/options.gif','width="18" height="16"').' border="0" title="'.htmlspecialchars($this->getLL('l_moreOptions')).'" align="top" alt="" /><strong>'.$collapsedHeader.'</strong>',$table,$row,$palette), 00676 ), 00677 $this->palFieldTemplate 00678 ); 00679 $out.=$pC; 00680 } 00681 return $out; 00682 } 00683 00696 function getSingleField($table,$field,$row,$altName='',$palette=0,$extra='',$pal=0) { 00697 global $TCA,$BE_USER; 00698 00699 $out = ''; 00700 $PA = array(); 00701 $PA['altName'] = $altName; 00702 $PA['palette'] = $palette; 00703 $PA['extra'] = $extra; 00704 $PA['pal'] = $pal; 00705 00706 // Make sure to load full $TCA array for the table: 00707 t3lib_div::loadTCA($table); 00708 00709 // Get the TCA configuration for the current field: 00710 $PA['fieldConf'] = $TCA[$table]['columns'][$field]; 00711 $PA['fieldConf']['config']['form_type'] = $PA['fieldConf']['config']['form_type'] ? $PA['fieldConf']['config']['form_type'] : $PA['fieldConf']['config']['type']; // Using "form_type" locally in this script 00712 00713 // Now, check if this field is configured and editable (according to excludefields + other configuration) 00714 if ( is_array($PA['fieldConf']) && 00715 (!$PA['fieldConf']['exclude'] || $BE_USER->check('non_exclude_fields',$table.':'.$field)) && 00716 $PA['fieldConf']['config']['form_type']!='passthrough' && 00717 ($this->RTEenabled || !$PA['fieldConf']['config']['showIfRTE']) && 00718 (!$PA['fieldConf']['displayCond'] || $this->isDisplayCondition($PA['fieldConf']['displayCond'],$row)) && 00719 (!$TCA[$table]['ctrl']['languageField'] || strcmp($PA['fieldConf']['l10n_mode'],'exclude') || $row[$TCA[$table]['ctrl']['languageField']]<=0) 00720 ) { 00721 00722 // Fetching the TSconfig for the current table/field. This includes the $row which means that 00723 $PA['fieldTSConfig'] = $this->setTSconfig($table,$row,$field); 00724 00725 // If the field is NOT disabled from TSconfig (which it could have been) then render it 00726 if (!$PA['fieldTSConfig']['disabled']) { 00727 00728 // Init variables: 00729 $PA['itemFormElName']=$this->prependFormFieldNames.'['.$table.']['.$row['uid'].']['.$field.']'; // Form field name 00730 $PA['itemFormElName_file']=$this->prependFormFieldNames_file.'['.$table.']['.$row['uid'].']['.$field.']'; // Form field name, in case of file uploads 00731 $PA['itemFormElValue']=$row[$field]; // The value to show in the form field. 00732 00733 // Create a JavaScript code line which will ask the user to save/update the form due to changing the element. This is used for eg. "type" fields and others configured with "requestUpdate" 00734 if ( 00735 (($TCA[$table]['ctrl']['type'] && !strcmp($field,$TCA[$table]['ctrl']['type'])) || 00736 ($TCA[$table]['ctrl']['requestUpdate'] && t3lib_div::inList($TCA[$table]['ctrl']['requestUpdate'],$field))) 00737 && !$BE_USER->uc['noOnChangeAlertInTypeFields']) { 00738 $alertMsgOnChange = 'if (confirm('.$GLOBALS['LANG']->JScharCode($this->getLL('m_onChangeAlert')).') && TBE_EDITOR_checkSubmit(-1)){ TBE_EDITOR_submitForm() };'; 00739 } else {$alertMsgOnChange='';} 00740 00741 // Render as a hidden field? 00742 if (in_array($field,$this->hiddenFieldListArr)) { 00743 $this->hiddenFieldAccum[]='<input type="hidden" name="'.$PA['itemFormElName'].'" value="'.htmlspecialchars($PA['itemFormElValue']).'" />'; 00744 } else { // Render as a normal field: 00745 00746 // If the field is NOT a palette field, then we might create an icon which links to a palette for the field, if one exists. 00747 if (!$PA['palette']) { 00748 if ($PA['pal'] && $this->isPalettesCollapsed($table,$PA['pal'])) { 00749 list($thePalIcon,$palJSfunc) = $this->wrapOpenPalette('<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/options.gif','width="18" height="16"').' border="0" title="'.htmlspecialchars($this->getLL('l_moreOptions')).'" alt="" />',$table,$row,$PA['pal'],1); 00750 } else { 00751 $thePalIcon = ''; 00752 $palJSfunc = ''; 00753 } 00754 } 00755 // onFocus attribute to add to the field: 00756 $PA['onFocus'] = ($palJSfunc && !$BE_USER->uc['dontShowPalettesOnFocusInAB']) ? ' onfocus="'.htmlspecialchars($palJSfunc).'"' : ''; 00757 00758 // Find item 00759 $item=''; 00760 $PA['label'] = $PA['altName'] ? $PA['altName'] : $PA['fieldConf']['label']; 00761 $PA['label'] = $this->sL($PA['label']); 00762 // JavaScript code for event handlers: 00763 $PA['fieldChangeFunc']=array(); 00764 $PA['fieldChangeFunc']['TBE_EDITOR_fieldChanged'] = "TBE_EDITOR_fieldChanged('".$table."','".$row['uid']."','".$field."','".$PA['itemFormElName']."');"; 00765 $PA['fieldChangeFunc']['alert']=$alertMsgOnChange; 00766 00767 // Based on the type of the item, call a render function: 00768 $item = $this->getSingleField_SW($table,$field,$row,$PA); 00769 00770 // Add language + diff 00771 $item = $this->renderDefaultLanguageContent($table,$field,$row,$item); 00772 $item = $this->renderDefaultLanguageDiff($table,$field,$row,$item); 00773 00774 // If the record has been saved and the "linkTitleToSelf" is set, we make the field name into a link, which will load ONLY this field in alt_doc.php 00775 $PA['label'] = t3lib_div::deHSCentities(htmlspecialchars($PA['label'])); 00776 if (t3lib_div::testInt($row['uid']) && $PA['fieldTSConfig']['linkTitleToSelf']) { 00777 $lTTS_url = $this->backPath.'alt_doc.php?edit['.$table.']['.$row['uid'].']=edit&columnsOnly='.$field. 00778 ($PA['fieldTSConfig']['linkTitleToSelf.']['returnUrl']?'&returnUrl='.rawurlencode($this->thisReturnUrl()):''); 00779 $PA['label'] = '<a href="'.htmlspecialchars($lTTS_url).'">'.$PA['label'].'</a>'; 00780 } 00781 00782 // Create output value: 00783 if ($PA['fieldConf']['config']['form_type']=='user' && $PA['fieldConf']['config']['noTableWrapping']) { 00784 $out = $item; 00785 } elseif ($PA['palette']) { 00786 // Array: 00787 $out=array( 00788 'NAME'=>$PA['label'], 00789 'ID'=>$row['uid'], 00790 'FIELD'=>$field, 00791 'TABLE'=>$table, 00792 'ITEM'=>$item, 00793 'HELP_ICON' => $this->helpTextIcon($table,$field,1) 00794 ); 00795 $out = $this->addUserTemplateMarkers($out,$table,$field,$row,$PA); 00796 } else { 00797 // String: 00798 $out=array( 00799 'NAME'=>$PA['label'], 00800 'ITEM'=>$item, 00801 'TABLE'=>$table, 00802 'ID'=>$row['uid'], 00803 'HELP_ICON'=>$this->helpTextIcon($table,$field), 00804 'HELP_TEXT'=>$this->helpText($table,$field), 00805 'PAL_LINK_ICON'=>$thePalIcon, 00806 'FIELD'=>$field 00807 ); 00808 $out = $this->addUserTemplateMarkers($out,$table,$field,$row,$PA); 00809 // String: 00810 $out=$this->intoTemplate($out); 00811 } 00812 } 00813 } else $this->commentMessages[]=$this->prependFormFieldNames.'['.$table.']['.$row['uid'].']['.$field.']: Disabled by TSconfig'; 00814 } 00815 // Return value (string or array) 00816 return $out; 00817 } 00818 00830 function getSingleField_SW($table,$field,$row,&$PA) { 00831 $PA['fieldConf']['config']['form_type'] = $PA['fieldConf']['config']['form_type'] ? $PA['fieldConf']['config']['form_type'] : $PA['fieldConf']['config']['type']; // Using "form_type" locally in this script 00832 00833 switch($PA['fieldConf']['config']['form_type']) { 00834 case 'input': 00835 $item = $this->getSingleField_typeInput($table,$field,$row,$PA); 00836 break; 00837 case 'text': 00838 $item = $this->getSingleField_typeText($table,$field,$row,$PA); 00839 break; 00840 case 'check': 00841 $item = $this->getSingleField_typeCheck($table,$field,$row,$PA); 00842 break; 00843 case 'radio': 00844 $item = $this->getSingleField_typeRadio($table,$field,$row,$PA); 00845 break; 00846 case 'select': 00847 $item = $this->getSingleField_typeSelect($table,$field,$row,$PA); 00848 break; 00849 case 'group': 00850 $item = $this->getSingleField_typeGroup($table,$field,$row,$PA); 00851 break; 00852 case 'none': 00853 $item = $this->getSingleField_typeNone($table,$field,$row,$PA); 00854 break; 00855 case 'user': 00856 $item = $this->getSingleField_typeUser($table,$field,$row,$PA); 00857 break; 00858 case 'flex': 00859 $item = $this->getSingleField_typeFlex($table,$field,$row,$PA); 00860 break; 00861 default: 00862 $item = $this->getSingleField_typeUnknown($table,$field,$row,$PA); 00863 break; 00864 } 00865 00866 return $item; 00867 } 00868 00869 00870 00871 00872 00873 00874 00875 00876 00877 00878 00879 00880 00881 00882 00883 00884 00885 00886 00887 /********************************************************** 00888 * 00889 * Rendering of each TCEform field type 00890 * 00891 ************************************************************/ 00892 00903 function getSingleField_typeInput($table,$field,$row,&$PA) { 00904 // typo3FormFieldSet(theField, evallist, is_in, checkbox, checkboxValue) 00905 // typo3FormFieldGet(theField, evallist, is_in, checkbox, checkboxValue, checkbox_off) 00906 00907 $config = $PA['fieldConf']['config']; 00908 # $specConf = $this->getSpecConfForField($table,$row,$field); 00909 $specConf = $this->getSpecConfFromString($PA['extra'], $PA['fieldConf']['defaultExtras']); 00910 $size = t3lib_div::intInRange($config['size']?$config['size']:30,5,$this->maxInputWidth); 00911 $evalList = t3lib_div::trimExplode(',',$config['eval'],1); 00912 00913 if (in_array('required',$evalList)) { 00914 $this->requiredFields[$table.'_'.$row['uid'].'_'.$field]=$PA['itemFormElName']; 00915 } 00916 00917 $paramsList = "'".$PA['itemFormElName']."','".implode(',',$evalList)."','".trim($config['is_in'])."',".(isset($config['checkbox'])?1:0).",'".$config['checkbox']."'"; 00918 if (isset($config['checkbox'])) { 00919 // Setting default "click-checkbox" values for eval types "date" and "datetime": 00920 $nextMidNight = mktime(0,0,0)+1*3600*24; 00921 $checkSetValue = in_array('date',$evalList) ? $nextMidNight : ''; 00922 $checkSetValue = in_array('datetime',$evalList) ? time() : $checkSetValue; 00923 00924 $cOnClick = 'typo3FormFieldGet('.$paramsList.',1,\''.$checkSetValue.'\');'.implode('',$PA['fieldChangeFunc']); 00925 $item.='<input type="checkbox" name="'.$PA['itemFormElName'].'_cb" onclick="'.htmlspecialchars($cOnClick).'" />'; 00926 } 00927 00928 $PA['fieldChangeFunc'] = array_merge(array('typo3FormFieldGet'=>'typo3FormFieldGet('.$paramsList.');'), $PA['fieldChangeFunc']); 00929 $mLgd = ($config['max']?$config['max']:256); 00930 $iOnChange = implode('',$PA['fieldChangeFunc']); 00931 $item.='<input type="text" name="'.$PA['itemFormElName'].'_hr" value=""'.$this->formWidth($size).' maxlength="'.$mLgd.'" onchange="'.htmlspecialchars($iOnChange).'"'.$PA['onFocus'].' />'; // This is the EDITABLE form field. 00932 $item.='<input type="hidden" name="'.$PA['itemFormElName'].'" value="'.htmlspecialchars($PA['itemFormElValue']).'" />'; // This is the ACTUAL form field - values from the EDITABLE field must be transferred to this field which is the one that is written to the database. 00933 $this->extJSCODE.='typo3FormFieldSet('.$paramsList.');'; 00934 00935 // Creating an alternative item without the JavaScript handlers. 00936 $altItem = '<input type="hidden" name="'.$PA['itemFormElName'].'_hr" value="" />'; 00937 $altItem.= '<input type="hidden" name="'.$PA['itemFormElName'].'" value="'.htmlspecialchars($PA['itemFormElValue']).'" />'; 00938 00939 // Wrap a wizard around the item? 00940 $item= $this->renderWizards(array($item,$altItem),$config['wizards'],$table,$row,$field,$PA,$PA['itemFormElName'].'_hr',$specConf); 00941 00942 return $item; 00943 } 00944 00955 function getSingleField_typeText($table,$field,$row,&$PA) { 00956 00957 // Init config: 00958 $config = $PA['fieldConf']['config']; 00959 00960 // Setting columns number: 00961 $cols = t3lib_div::intInRange($config['cols'] ? $config['cols'] : 30, 5, $this->maxTextareaWidth); 00962 00963 // Setting number of rows: 00964 $origRows = $rows = t3lib_div::intInRange($config['rows'] ? $config['rows'] : 5, 1, 20); 00965 if (strlen($PA['itemFormElValue']) > $this->charsPerRow*2) { 00966 $cols = $this->maxTextareaWidth; 00967 $rows = t3lib_div::intInRange(round(strlen($PA['itemFormElValue'])/$this->charsPerRow), count(explode(chr(10),$PA['itemFormElValue'])), 20); 00968 if ($rows<$origRows) $rows = $origRows; 00969 } 00970 00971 // Init RTE vars: 00972 $RTEwasLoaded = 0; // Set true, if the RTE is loaded; If not a normal textarea is shown. 00973 $RTEwouldHaveBeenLoaded = 0; // Set true, if the RTE would have been loaded if it wasn't for the disable-RTE flag in the bottom of the page... 00974 00975 // "Extra" configuration; Returns configuration for the field based on settings found in the "types" fieldlist. Traditionally, this is where RTE configuration has been found. 00976 $specConf = $this->getSpecConfFromString($PA['extra'], $PA['fieldConf']['defaultExtras']); 00977 00978 // Setting up the altItem form field, which is a hidden field containing the value 00979 $altItem = '<input type="hidden" name="'.htmlspecialchars($PA['itemFormElName']).'" value="'.htmlspecialchars($PA['itemFormElValue']).'" />'; 00980 00981 // If RTE is generally enabled (TYPO3_CONF_VARS and user settings) 00982 if ($this->RTEenabled) { 00983 $p = t3lib_BEfunc::getSpecConfParametersFromArray($specConf['rte_transform']['parameters']); 00984 if (isset($specConf['richtext']) && (!$p['flag'] || !$row[$p['flag']])) { // If the field is configured for RTE and if any flag-field is not set to disable it. 00985 list($tscPID,$thePidValue) = $this->getTSCpid($table,$row['uid'],$row['pid']); 00986 00987 // If the pid-value is not negative (that is, a pid could NOT be fetched) 00988 if ($thePidValue >= 0) { 00989 $RTEsetup = $GLOBALS['BE_USER']->getTSConfig('RTE',t3lib_BEfunc::getPagesTSconfig($tscPID)); 00990 $RTEtypeVal = t3lib_BEfunc::getTCAtypeValue($table,$row); 00991 $thisConfig = t3lib_BEfunc::RTEsetup($RTEsetup['properties'],$table,$field,$RTEtypeVal); 00992 00993 if (!$thisConfig['disabled']) { 00994 if (!$this->disableRTE) { 00995 $this->RTEcounter++; 00996 00997 // Find alternative relative path for RTE images/links: 00998 $eFile = t3lib_parsehtml_proc::evalWriteFile($specConf['static_write'], $row); 00999 $RTErelPath = is_array($eFile) ? dirname($eFile['relEditFile']) : ''; 01000 01001 // Get RTE object, draw form and set flag: 01002 $RTEobj = &t3lib_BEfunc::RTEgetObj(); 01003 $item = $RTEobj->drawRTE($this,$table,$field,$row,$PA,$specConf,$thisConfig,$RTEtypeVal,$RTErelPath,$thePidValue); 01004 01005 // Wizard: 01006 $item = $this->renderWizards(array($item,$altItem),$config['wizards'],$table,$row,$field,$PA,$PA['itemFormElName'],$specConf,1); 01007 01008 $RTEwasLoaded = 1; 01009 } else { 01010 $RTEwouldHaveBeenLoaded = 1; 01011 $this->commentMessages[] = $PA['itemFormElName'].': RTE is disabled by the on-page RTE-flag (probably you can enable it by the check-box in the bottom of this page!)'; 01012 } 01013 } else $this->commentMessages[] = $PA['itemFormElName'].': RTE is disabled by the Page TSconfig, "RTE"-key (eg. by RTE.default.disabled=0 or such)'; 01014 } else $this->commentMessages[] = $PA['itemFormElName'].': PID value could NOT be fetched. Rare error, normally with new records.'; 01015 } else { 01016 if (!isset($specConf['richtext'])) $this->commentMessages[] = $PA['itemFormElName'].': RTE was not configured for this field in TCA-types'; 01017 if (!(!$p['flag'] || !$row[$p['flag']])) $this->commentMessages[] = $PA['itemFormElName'].': Field-flag ('.$PA['flag'].') has been set to disable RTE!'; 01018 } 01019 } 01020 01021 // Display ordinary field if RTE was not loaded. 01022 if (!$RTEwasLoaded) { 01023 if ($specConf['rte_only']) { // Show message, if no RTE (field can only be edited with RTE!) 01024 $item = '<p><em>'.htmlspecialchars($this->getLL('l_noRTEfound')).'</em></p>'; 01025 } else { 01026 if ($specConf['nowrap']) { 01027 $wrap = 'off'; 01028 } else { 01029 $wrap = ($config['wrap'] ? $config['wrap'] : 'virtual'); 01030 } 01031 $iOnChange = implode('',$PA['fieldChangeFunc']); 01032 $item.= ' 01033 <textarea name="'.$PA['itemFormElName'].'"'.$this->formWidthText($cols,$wrap).' rows="'.$rows.'" wrap="'.$wrap.'" onchange="'.htmlspecialchars($iOnChange).'"'.$PA['onFocus'].'>'. 01034 t3lib_div::formatForTextarea($PA['itemFormElValue']). 01035 '</textarea>'; 01036 $item = $this->renderWizards(array($item,$altItem),$config['wizards'],$table,$row,$field,$PA,$PA['itemFormElName'],$specConf,$RTEwouldHaveBeenLoaded); 01037 } 01038 } 01039 01040 // Return field HTML: 01041 return $item; 01042 } 01043 01054 function getSingleField_typeCheck($table,$field,$row,&$PA) { 01055 $config = $PA['fieldConf']['config']; 01056 01057 // Traversing the array of items: 01058 $selItems = $this->initItemArray($PA['fieldConf']); 01059 if ($config['itemsProcFunc']) $selItems = $this->procItems($selItems,$PA['fieldTSConfig']['itemsProcFunc.'],$config,$table,$row,$field); 01060 01061 if (!count($selItems)) { 01062 $selItems[]=array('',''); 01063 } 01064 $thisValue = intval($PA['itemFormElValue']); 01065 01066 $cols = intval($config['cols']); 01067 if ($cols > 1) { 01068 $item.= '<table border="0" cellspacing="0" cellpadding="0" class="typo3-TCEforms-checkboxArray">'; 01069 for ($c=0;$c<count($selItems);$c++) { 01070 $p = $selItems[$c]; 01071 if(!($c%$cols)) { $item.='<tr>'; } 01072 $cBP = $this->checkBoxParams($PA['itemFormElName'],$thisValue,$c,count($selItems),implode('',$PA['fieldChangeFunc'])); 01073 $cBName = $PA['itemFormElName'].'_'.$c; 01074 $item.= '<td nowrap="nowrap">'. 01075 '<input type="checkbox"'.$this->insertDefStyle('check').' value="1" name="'.$cBName.'"'.$cBP.' />'. 01076 $this->wrapLabels(htmlspecialchars($p[0]).' '). 01077 '</td>'; 01078 if(($c%$cols)+1==$cols) {$item.='</tr>';} 01079 } 01080 if ($c%$cols) { 01081 $rest=$cols-($c%$cols); 01082 for ($c=0;$c<$rest;$c++) { 01083 $item.= '<td></td>'; 01084 } 01085 if ($c>0) { $item.= '</tr>'; } 01086 } 01087 $item.= '</table>'; 01088 } else { 01089 for ($c=0;$c<count($selItems);$c++) { 01090 $p = $selItems[$c]; 01091 $cBP = $this->checkBoxParams($PA['itemFormElName'],$thisValue,$c,count($selItems),implode('',$PA['fieldChangeFunc'])); 01092 $cBName = $PA['itemFormElName'].'_'.$c; 01093 $item.= ($c>0?'<br />':''). 01094 '<input type="checkbox"'.$this->insertDefStyle('check').' value="1" name="'.$cBName.'"'.$cBP.$PA['onFocus'].' />'. 01095 htmlspecialchars($p[0]); 01096 } 01097 } 01098 $item.= '<input type="hidden" name="'.$PA['itemFormElName'].'" value="'.htmlspecialchars($thisValue).'" />'; 01099 01100 return $item; 01101 } 01102 01113 function getSingleField_typeRadio($table,$field,$row,&$PA) { 01114 $config = $PA['fieldConf']['config']; 01115 01116 // Get items for the array: 01117 $selItems = $this->initItemArray($PA['fieldConf']); 01118 if ($config['itemsProcFunc']) $selItems = $this->procItems($selItems,$PA['fieldTSConfig']['itemsProcFunc.'],$config,$table,$row,$field); 01119 01120 // Traverse the items, making the form elements: 01121 for ($c=0;$c<count($selItems);$c++) { 01122 $p = $selItems[$c]; 01123 $rOnClick = implode('',$PA['fieldChangeFunc']); 01124 $rChecked = (!strcmp($p[1],$PA['itemFormElValue'])?' checked="checked"':''); 01125 $item.= '<input type="radio"'.$this->insertDefStyle('radio').' name="'.$PA['itemFormElName'].'" value="'.htmlspecialchars($p[1]).'" onclick="'.htmlspecialchars($rOnClick).'"'.$rChecked.$PA['onFocus'].' />'. 01126 htmlspecialchars($p[0]). 01127 '<br />'; 01128 } 01129 01130 return $item; 01131 } 01132 01143 function getSingleField_typeSelect($table,$field,$row,&$PA) { 01144 global $TCA; 01145 01146 // Field configuration from TCA: 01147 $config = $PA['fieldConf']['config']; 01148 01149 // "Extra" configuration; Returns configuration for the field based on settings found in the "types" fieldlist. See http://typo3.org/documentation/document-library/doc_core_api/Wizards_Configuratio/. 01150 $specConf = $this->getSpecConfFromString($PA['extra'], $PA['fieldConf']['defaultExtras']); 01151 01152 // Getting the selector box items from the system 01153 $selItems = $this->addSelectOptionsToItemArray($this->initItemArray($PA['fieldConf']),$PA['fieldConf'],$this->setTSconfig($table,$row),$field); 01154 $selItems = $this->addItems($selItems,$PA['fieldTSConfig']['addItems.']); 01155 if ($config['itemsProcFunc']) $selItems = $this->procItems($selItems,$PA['fieldTSConfig']['itemsProcFunc.'],$config,$table,$row,$field); 01156 01157 // Possibly remove some items: 01158 $removeItems = t3lib_div::trimExplode(',',$PA['fieldTSConfig']['removeItems'],1); 01159 foreach($selItems as $tk => $p) { 01160 01161 // Checking languages and authMode: 01162 $languageDeny = $TCA[$table]['ctrl']['languageField'] && !strcmp($TCA[$table]['ctrl']['languageField'], $field) && !$GLOBALS['BE_USER']->checkLanguageAccess($p[1]); 01163 $authModeDeny = $config['form_type']=='select' && $config['authMode'] && !$GLOBALS['BE_USER']->checkAuthMode($table,$field,$p[1],$config['authMode']); 01164 if (in_array($p[1],$removeItems) || $languageDeny || $authModeDeny) { 01165 unset($selItems[$tk]); 01166 } elseif (isset($PA['fieldTSConfig']['altLabels.'][$p[1]])) { 01167 $selItems[$tk][0]=$this->sL($PA['fieldTSConfig']['altLabels.'][$p[1]]); 01168 } 01169 01170 // Removing doktypes with no access: 01171 if ($table.'.'.$field == 'pages.doktype') { 01172 if (!($GLOBALS['BE_USER']->isAdmin() || t3lib_div::inList($GLOBALS['BE_USER']->groupData['pagetypes_select'],$p[1]))) { 01173 unset($selItems[$tk]); 01174 } 01175 } 01176 } 01177 01178 // Creating the label for the "No Matching Value" entry. 01179 $nMV_label = isset($PA['fieldTSConfig']['noMatchingValue_label']) ? $this->sL($PA['fieldTSConfig']['noMatchingValue_label']) : '[ '.$this->getLL('l_noMatchingValue').' ]'; 01180 01181 // Prepare some values: 01182 $maxitems = intval($config['maxitems']); 01183 01184 // If a SINGLE selector box... 01185 if ($maxitems<=1) { 01186 $item = $this->getSingleField_typeSelect_single($table,$field,$row,$PA,$config,$selItems,$nMV_label); 01187 } elseif (!strcmp($config['renderMode'],'checkbox')) { // Checkbox renderMode 01188 $item = $this->getSingleField_typeSelect_checkbox($table,$field,$row,$PA,$config,$selItems,$nMV_label); 01189 } elseif (!strcmp($config['renderMode'],'singlebox')) { // Single selector box renderMode 01190 $item = $this->getSingleField_typeSelect_singlebox($table,$field,$row,$PA,$config,$selItems,$nMV_label); 01191 } else { // Traditional multiple selector box: 01192 $item = $this->getSingleField_typeSelect_multiple($table,$field,$row,$PA,$config,$selItems,$nMV_label); 01193 } 01194 01195 // Wizards: 01196 $altItem = '<input type="hidden" name="'.$PA['itemFormElName'].'" value="'.htmlspecialchars($PA['itemFormElValue']).'" />'; 01197 $item = $this->renderWizards(array($item,$altItem),$config['wizards'],$table,$row,$field,$PA,$PA['itemFormElName'],$specConf); 01198 01199 return $item; 01200 } 01201 01216 function getSingleField_typeSelect_single($table,$field,$row,&$PA,$config,$selItems,$nMV_label) { 01217 01218 // Initialization: 01219 $c = 0; 01220 $sI = 0; 01221 $noMatchingValue = 1; 01222 $opt = array(); 01223 $selicons = array(); 01224 $onlySelectedIconShown = 0; 01225 $size = intval($config['size']); 01226 01227 // Icon configuration: 01228 if ($config['suppress_icons']=='IF_VALUE_FALSE') { 01229 $suppressIcons = !$PA['itemFormElValue'] ? 1 : 0; 01230 } elseif ($config['suppress_icons']=='ONLY_SELECTED') { 01231 $suppressIcons=0; 01232 $onlySelectedIconShown=1; 01233 } elseif ($config['suppress_icons']) { 01234 $suppressIcons = 1; 01235 } else $suppressIcons = 0; 01236 01237 // Traverse the Array of selector box items: 01238 foreach($selItems as $p) { 01239 $sM = (!strcmp($PA['itemFormElValue'],$p[1])?' selected="selected"':''); 01240 if ($sM) { 01241 $sI = $c; 01242 $noMatchingValue = 0; 01243 } 01244 01245 // Getting style attribute value (for icons): 01246 if ($config['iconsInOptionTags']) { 01247 $styleAttrValue = $this->optionTagStyle($p[2]); 01248 } 01249 01250 // Compiling the <option> tag: 01251 $opt[]= '<option value="'.htmlspecialchars($p[1]).'"'. 01252 $sM. 01253 ($styleAttrValue ? ' style="'.htmlspecialchars($styleAttrValue).'"' : ''). 01254 (!strcmp($p[1],'--div--') ? ' class="c-divider"' : ''). 01255 '>'.t3lib_div::deHSCentities(htmlspecialchars($p[0])).'</option>'; 01256 01257 // If there is an icon for the selector box (rendered in table under)...: 01258 if ($p[2] && !$suppressIcons && (!$onlySelectedIconShown || $sM)) { 01259 list($selIconFile,$selIconInfo)=$this->getIcon($p[2]); 01260 $iOnClick = $this->elName($PA['itemFormElName']).'.selectedIndex='.$c.'; '.implode('',$PA['fieldChangeFunc']).$this->blur().'return false;'; 01261 $selicons[]=array( 01262 (!$onlySelectedIconShown ? '<a href="#" onclick="'.htmlspecialchars($iOnClick).'">' : ''). 01263 '<img src="'.$selIconFile.'" '.$selIconInfo[3].' vspace="2" border="0" title="'.htmlspecialchars($p[0]).'" alt="'.htmlspecialchars($p[0]).'" />'. 01264 (!$onlySelectedIconShown ? '</a>' : ''), 01265 $c,$sM); 01266 } 01267 $c++; 01268 } 01269 01270 // No-matching-value: 01271 if ($PA['itemFormElValue'] && $noMatchingValue && !$PA['fieldTSConfig']['disableNoMatchingValueElement'] && !$config['disableNoMatchingValueElement']) { 01272 $nMV_label = @sprintf($nMV_label, $PA['itemFormElValue']); 01273 $opt[]= '<option value="'.htmlspecialchars($PA['itemFormElValue']).'" selected="selected">'.htmlspecialchars($nMV_label).'</option>'; 01274 } 01275 01276 // Create item form fields: 01277 $sOnChange = 'if (this.options[this.selectedIndex].value==\'--div--\') {this.selectedIndex='.$sI.';} '.implode('',$PA['fieldChangeFunc']); 01278 $item.= '<input type="hidden" name="'.$PA['itemFormElName'].'_selIconVal" value="'.htmlspecialchars($sI).'" />'; // MUST be inserted before the selector - else is the value of the hiddenfield here mysteriously submitted... 01279 $item.= '<select name="'.$PA['itemFormElName'].'"'. 01280 $this->insertDefStyle('select'). 01281 ($size?' size="'.$size.'"':''). 01282 ' onchange="'.htmlspecialchars($sOnChange).'"'. 01283 $PA['onFocus'].'>'; 01284 $item.= implode('',$opt); 01285 $item.= '</select>'; 01286 01287 // Create icon table: 01288 if (count($selicons)) { 01289 $item.='<table border="0" cellpadding="0" cellspacing="0" class="typo3-TCEforms-selectIcons">'; 01290 $selicon_cols = intval($config['selicon_cols']); 01291 if (!$selicon_cols) $selicon_cols=count($selicons); 01292 $sR = ceil(count($selicons)/$selicon_cols); 01293 $selicons = array_pad($selicons,$sR*$selicon_cols,''); 01294 for($sa=0;$sa<$sR;$sa++) { 01295 $item.='<tr>'; 01296 for($sb=0;$sb<$selicon_cols;$sb++) { 01297 $sk=($sa*$selicon_cols+$sb); 01298 $imgN = 'selIcon_'.$table.'_'.$row['uid'].'_'.$field.'_'.$selicons[$sk][1]; 01299 $imgS = ($selicons[$sk][2]?$this->backPath.'gfx/content_selected.gif':'clear.gif'); 01300 $item.='<td><img name="'.htmlspecialchars($imgN).'" src="'.$imgS.'" width="7" height="10" alt="" /></td>'; 01301 $item.='<td>'.$selicons[$sk][0].'</td>'; 01302 } 01303 $item.='</tr>'; 01304 } 01305 $item.='</table>'; 01306 } 01307 01308 return $item; 01309 } 01310 01325 function getSingleField_typeSelect_checkbox($table,$field,$row,&$PA,$config,$selItems,$nMV_label) { 01326 01327 // Get values in an array (and make unique, which is fine because there can be no duplicates anyway): 01328 $itemArray = array_flip($this->extractValuesOnlyFromValueLabelList($PA['itemFormElValue'])); 01329 01330 // Traverse the Array of selector box items: 01331 $tRows = array(); 01332 $sOnChange = implode('',$PA['fieldChangeFunc']); 01333 $c=0; 01334 $setAll = array(); // Used to accumulate the JS needed to restore the original selection. 01335 foreach($selItems as $p) { 01336 // Non-selectable element: 01337 if (!strcmp($p[1],'--div--')) { 01338 if (count($setAll)) { 01339 $tRows[] = ' 01340 <tr> 01341 <td colspan="2">'. 01342 '<a href="#" onclick="'.htmlspecialchars(implode('',$setAll).' return false;').'">'. 01343 htmlspecialchars($this->getLL('l_setAllCheckboxes')). 01344 '</a></td> 01345 </tr>'; 01346 $setAll = array(); 01347 } 01348 01349 $tRows[] = ' 01350 <tr class="c-header"> 01351 <td colspan="2">'.htmlspecialchars($p[0]).'</td> 01352 </tr>'; 01353 } else { 01354 // Selected or not by default: 01355 $sM = ''; 01356 if (isset($itemArray[$p[1]])) { 01357 $sM = ' checked="checked"'; 01358 unset($itemArray[$p[1]]); 01359 } 01360 01361 // Icon: 01362 $selIconFile = ''; 01363 if ($p[2]) { 01364 list($selIconFile,$selIconInfo) = $this->getIcon($p[2]); 01365 } 01366 01367 // Compile row: 01368 $onClickCell = $this->elName($PA['itemFormElName'].'['.$c.']').'.checked=!'.$this->elName($PA['itemFormElName'].'['.$c.']').'.checked;'; 01369 $onClick = 'this.attributes.getNamedItem("class").nodeValue = '.$this->elName($PA['itemFormElName'].'['.$c.']').'.checked ? "c-selectedItem" : "";'; 01370 $setAll[] = $this->elName($PA['itemFormElName'].'['.$c.']').'.checked=1;'; 01371 $tRows[] = ' 01372 <tr class="'.($sM ? 'c-selectedItem' : '').'" onclick="'.htmlspecialchars($onClick).'" style="cursor: pointer;"> 01373 <td><input type="checkbox" name="'.htmlspecialchars($PA['itemFormElName'].'['.$c.']').'" value="'.htmlspecialchars($p[1]).'"'.$sM.' onclick="'.htmlspecialchars($sOnChange).'"'.$PA['onFocus'].' /></td> 01374 <td class="c-labelCell" onclick="'.htmlspecialchars($onClickCell).'">'. 01375 ($selIconFile ? '<img src="'.$selIconFile.'" '.$selIconInfo[3].' vspace="2" border="0" class="absmiddle" style="margin-right: 4px;" alt="" />' : ''). 01376 t3lib_div::deHSCentities(htmlspecialchars($p[0])). 01377 (strcmp($p[3],'') ? '<br/><p class="c-descr">'.nl2br(trim(htmlspecialchars($p[3]))).'</p>' : ''). 01378 '</td> 01379 </tr>'; 01380 $c++; 01381 } 01382 } 01383 01384 // Remaining checkboxes will get their set-all link: 01385 if (count($setAll)) { 01386 $tRows[] = ' 01387 <tr> 01388 <td colspan="2">'. 01389 '<a href="#" onclick="'.htmlspecialchars(implode('',$setAll).' return false;').'">'. 01390 htmlspecialchars($this->getLL('l_setAllCheckboxes')). 01391 '</a></td> 01392 </tr>'; 01393 } 01394 01395 // Remaining values (invalid): 01396 if (count($itemArray) && !$PA['fieldTSConfig']['disableNoMatchingValueElement'] && !$config['disableNoMatchingValueElement']) { 01397 foreach($itemArray as $theNoMatchValue => $temp) { 01398 // Compile <checkboxes> tag: 01399 array_unshift($tRows,' 01400 <tr class="c-invalidItem"> 01401 <td><input type="checkbox" name="'.htmlspecialchars($PA['itemFormElName'].'['.$c.']').'" value="'.htmlspecialchars($theNoMatchValue).'" checked="checked" onclick="'.htmlspecialchars($sOnChange).'"'.$PA['onFocus'].' /></td> 01402 <td class="c-labelCell">'. 01403 t3lib_div::deHSCentities(htmlspecialchars(@sprintf($nMV_label, $theNoMatchValue))). 01404 '</td> 01405 </tr>'); 01406 $c++; 01407 } 01408 } 01409 01410 // Add an empty hidden field which will send a blank value if all items are unselected. 01411 $item.='<input type="hidden" name="'.htmlspecialchars($PA['itemFormElName']).'" value="" />'; 01412 01413 // Implode rows in table: 01414 $item.= ' 01415 <table border="0" cellpadding="0" cellspacing="0" class="typo3-TCEforms-select-checkbox">'. 01416 implode('',$tRows).' 01417 </table> 01418 '; 01419 01420 return $item; 01421 } 01422 01437 function getSingleField_typeSelect_singlebox($table,$field,$row,&$PA,$config,$selItems,$nMV_label) { 01438 01439 // Get values in an array (and make unique, which is fine because there can be no duplicates anyway): 01440 $itemArray = array_flip($this->extractValuesOnlyFromValueLabelList($PA['itemFormElValue'])); 01441 01442 // Traverse the Array of selector box items: 01443 $opt = array(); 01444 $restoreCmd = array(); // Used to accumulate the JS needed to restore the original selection. 01445 $c = 0; 01446 foreach($selItems as $p) { 01447 // Selected or not by default: 01448 $sM = ''; 01449 if (isset($itemArray[$p[1]])) { 01450 $sM = ' selected="selected"'; 01451 $restoreCmd[] = $this->elName($PA['itemFormElName'].'[]').'.options['.$c.'].selected=1;'; 01452 unset($itemArray[$p[1]]); 01453 } 01454 01455 // Non-selectable element: 01456 $nonSel = ''; 01457 if (!strcmp($p[1],'--div--')) { 01458 $nonSel = ' onclick="this.selected=0;" class="c-divider"'; 01459 } 01460 01461 // Icon style for option tag: 01462 if ($config['iconsInOptionTags']) { 01463 $styleAttrValue = $this->optionTagStyle($p[2]); 01464 } 01465 01466 // Compile <option> tag: 01467 $opt[] = '<option value="'.htmlspecialchars($p[1]).'"'. 01468 $sM. 01469 $nonSel. 01470 ($styleAttrValue ? ' style="'.htmlspecialchars($styleAttrValue).'"' : ''). 01471 '>'.t3lib_div::deHSCentities(htmlspecialchars($p[0])).'</option>'; 01472 $c++; 01473 } 01474 01475 // Remaining values: 01476 if (count($itemArray) && !$PA['fieldTSConfig']['disableNoMatchingValueElement'] && !$config['disableNoMatchingValueElement']) { 01477 foreach($itemArray as $theNoMatchValue => $temp) { 01478 // Compile <option> tag: 01479 array_unshift($opt,'<option value="'.htmlspecialchars($theNoMatchValue).'" selected="selected">'.t3lib_div::deHSCentities(htmlspecialchars(@sprintf($nMV_label, $theNoMatchValue))).'</option>'); 01480 } 01481 } 01482 01483 // Compile selector box: 01484 $sOnChange = implode('',$PA['fieldChangeFunc']); 01485 $selector_itemListStyle = isset($config['itemListStyle']) ? ' style="'.htmlspecialchars($config['itemListStyle']).'"' : ' style="'.$this->defaultMultipleSelectorStyle.'"'; 01486 $size = intval($config['size']); 01487 $size = $config['autoSizeMax'] ? t3lib_div::intInRange(count($selItems)+1,t3lib_div::intInRange($size,1),$config['autoSizeMax']) : $size; 01488 $selectBox = '<select name="'.$PA['itemFormElName'].'[]"'. 01489 $this->insertDefStyle('select'). 01490 ($size ? ' size="'.$size.'"' : ''). 01491 ' multiple="multiple" onchange="'.htmlspecialchars($sOnChange).'"'. 01492 $PA['onFocus']. 01493 $selector_itemListStyle.'> 01494 '. 01495 implode(' 01496 ',$opt).' 01497 </select>'; 01498 01499 // Add an empty hidden field which will send a blank value if all items are unselected. 01500 $item.='<input type="hidden" name="'.htmlspecialchars($PA['itemFormElName']).'" value="" />'; 01501 01502 // Put it all into a table: 01503 $item.= ' 01504 <table border="0" cellspacing="0" cellpadding="0" width="1" class="typo3-TCEforms-select-singlebox"> 01505 <tr> 01506 <td> 01507 '.$selectBox.' 01508 <br/> 01509 <em>'. 01510 htmlspecialchars($this->getLL('l_holdDownCTRL')). 01511 '</em> 01512 </td> 01513 <td valign="top"> 01514 <a href="#" onclick="'.htmlspecialchars($this->elName($PA['itemFormElName'].'[]').'.selectedIndex=-1;'.implode('',$restoreCmd).' return false;').'">'. 01515 '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/history.gif','width="13" height="12"').' title="'.htmlspecialchars($this->getLL('l_revertSelection')).'" alt="" />'. 01516 '</a> 01517 </td> 01518 </tr> 01519 </table> 01520 '; 01521 01522 return $item; 01523 } 01524 01539 function getSingleField_typeSelect_multiple($table,$field,$row,&$PA,$config,$selItems,$nMV_label) { 01540 01541 // Setting this hidden field (as a flag that JavaScript can read out) 01542 $item.= '<input type="hidden" name="'.$PA['itemFormElName'].'_mul" value="'.($config['multiple']?1:0).'" />'; 01543 01544 // Set max and min items: 01545 $maxitems = t3lib_div::intInRange($config['maxitems'],0); 01546 if (!$maxitems) $maxitems=100000; 01547 $minitems = t3lib_div::intInRange($config['minitems'],0); 01548 01549 // Register the required number of elements: 01550 $this->requiredElements[$PA['itemFormElName']] = array($minitems,$maxitems,'imgName'=>$table.'_'.$row['uid'].'_'.$field); 01551 01552 // Get "removeItems": 01553 $removeItems = t3lib_div::trimExplode(',',$PA['fieldTSConfig']['removeItems'],1); 01554 01555 // Perform modification of the selected items array: 01556 $itemArray = t3lib_div::trimExplode(',',$PA['itemFormElValue'],1); 01557 foreach($itemArray as $tk => $tv) { 01558 $tvP = explode('|',$tv,2); 01559 $evalValue = rawurldecode($tvP[0]); 01560 $isRemoved = in_array($evalValue,$removeItems) || ($config['form_type']=='select' && $config['authMode'] && !$GLOBALS['BE_USER']->checkAuthMode($table,$field,$evalValue,$config['authMode'])); 01561 if ($isRemoved && !$PA['fieldTSConfig']['disableNoMatchingValueElement'] && !$config['disableNoMatchingValueElement']) { 01562 $tvP[1] = rawurlencode(@sprintf($nMV_label, $evalValue)); 01563 } elseif (isset($PA['fieldTSConfig']['altLabels.'][$evalValue])) { 01564 $tvP[1] = rawurlencode($this->sL($PA['fieldTSConfig']['altLabels.'][$evalValue])); 01565 } else { 01566 $tvP[1] = rawurlencode($this->sL(rawurldecode($tvP[1]))); 01567 } 01568 $itemArray[$tk] = implode('|',$tvP); 01569 } 01570 01571 // Create option tags: 01572 $opt = array(); 01573 $styleAttrValue = ''; 01574 foreach($selItems as $p) { 01575 if ($config['iconsInOptionTags']) { 01576 $styleAttrValue = $this->optionTagStyle($p[2]); 01577 } 01578 $opt[]= '<option value="'.htmlspecialchars($p[1]).'"'. 01579 ($styleAttrValue ? ' style="'.htmlspecialchars($styleAttrValue).'"' : ''). 01580 '>'.htmlspecialchars($p[0]).'</option>'; 01581 } 01582 01583 // Put together the selector box: 01584 $selector_itemListStyle = isset($config['itemListStyle']) ? ' style="'.htmlspecialchars($config['itemListStyle']).'"' : ' style="'.$this->defaultMultipleSelectorStyle.'"'; 01585 $size = intval($config['size']); 01586 $size = $config['autoSizeMax'] ? t3lib_div::intInRange(count($itemArray)+1,t3lib_div::intInRange($size,1),$config['autoSizeMax']) : $size; 01587 $sOnChange = 'setFormValueFromBrowseWin(\''.$PA['itemFormElName'].'\',this.options[this.selectedIndex].value,this.options[this.selectedIndex].text); '.implode('',$PA['fieldChangeFunc']); 01588 $itemsToSelect = ' 01589 <select name="'.$PA['itemFormElName'].'_sel"'. 01590 $this->insertDefStyle('select'). 01591 ($size ? ' size="'.$size.'"' : ''). 01592 ' onchange="'.htmlspecialchars($sOnChange).'"'. 01593 $PA['onFocus']. 01594 $selector_itemListStyle.'> 01595 '.implode(' 01596 ',$opt).' 01597 </select>'; 01598 01599 // Pass to "dbFileIcons" function: 01600 $params = array( 01601 'size' => $size, 01602 'autoSizeMax' => t3lib_div::intInRange($config['autoSizeMax'],0), 01603 'style' => isset($config['selectedListStyle']) ? ' style="'.htmlspecialchars($config['selectedListStyle']).'"' : ' style="'.$this->defaultMultipleSelectorStyle.'"', 01604 'dontShowMoveIcons' => ($maxitems<=1), 01605 'maxitems' => $maxitems, 01606 'info' => '', 01607 'headers' => array( 01608 'selector' => $this->getLL('l_selected').':<br />', 01609 'items' => $this->getLL('l_items').':<br />' 01610 ), 01611 'noBrowser' => 1, 01612 'thumbnails' => $itemsToSelect 01613 ); 01614 $item.= $this->dbFileIcons($PA['itemFormElName'],'','',$itemArray,'',$params,$PA['onFocus']); 01615 01616 return $item; 01617 } 01618 01629 function getSingleField_typeGroup($table,$field,$row,&$PA) { 01630 // Init: 01631 $config = $PA['fieldConf']['config']; 01632 $internal_type = $config['internal_type']; 01633 $show_thumbs = $config['show_thumbs']; 01634 $size = intval($config['size']); 01635 $maxitems = t3lib_div::intInRange($config['maxitems'],0); 01636 if (!$maxitems) $maxitems=100000; 01637 $minitems = t3lib_div::intInRange($config['minitems'],0); 01638 $allowed = $config['allowed']; 01639 $disallowed = $config['disallowed']; 01640 01641 $item.= '<input type="hidden" name="'.$PA['itemFormElName'].'_mul" value="'.($config['multiple']?1:0).'" />'; 01642 $this->requiredElements[$PA['itemFormElName']] = array($minitems,$maxitems,'imgName'=>$table.'_'.$row['uid'].'_'.$field); 01643 $info=''; 01644 01645 // "Extra" configuration; Returns configuration for the field based on settings found in the "types" fieldlist. See http://typo3.org/documentation/document-library/doc_core_api/Wizards_Configuratio/. 01646 $specConf = $this->getSpecConfFromString($PA['extra'], $PA['fieldConf']['defaultExtras']); 01647 01648 // Acting according to either "file" or "db" type: 01649 switch((string)$config['internal_type']) { 01650 case 'file': // If the element is of the internal type "file": 01651 01652 // Creating string showing allowed types: 01653 $tempFT = t3lib_div::trimExplode(',',$allowed,1); 01654 if (!count($tempFT)) {$info.='*';} 01655 foreach($tempFT as $ext) { 01656 if ($ext) { 01657 $info.=strtoupper($ext).' '; 01658 } 01659 } 01660 // Creating string, showing disallowed types: 01661 $tempFT_dis = t3lib_div::trimExplode(',',$disallowed,1); 01662 if (count($tempFT_dis)) {$info.='<br />';} 01663 foreach($tempFT_dis as $ext) { 01664 if ($ext) { 01665 $info.='-'.strtoupper($ext).' '; 01666 } 01667 } 01668 01669 // Making the array of file items: 01670 $itemArray = t3lib_div::trimExplode(',',$PA['itemFormElValue'],1); 01671 01672 // Showing thumbnails: 01673 $thumbsnail = ''; 01674 if ($show_thumbs) { 01675 $imgs = array(); 01676 foreach($itemArray as $imgRead) { 01677 $imgP = explode('|',$imgRead); 01678 01679 $rowCopy = array(); 01680 $rowCopy[$field] = $imgP[0]; 01681 01682 // Icon + clickmenu: 01683 $absFilePath = t3lib_div::getFileAbsFileName($config['uploadfolder'].'/'.$imgP[0]); 01684 01685 $fI = pathinfo($imgP[0]); 01686 $fileIcon = t3lib_BEfunc::getFileIcon(strtolower($fI['extension'])); 01687 $fileIcon = '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/fileicons/'.$fileIcon,'width="18" height="16"').' class="absmiddle" title="'.htmlspecialchars($fI['basename'].($absFilePath && @is_file($absFilePath) ? ' ('.t3lib_div::formatSize(filesize($absFilePath)).'bytes)' : ' - FILE NOT FOUND!')).'" alt="" />'; 01688 01689 $imgs[] = '<span class="nobr">'.t3lib_BEfunc::thumbCode($rowCopy,$table,$field,$this->backPath,'thumbs.php',$config['uploadfolder'],0,' align="middle"'). 01690 ($absFilePath ? $this->getClickMenu($fileIcon, $absFilePath) : $fileIcon). 01691 $imgP[0]. 01692 '</span>'; 01693 } 01694 $thumbsnail = implode('<br />',$imgs); 01695 } 01696 01697 // Creating the element: 01698 $params = array( 01699 'size' => $size, 01700 'dontShowMoveIcons' => ($maxitems<=1), 01701 'autoSizeMax' => t3lib_div::intInRange($config['autoSizeMax'],0), 01702 'maxitems' => $maxitems, 01703 'style' => isset($config['selectedListStyle']) ? ' style="'.htmlspecialchars($config['selectedListStyle']).'"' : ' style="'.$this->defaultMultipleSelectorStyle.'"', 01704 'info' => $info, 01705 'thumbnails' => $thumbsnail 01706 ); 01707 $item.= $this->dbFileIcons($PA['itemFormElName'],'file',implode(',',$tempFT),$itemArray,'',$params,$PA['onFocus']); 01708 01709 // Adding the upload field: 01710 if ($this->edit_docModuleUpload) $item.='<input type="file" name="'.$PA['itemFormElName_file'].'"'.$this->formWidth().' size="60" />'; 01711 break; 01712 case 'db': // If the element is of the internal type "db": 01713 01714 // Creating string showing allowed types: 01715 $tempFT = t3lib_div::trimExplode(',',$allowed,1); 01716 if (!strcmp(trim($tempFT[0]),'*')) { 01717 $info.='<span class="nobr"> '. 01718 htmlspecialchars($this->getLL('l_allTables')). 01719 '</span><br />'; 01720 } else { 01721 while(list(,$theT)=each($tempFT)) { 01722 if ($theT) { 01723 $info.='<span class="nobr"> '. 01724 t3lib_iconWorks::getIconImage($theT,array(),$this->backPath,'align="top"'). 01725 htmlspecialchars($this->sL($GLOBALS['TCA'][$theT]['ctrl']['title'])). 01726 '</span><br />'; 01727 } 01728 } 01729 } 01730 01731 $perms_clause = $GLOBALS['BE_USER']->getPagePermsClause(1); 01732 $itemArray = array(); 01733 $imgs = array(); 01734 01735 // Thumbnails: 01736 $temp_itemArray = t3lib_div::trimExplode(',',$PA['itemFormElValue'],1); 01737 foreach($temp_itemArray as $dbRead) { 01738 $recordParts = explode('|',$dbRead); 01739 list($this_table,$this_uid) = t3lib_BEfunc::splitTable_Uid($recordParts[0]); 01740 $itemArray[] = array('table'=>$this_table, 'id'=>$this_uid); 01741 if ($show_thumbs) { 01742 $rr = t3lib_BEfunc::getRecord($this_table,$this_uid); 01743 $imgs[] = '<span class="nobr">'. 01744 $this->getClickMenu(t3lib_iconWorks::getIconImage($this_table,$rr,$this->backPath,'align="top" title="'.htmlspecialchars(t3lib_BEfunc::getRecordPath($rr['pid'],$perms_clause,15)).' [UID: '.$rr['uid'].']"'),$this_table, $this_uid). 01745 ' '. 01746 $this->noTitle($rr[$GLOBALS['TCA'][$this_table]['ctrl']['label']],array('<em>','</em>')).' <span class="typo3-dimmed"><em>['.$rr['uid'].']</em></span>'. 01747 '</span>'; 01748 } 01749 } 01750 $thumbsnail=''; 01751 if ($show_thumbs) { 01752 $thumbsnail = implode('<br />',$imgs); 01753 } 01754 01755 // Creating the element: 01756 $params = array( 01757 'size' => $size, 01758 'dontShowMoveIcons' => ($maxitems<=1), 01759 'autoSizeMax' => t3lib_div::intInRange($config['autoSizeMax'],0), 01760 'maxitems' => $maxitems, 01761 'style' => isset($config['selectedListStyle']) ? ' style="'.htmlspecialchars($config['selectedListStyle']).'"' : ' style="'.$this->defaultMultipleSelectorStyle.'"', 01762 'info' => $info, 01763 'thumbnails' => $thumbsnail 01764 ); 01765 $item.= $this->dbFileIcons($PA['itemFormElName'],'db',implode(',',$tempFT),$itemArray,'',$params,$PA['onFocus']); 01766 break; 01767 } 01768 01769 // Wizards: 01770 $altItem = '<input type="hidden" name="'.$PA['itemFormElName'].'" value="'.htmlspecialchars($PA['itemFormElValue']).'" />'; 01771 $item = $this->renderWizards(array($item,$altItem),$config['wizards'],$table,$row,$field,$PA,$PA['itemFormElName'],$specConf); 01772 01773 return $item; 01774 } 01775 01786 function getSingleField_typeNone($table,$field,$row,&$PA) { 01787 // Init: 01788 $config = $PA['fieldConf']['config']; 01789 $itemValue = $PA['itemFormElValue']; 01790 01791 return $this->getSingleField_typeNone_render($config,$itemValue); 01792 } 01793 01802 function getSingleField_typeNone_render($config,$itemValue) { 01803 01804 // is colorScheme[0] the right value? 01805 $divStyle = 'border:solid 1px '.t3lib_div::modifyHTMLColorAll($this->colorScheme[0],-30).';'.$this->defStyle.$this->formElStyle('none').' background-color: '.$this->colorScheme[0].'; padding-left:1px;color:#555;'; 01806 01807 if ($config['rows']>1) { 01808 if(!$config['pass_content']) { 01809 $itemValue = nl2br(htmlspecialchars($itemValue)); 01810 } 01811 // like textarea 01812 $cols = t3lib_div::intInRange($config['cols'] ? $config['cols'] : 30, 5, $this->maxTextareaWidth); 01813 if (!$config['fixedRows']) { 01814 $origRows = $rows = t3lib_div::intInRange($config['rows'] ? $config['rows'] : 5, 1, 20); 01815 if (strlen($itemValue)>$this->charsPerRow*2) { 01816 $cols = $this->maxTextareaWidth; 01817 $rows = t3lib_div::intInRange(round(strlen($itemValue)/$this->charsPerRow),count(explode(chr(10),$itemValue)),20); 01818 if ($rows<$origRows) $rows=$origRows; 01819 } 01820 } else { 01821 $rows = intval($config['rows']); 01822 } 01823 01824 if ($this->docLarge) $cols = round($cols*$this->form_largeComp); 01825 $width = ceil($cols*$this->form_rowsToStylewidth); 01826 // hardcoded: 12 is the height of the font 01827 $height=$rows*12; 01828 01829 $item=' 01830 <div style="'.htmlspecialchars($divStyle.' overflow:auto; height:'.$height.'px; width:'.$width.'px;').'" class="'.htmlspecialchars($this->formElClass('none')).'">'. 01831 $itemValue. 01832 '</div>'; 01833 } else { 01834 if(!$config['pass_content']) { 01835 $itemValue = htmlspecialchars($itemValue); 01836 } 01837 01838 $cols = $config['cols']?$config['cols']:($config['size']?$config['size']:$this->maxInputWidth); 01839 if ($this->docLarge) $cols = round($cols*$this->form_largeComp); 01840 $width = ceil($cols*$this->form_rowsToStylewidth); 01841 01842 // overflow:auto crashes mozilla here. Title tag is usefull when text is longer than the div box (overflow:hidden). 01843 $item = ' 01844 <div style="'.htmlspecialchars($divStyle.' overflow:hidden; width:'.$width.'px;').'" class="'.htmlspecialchars($this->formElClass('none')).'" title="'.$itemValue.'">'. 01845 '<span class="nobr">'.(strcmp($itemValue,'')?$itemValue:' ').'</span>'. 01846 '</div>'; 01847 } 01848 01849 return $item; 01850 } 01851 01861 function getSingleField_typeFlex($table,$field,$row,&$PA) { 01862 01863 // Data Structure: 01864 $dataStructArray = t3lib_BEfunc::getFlexFormDS($PA['fieldConf']['config'],$row,$table); 01865 #debug($dataStructArray); 01866 01867 // Get data structure: 01868 if (is_array($dataStructArray)) { 01869 #debug(array(str_replace(' ',chr(160),$PA['itemFormElValue']))); 01870 01871 // Get data: 01872 $xmlData = $PA['itemFormElValue']; 01873 $xmlHeaderAttributes = t3lib_div::xmlGetHeaderAttribs($xmlData); 01874 $storeInCharset = strtolower($xmlHeaderAttributes['encoding']); 01875 if ($storeInCharset) { 01876 $currentCharset=$GLOBALS['LANG']->charSet; 01877 $xmlData = $GLOBALS['LANG']->csConvObj->conv($xmlData,$storeInCharset,$currentCharset,1); 01878 } 01879 $editData=t3lib_div::xml2array($xmlData); 01880 if (!is_array($editData)) { // Must be XML parsing error... 01881 #debug(array($editData,$xmlData)); 01882 $editData=array(); 01883 } 01884 01885 // Find the data structure if sheets are found: 01886 $sheet = $editData['meta']['currentSheetId'] ? $editData['meta']['currentSheetId'] : 'sDEF'; // Sheet to display 01887 # $item.= '<input type="hidden" name="'.$PA['itemFormElName'].'[meta][currentSheetId]" value="'.$sheet.'">'; 01888 01889 // Create sheet menu: 01890 if (is_array($dataStructArray['sheets'])) { 01891 #$item.=$this->getSingleField_typeFlex_sheetMenu($dataStructArray['sheets'], $PA['itemFormElName'].'[meta][currentSheetId]', $sheet).'<br />'; 01892 } 01893 #debug($editData); 01894 01895 // Create language menu: 01896 $langChildren = $dataStructArray['meta']['langChildren'] ? 1 : 0; 01897 $langDisabled = $dataStructArray['meta']['langDisable'] ? 1 : 0; 01898 01899 $languages = $this->getAvailableLanguages(); 01900 01901 if (!is_array($editData['meta']['currentLangId']) || !count($editData['meta']['currentLangId'])) { 01902 $editData['meta']['currentLangId']=array('DEF'); 01903 } 01904 $editData['meta']['currentLangId'] = array_unique($editData['meta']['currentLangId']); 01905 01906 if (!$langDisabled && count($languages) > 1) { 01907 $item.=$this->getSingleField_typeFlex_langMenu($languages, $PA['itemFormElName'].'[meta][currentLangId]', $editData['meta']['currentLangId']).'<br />'; 01908 } 01909 01910 if ($langChildren || $langDisabled) { 01911 $rotateLang = array('DEF'); 01912 } else { 01913 $rotateLang = $editData['meta']['currentLangId']; 01914 } 01915 01916 // Tabs sheets 01917 if (is_array($dataStructArray['sheets'])) { 01918 $tabsToTraverse = array_keys($dataStructArray['sheets']); 01919 } else { 01920 $tabsToTraverse = array($sheet); 01921 } 01922 01923 foreach($rotateLang as $lKey) { 01924 if (!$langChildren && !$langDisabled) { 01925 $item.= '<b>'.$lKey.':</b>'; 01926 } 01927 01928 $tabParts = array(); 01929 foreach($tabsToTraverse as $sheet) { 01930 $sheetCfg = $dataStructArray['sheets'][$sheet]; 01931 list ($dataStruct, $sheet) = t3lib_div::resolveSheetDefInDS($dataStructArray,$sheet); 01932 01933 // Render sheet: 01934 if (is_array($dataStruct['ROOT']) && is_array($dataStruct['ROOT']['el'])) { 01935 $cmdData = t3lib_div::_GP('flexFormsCmdData'); 01936 $lang = 'l'.$lKey; // Default language, other options are "lUK" or whatever country code (independant of system!!!) 01937 $PA['_valLang'] = $langChildren && !$langDisabled ? $editData['meta']['currentLangId'] : 'DEF'; // Default language, other options are "lUK" or whatever country code (independant of system!!!) 01938 01939 // Render flexform: 01940 $tRows = $this->getSingleField_typeFlex_draw( 01941 $dataStruct['ROOT']['el'], 01942 $editData['data'][$sheet][$lang], 01943 $cmdData['data'][$sheet][$lang], 01944 $table, 01945 $field, 01946 $row, 01947 $PA, 01948 '[data]['.$sheet.']['.$lang.']' 01949 ); 01950 $sheetContent= '<table border="0" cellpadding="1" cellspacing="1" class="typo3-TCEforms-flexForm">'.implode('',$tRows).'</table>'; 01951 01952 # $item = '<div style=" position:absolute;">'.$item.'</div>'; 01953 //visibility:hidden; 01954 } else $sheetContent='Data Structure ERROR: No ROOT element found for sheet "'.$sheet.'".'; 01955 01956 // Add to tab: 01957 $tabParts[] = array( 01958 'label' => ($sheetCfg['ROOT']['TCEforms']['sheetTitle'] ? $this->sL($sheetCfg['ROOT']['TCEforms']['sheetTitle']) : $sheet), 01959 'description' => ($sheetCfg['ROOT']['TCEforms']['sheetDescription'] ? $this->sL($sheetCfg['ROOT']['TCEforms']['sheetDescription']) : ''), 01960 'linkTitle' => ($sheetCfg['ROOT']['TCEforms']['sheetShortDescr'] ? $this->sL($sheetCfg['ROOT']['TCEforms']['sheetShortDescr']) : ''), 01961 'content' => $sheetContent 01962 ); 01963 } 01964 01965 if (is_array($dataStructArray['sheets'])) { 01966 $item.= $this->getDynTabMenu($tabParts,'TCEFORMS:flexform:'.$PA['itemFormElName']); 01967 } else { 01968 $item.= $sheetContent; 01969 } 01970 } 01971 } else $item='Data Structure ERROR: '.$dataStructArray; 01972 01973 return $item; 01974 } 01975 01985 function getSingleField_typeFlex_langMenu($languages,$elName,$selectedLanguage,$multi=1) { 01986 $opt=array(); 01987 foreach($languages as $lArr) { 01988 $opt[]='<option value="'.htmlspecialchars($lArr['ISOcode']).'"'.(in_array($lArr['ISOcode'],$selectedLanguage)?' selected="selected"':'').'>'.htmlspecialchars($lArr['title']).'</option>'; 01989 } 01990 01991 $output = '<select name="'.$elName.'[]"'.($multi ? ' multiple="multiple" size="'.count($languages).'"' : '').'>'.implode('',$opt).'</select>'; 01992 01993 return $output; 01994 } 01995 02004 function getSingleField_typeFlex_sheetMenu($sArr,$elName,$sheetKey) { 02005 02006 $tCells =array(); 02007 $pct = round(100/count($sArr)); 02008 foreach($sArr as $sKey => $sheetCfg) { 02009 $onClick = 'if (confirm('.$GLOBALS['LANG']->JScharCode($this->getLL('m_onChangeAlert')).') && TBE_EDITOR_checkSubmit(-1)){'.$this->elName($elName).".value='".$sKey."'; TBE_EDITOR_submitForm()};"; 02010 02011 $tCells[]='<td width="'.$pct.'%" style="'.($sKey==$sheetKey ? 'background-color: #9999cc; font-weight: bold;' : 'background-color: #aaaaaa;').' cursor: hand;" onclick="'.htmlspecialchars($onClick).'" align="center">'. 02012 ($sheetCfg['ROOT']['TCEforms']['sheetTitle'] ? $this->sL($sheetCfg['ROOT']['TCEforms']['sheetTitle']) : $sKey). 02013 '</td>'; 02014 } 02015 02016 return '<table border="0" cellpadding="0" cellspacing="2" class="typo3-TCEforms-flexForm-sheetMenu"><tr>'.implode('',$tCells).'</tr></table>'; 02017 } 02018 02034 function getSingleField_typeFlex_draw($dataStruct,$editData,$cmdData,$table,$field,$row,&$PA,$formPrefix='',$level=0,$tRows=array()) { 02035 02036 // Data Structure array must be ... and array of course... 02037 if (is_array($dataStruct)) { 02038 foreach($dataStruct as $key => $value) { 02039 if (is_array($value)) { // The value of each entry must be an array. 02040 02041 // ******************** 02042 // Making the row: 02043 // ******************** 02044 $rowCells=array(); 02045 02046 // Icon: 02047 $rowCells['title'] = '<img src="clear.gif" width="'.($level*16).'" height="1" alt="" /><strong>'.htmlspecialchars(t3lib_div::fixed_lgd_cs($this->sL($value['tx_templavoila']['title']),30)).'</strong>';; 02048 02049 $rowCells['formEl']=''; 02050 if ($value['type']=='array') { 02051 if ($value['section']) { 02052 // Render "NEW [container]" selectorbox: 02053 if (is_array($value['el'])) { 02054 $opt=array(); 02055 $opt[]='<option value=""></option>'; 02056 foreach($value['el'] as $kk => $vv) { 02057 $opt[]='<option value="'.$kk.'">'.htmlspecialchars('NEW "'.$value['el'][$kk]['tx_templavoila']['title'].'"').'</option>'; 02058 } 02059 $rowCells['formEl']='<select name="flexFormsCmdData'.$formPrefix.'['.$key.'][value]">'.implode('',$opt).'</select>'; 02060 } 02061 02062 // Put row together 02063 $tRows[]='<tr class="bgColor2"> 02064 <td nowrap="nowrap" valign="top">'.$rowCells['title'].'</td> 02065 <td>'.$rowCells['formEl'].'</td> 02066 </tr>'; 02067 02068 $cc=0; 02069 if (is_array($editData[$key]['el'])) { 02070 foreach($editData[$key]['el'] as $k3 => $v3) { 02071 $cc=$k3; 02072 $theType = key($v3); 02073 $theDat = $v3[$theType]; 02074 $newSectionEl = $value['el'][$theType]; 02075 if (is_array($newSectionEl)) { 02076 $tRows = $this->getSingleField_typeFlex_draw( 02077 array($theType => $newSectionEl), 02078 array($theType => $theDat), 02079 $cmdData[$key]['el'][$cc], 02080 $table, 02081 $field, 02082 $row, 02083 $PA, 02084 $formPrefix.'['.$key.'][el]['.$cc.']', 02085 $level+1, 02086 $tRows 02087 ); 02088 } 02089 } 02090 } 02091 02092 02093 02094 // New form? 02095 if ($cmdData[$key]['value']) { 02096 $newSectionEl = $value['el'][$cmdData[$key]['value']]; 02097 if (is_array($newSectionEl)) { 02098 $tRows = $this->getSingleField_typeFlex_draw( 02099 array($cmdData[$key]['value'] => $newSectionEl), 02100 array(), 02101 array(), 02102 $table, 02103 $field, 02104 $row, 02105 $PA, 02106 $formPrefix.'['.$key.'][el]['.($cc+1).']', 02107 $level+1, 02108 $tRows 02109 ); 02110 } 02111 } 02112 } else { 02113 // Put row together 02114 $tRows[]='<tr class="bgColor2"> 02115 <td nowrap="nowrap" valign="top">'. 02116 '<input name="_DELETE_FLEX_FORM'.$PA['itemFormElName'].$formPrefix.'" type="checkbox" value="1" /><img src="'.$this->backPath.'gfx/garbage.gif" border="0" alt="" />'. 02117 '<input name="_MOVEUP_FLEX_FORM'.$PA['itemFormElName'].$formPrefix.'" type="checkbox" value="1" /><img src="'.$this->backPath.'gfx/button_up.gif" border="0" alt="" />'. 02118 '<input name="_MOVEDOWN_FLEX_FORM'.$PA['itemFormElName'].$formPrefix.'" type="checkbox" value="1" /><img src="'.$this->backPath.'gfx/button_down.gif" border="0" alt="" />'. 02119 $rowCells['title'].'</td> 02120 <td>'.$rowCells['formEl'].'</td> 02121 </tr>'; 02122 02123 $tRows = $this->getSingleField_typeFlex_draw( 02124 $value['el'], 02125 $editData[$key]['el'], 02126 $cmdData[$key]['el'], 02127 $table, 02128 $field, 02129 $row, 02130 $PA, 02131 $formPrefix.'['.$key.'][el]', 02132 $level+1, 02133 $tRows 02134 ); 02135 } 02136 02137 } elseif (is_array($value['TCEforms']['config'])) { // Rendering a single form element: 02138 02139 if (is_array($PA['_valLang'])) { 02140 $rotateLang = $PA['_valLang']; 02141 } else { 02142 $rotateLang = array($PA['_valLang']); 02143 } 02144 02145 foreach($rotateLang as $vDEFkey) { 02146 $vDEFkey = 'v'.$vDEFkey; 02147 02148 $fakePA=array(); 02149 $fakePA['fieldConf']=array( 02150 'label' => $this->sL($value['TCEforms']['label']), 02151 'config' => $value['TCEforms']['config'], 02152 'defaultExtras' => $value['TCEforms']['defaultExtras'], 02153 'displayCond' => $value['TCEforms']['displayCond'], // Haven't tested this... 02154 ); 02155 $fakePA['fieldChangeFunc']=$PA['fieldChangeFunc']; 02156 $fakePA['onFocus']=$PA['onFocus']; 02157 $fakePA['label']==$PA['label']; 02158 02159 $fakePA['itemFormElName']=$PA['itemFormElName'].$formPrefix.'['.$key.']['.$vDEFkey.']'; 02160 $fakePA['itemFormElName_file']=$PA['itemFormElName_file'].$formPrefix.'['.$key.']['.$vDEFkey.']'; 02161 $fakePA['itemFormElValue']=$editData[$key][$vDEFkey]; 02162 02163 $rowCells['formEl']= $this->getSingleField_SW($table,$field,$row,$fakePA); 02164 $rowCells['title']= htmlspecialchars($fakePA['fieldConf']['label']); 02165 02166 // Put row together 02167 $tRows[]='<tr> 02168 <td nowrap="nowrap" valign="top" class="bgColor5">'.$rowCells['title'].($vDEFkey=='vDEF' ? '' : ' ('.$vDEFkey.')').'</td> 02169 <td class="bgColor4">'.$rowCells['formEl'].'</td> 02170 </tr>'; 02171 } 02172 } 02173 } 02174 } 02175 } 02176 02177 return $tRows; 02178 } 02179 02189 function getSingleField_typeUnknown($table,$field,$row,&$PA) { 02190 $item='Unknown type: '.$PA['fieldConf']['config']['form_type'].'<br />'; 02191 02192 return $item; 02193 } 02194 02204 function getSingleField_typeUser($table,$field,$row,&$PA) { 02205 $PA['table']=$table; 02206 $PA['field']=$field; 02207 $PA['row']=$row; 02208 02209 $PA['pObj']=&$this; 02210 02211 return t3lib_div::callUserFunction($PA['fieldConf']['config']['userFunc'],$PA,$this); 02212 } 02213 02214 02215 02216 02217 02218 02219 02220 02221 02222 02223 02224 02225 /************************************************************ 02226 * 02227 * "Configuration" fetching/processing functions 02228 * 02229 ************************************************************/ 02230 02238 function getRTypeNum($table,$row) { 02239 global $TCA; 02240 // If there is a "type" field configured... 02241 if ($TCA[$table]['ctrl']['type']) { 02242 $typeFieldName = $TCA[$table]['ctrl']['type']; 02243 $typeNum=$row[$typeFieldName]; // Get value of the row from the record which contains the type value. 02244 if (!strcmp($typeNum,'')) $typeNum=0; // If that value is an empty string, set it to "0" (zero) 02245 } else { 02246 $typeNum = 0; // If no "type" field, then set to "0" (zero) 02247 } 02248 02249 $typeNum = (string)$typeNum; // Force to string. Necessary for eg '-1' to be recognized as a type value. 02250 if (!$TCA[$table]['types'][$typeNum]) { // However, if the type "0" is not found in the "types" array, then default to "1" (for historical reasons) 02251 $typeNum = 1; 02252 } 02253 02254 return $typeNum; 02255 } 02256 02264 function rearrange($fields) { 02265 $fO = array_flip(t3lib_div::trimExplode(',',$this->fieldOrder,1)); 02266 reset($fields); 02267 $newFields=array(); 02268 while(list($cc,$content)=each($fields)) { 02269 $cP = t3lib_div::trimExplode(';',$content); 02270 if (isset($fO[$cP[0]])) { 02271 $newFields[$fO[$cP[0]]] = $content; 02272 unset($fields[$cc]); 02273 } 02274 } 02275 ksort($newFields); 02276 $fields=array_merge($newFields,$fields); // Candidate for t3lib_div::array_merge() if integer-keys will some day make trouble... 02277 return $fields; 02278 } 02279 02290 function getExcludeElements($table,$row,$typeNum) { 02291 global $TCA; 02292 02293 // Init: 02294 $excludeElements=array(); 02295 02296 // If a subtype field is defined for the type 02297 if ($TCA[$table]['types'][$typeNum]['subtype_value_field']) { 02298 $sTfield = $TCA[$table]['types'][$typeNum]['subtype_value_field']; 02299 if (trim($TCA[$table]['types'][$typeNum]['subtypes_excludelist'][$row[$sTfield]])) { 02300 $excludeElements=t3lib_div::trimExplode(',',$TCA[$table]['types'][$typeNum]['subtypes_excludelist'][$row[$sTfield]],1); 02301 } 02302 } 02303 02304 // If a bitmask-value field has been configured, then find possible fields to exclude based on that: 02305 if ($TCA[$table]['types'][$typeNum]['bitmask_value_field']) { 02306 $sTfield = $TCA[$table]['types'][$typeNum]['bitmask_value_field']; 02307 $sTValue = t3lib_div::intInRange($row[$sTfield],0); 02308 if (is_array($TCA[$table]['types'][$typeNum]['bitmask_excludelist_bits'])) { 02309 reset($TCA[$table]['types'][$typeNum]['bitmask_excludelist_bits']); 02310 while(list($bitKey,$eList)=each($TCA[$table]['types'][$typeNum]['bitmask_excludelist_bits'])) { 02311 $bit=substr($bitKey,1); 02312 if (t3lib_div::testInt($bit)) { 02313 $bit = t3lib_div::intInRange($bit,0,30); 02314 if ( 02315 (substr($bitKey,0,1)=='-' && !($sTValue&pow(2,$bit))) || 02316 (substr($bitKey,0,1)=='+' && ($sTValue&pow(2,$bit))) 02317 ) { 02318 $excludeElements = array_merge($excludeElements,t3lib_div::trimExplode(',',$eList,1)); 02319 } 02320 } 02321 } 02322 } 02323 } 02324 02325 // Return the array of elements: 02326 return $excludeElements; 02327 } 02328 02338 function getFieldsToAdd($table,$row,$typeNum) { 02339 global $TCA; 02340 02341 // Init: 02342 $addElements=array(); 02343 02344 // If a subtype field is defined for the type 02345 if ($TCA[$table]['types'][$typeNum]['subtype_value_field']) { 02346 $sTfield = $TCA[$table]['types'][$typeNum]['subtype_value_field']; 02347 if (trim($TCA[$table]['types'][$typeNum]['subtypes_addlist'][$row[$sTfield]])) { 02348 $addElements=t3lib_div::trimExplode(',',$TCA[$table]['types'][$typeNum]['subtypes_addlist'][$row[$sTfield]],1); 02349 } 02350 } 02351 // Return the return 02352 return array($addElements,$sTfield); 02353 } 02354 02363 function mergeFieldsWithAddedFields($fields,$fieldsToAdd) { 02364 if (count($fieldsToAdd[0])) { 02365 reset($fields); 02366 $c=0; 02367 while(list(,$fieldInfo)=each($fields)) { 02368 $parts = explode(';',$fieldInfo); 02369 if (!strcmp(trim($parts[0]),$fieldsToAdd[1])) { 02370 array_splice( 02371 $fields, 02372 $c+1, 02373 0, 02374 $fieldsToAdd[0] 02375 ); 02376 break; 02377 } 02378 $c++; 02379 } 02380 } 02381 return $fields; 02382 } 02383 02384 02395 function setTSconfig($table,$row,$field='') { 02396 $mainKey = $table.':'.$row['uid']; 02397 if (!isset($this->cachedTSconfig[$mainKey])) { 02398 $this->cachedTSconfig[$mainKey]=t3lib_BEfunc::getTCEFORM_TSconfig($table,$row); 02399 } 02400 if ($field) { 02401 return $this->cachedTSconfig[$mainKey][$field]; 02402 } else { 02403 return $this->cachedTSconfig[$mainKey]; 02404 } 02405 } 02406 02417 function getSpecConfForField($table,$row,$field) { 02418 // Finds the current "types" configuration for the table/row: 02419 $types_fieldConfig = t3lib_BEfunc::getTCAtypes($table,$row); 02420 02421 // If this is an array, then traverse it: 02422 if (is_array($types_fieldConfig)) { 02423 foreach($types_fieldConfig as $vconf) { 02424 // If the input field name matches one found in the 'types' list, then return the 'special' configuration. 02425 if ($vconf['field']==$field) return $vconf['spec']; 02426 } 02427 } 02428 } 02429 02438 function getSpecConfFromString($extraString, $defaultExtras) { 02439 return t3lib_BEfunc::getSpecConfParts($extraString, $defaultExtras); 02440 } 02441 02442 02443 02444 02445 02446 02447 02448 02449 02450 02451 /************************************************************ 02452 * 02453 * Display of localized content etc. 02454 * 02455 ************************************************************/ 02456 02466 function registerDefaultLanguageData($table,$rec) { 02467 global $TCA; 02468 02469 // Add default language: 02470 if ($TCA[$table]['ctrl']['languageField'] 02471 && $rec[$TCA[$table]['ctrl']['languageField']] > 0 02472 && $TCA[$table]['ctrl']['transOrigPointerField'] 02473 && intval($rec[$TCA[$table]['ctrl']['transOrigPointerField']]) > 0) { 02474 02475 $lookUpTable = $TCA[$table]['ctrl']['transOrigPointerTable'] ? $TCA[$table]['ctrl']['transOrigPointerTable'] : $table; 02476 02477 // Get data formatted: 02478 $this->defaultLanguageData[$table.':'.$rec['uid']] = t3lib_BEfunc::getRecord($lookUpTable, intval($rec[$TCA[$table]['ctrl']['transOrigPointerField']])); 02479 02480 // Get data for diff: 02481 if ($TCA[$table]['ctrl']['transOrigDiffSourceField']) { 02482 $this->defaultLanguageData_diff[$table.':'.$rec['uid']] = unserialize($rec[$TCA[$table]['ctrl']['transOrigDiffSourceField']]); 02483 } 02484 } 02485 } 02486 02498 function renderDefaultLanguageContent($table,$field,$row,$item) { 02499 if (is_array($this->defaultLanguageData[$table.':'.$row['uid']])) { 02500 $dLVal = t3lib_BEfunc::getProcessedValue($table,$field,$this->defaultLanguageData[$table.':'.$row['uid']][$field],0,1); 02501 02502 if (strcmp($dLVal,'')) { 02503 $item.='<div class="typo3-TCEforms-originalLanguageValue">'.nl2br(htmlspecialchars($dLVal)).' </div>'; 02504 } 02505 } 02506 02507 return $item; 02508 } 02509 02521 function renderDefaultLanguageDiff($table,$field,$row,$item) { 02522 if (is_array($this->defaultLanguageData_diff[$table.':'.$row['uid']])) { 02523 02524 // Initialize: 02525 $dLVal = array( 02526 'old' => $this->defaultLanguageData_diff[$table.':'.$row['uid']], 02527 'new' => $this->defaultLanguageData[$table.':'.$row['uid']], 02528 ); 02529 02530 if (isset($dLVal['old'][$field])) { // There must be diff-data: 02531 if (strcmp($dLVal['old'][$field],$dLVal['new'][$field])) { 02532 02533 // Create diff-result: 02534 $t3lib_diff_Obj = t3lib_div::makeInstance('t3lib_diff'); 02535 $diffres = $t3lib_diff_Obj->makeDiffDisplay( 02536 t3lib_BEfunc::getProcessedValue($table,$field,$dLVal['old'][$field],0,1), 02537 t3lib_BEfunc::getProcessedValue($table,$field,$dLVal['new'][$field],0,1) 02538 ); 02539 02540 $item.='<div class="typo3-TCEforms-diffBox">'. 02541 '<div class="typo3-TCEforms-diffBox-header">'.htmlspecialchars($this->getLL('l_changeInOrig')).':</div>'. 02542 $diffres. 02543 '</div>'; 02544 } 02545 } 02546 } 02547 02548 return $item; 02549 } 02550 02551 02552 02553 02554 02555 02556 02557 02558 02559 /************************************************************ 02560 * 02561 * Form element helper functions 02562 * 02563 ************************************************************/ 02564 02577 function dbFileIcons($fName,$mode,$allowed,$itemArray,$selector='',$params=array(),$onFocus='') { 02578 02579 // Sets a flag which means some JavaScript is included on the page to support this element. 02580 $this->printNeededJS['dbFileIcons']=1; 02581 02582 // INIT 02583 $uidList=array(); 02584 $opt=array(); 02585 $itemArrayC=0; 02586 02587 // Creating <option> elements: 02588 if (is_array($itemArray)) { 02589 $itemArrayC=count($itemArray); 02590 reset($itemArray); 02591 switch($mode) { 02592 case 'db': 02593 while(list(,$pp)=each($itemArray)) { 02594 $pRec = t3lib_BEfunc::getRecord($pp['table'],$pp['id']); 02595 if (is_array($pRec)) { 02596 $pTitle = t3lib_div::fixed_lgd_cs($this->noTitle($pRec[$GLOBALS['TCA'][$pp['table']]['ctrl']['label']]),$this->titleLen); 02597 $pUid = $pp['table'].'_'.$pp['id']; 02598 $uidList[]=$pUid; 02599 $opt[]='<option value="'.htmlspecialchars($pUid).'">'.htmlspecialchars($pTitle).'</option>'; 02600 } 02601 } 02602 break; 02603 case 'file': 02604 while(list(,$pp)=each($itemArray)) { 02605 $pParts = explode('|',$pp); 02606 $uidList[]=$pUid=$pTitle = $pParts[0]; 02607 $opt[]='<option value="'.htmlspecialchars(rawurldecode($pParts[0])).'">'.htmlspecialchars(rawurldecode($pParts[0])).'</option>'; 02608 } 02609 break; 02610 default: 02611 while(list(,$pp)=each($itemArray)) { 02612 $pParts = explode('|',$pp); 02613 $uidList[]=$pUid=$pParts[0]; 02614 $pTitle = $pParts[1]; 02615 $opt[]='<option value="'.htmlspecialchars(rawurldecode($pUid)).'">'.htmlspecialchars(rawurldecode($pTitle)).'</option>'; 02616 } 02617 break; 02618 } 02619 } 02620 02621 // Create selector box of the options 02622 $sSize = $params['autoSizeMax'] ? t3lib_div::intInRange($itemArrayC+1,t3lib_div::intInRange($params['size'],1),$params['autoSizeMax']) : $params['size']; 02623 if (!$selector) { 02624 $selector = '<select size="'.$sSize.'"'.$this->insertDefStyle('group').' multiple="multiple" name="'.$fName.'_list" '.$onFocus.$params['style'].'>'.implode('',$opt).'</select>'; 02625 } 02626 02627 02628 $icons = array( 02629 'L' => array(), 02630 'R' => array(), 02631 ); 02632 if (!$params['noBrowser']) { 02633 $aOnClick='setFormValueOpenBrowser(\''.$mode.'\',\''.($fName.'|||'.$allowed.'|').'\'); return false;'; 02634 $icons['R'][]='<a href="#" onclick="'.htmlspecialchars($aOnClick).'">'. 02635 '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/insert3.gif','width="14" height="14"').' border="0" '.t3lib_BEfunc::titleAltAttrib($this->getLL('l_browse_'.($mode=='file'?'file':'db'))).' />'. 02636 '</a>'; 02637 } 02638 if (!$params['dontShowMoveIcons']) { 02639 if ($sSize>=5) { 02640 $icons['L'][]='<a href="#" onclick="setFormValueManipulate(\''.$fName.'\',\'Top\'); return false;">'. 02641 '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/group_totop.gif','width="14" height="14"').' border="0" '.t3lib_BEfunc::titleAltAttrib($this->getLL('l_move_to_top')).' />'. 02642 '</a>'; 02643 } 02644 $icons['L'][]='<a href="#" onclick="setFormValueManipulate(\''.$fName.'\',\'Up\'); return false;">'. 02645 '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/up.gif','width="14" height="14"').' border="0" '.t3lib_BEfunc::titleAltAttrib($this->getLL('l_move_up')).' />'. 02646 '</a>'; 02647 $icons['L'][]='<a href="#" onclick="setFormValueManipulate(\''.$fName.'\',\'Down\'); return false;">'. 02648 '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/down.gif','width="14" height="14"').' border="0" '.t3lib_BEfunc::titleAltAttrib($this->getLL('l_move_down')).' />'. 02649 '</a>'; 02650 if ($sSize>=5) { 02651 $icons['L'][]='<a href="#" onclick="setFormValueManipulate(\''.$fName.'\',\'Bottom\'); return false;">'. 02652 '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/group_tobottom.gif','width="14" height="14"').' border="0" '.t3lib_BEfunc::titleAltAttrib($this->getLL('l_move_to_bottom')).' />'. 02653 '</a>'; 02654 } 02655 } 02656 02657 $clipElements = $this->getClipboardElements($allowed,$mode); 02658 if (count($clipElements)) { 02659 $aOnClick = ''; 02660 # $counter = 0; 02661 foreach($clipElements as $elValue) { 02662 if ($mode=='file') { 02663 $itemTitle = 'unescape(\''.rawurlencode(basename($elValue)).'\')'; 02664 } else { // 'db' mode assumed 02665 list($itemTable,$itemUid) = explode('|', $elValue); 02666 $itemTitle = $GLOBALS['LANG']->JScharCode(t3lib_BEfunc::getRecordTitle($itemTable, t3lib_BEfunc::getRecord($itemTable,$itemUid))); 02667 $elValue = $itemTable.'_'.$itemUid; 02668 } 02669 $aOnClick.= 'setFormValueFromBrowseWin(\''.$fName.'\',unescape(\''.rawurlencode(str_replace('%20',' ',$elValue)).'\'),'.$itemTitle.');'; 02670 02671 # $counter++; 02672 # if ($params['maxitems'] && $counter >= $params['maxitems']) { break; } // Makes sure that no more than the max items are inserted... for convenience. 02673 } 02674 $aOnClick.= 'return false;'; 02675 $icons['R'][]='<a href="#" onclick="'.htmlspecialchars($aOnClick).'">'. 02676 '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/insert5.png','width="14" height="14"').' border="0" '.t3lib_BEfunc::titleAltAttrib(sprintf($this->getLL('l_clipInsert_'.($mode=='file'?'file':'db')),count($clipElements))).' />'. 02677 '</a>'; 02678 } 02679 02680 $icons['L'][]='<a href="#" onclick="setFormValueManipulate(\''.$fName.'\',\'Remove\'); return false;">'. 02681 '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/group_clear.gif','width="14" height="14"').' border="0" '.t3lib_BEfunc::titleAltAttrib($this->getLL('l_remove_selected')).' />'. 02682 '</a>'; 02683 02684 $str='<table border="0" cellpadding="0" cellspacing="0" width="1"> 02685 '.($params['headers']?' 02686 <tr> 02687 <td>'.$this->wrapLabels($params['headers']['selector']).'</td> 02688 <td></td> 02689 <td></td> 02690 <td></td> 02691 <td>'.$this->wrapLabels($params['headers']['items']).'</td> 02692 </tr>':''). 02693 ' 02694 <tr> 02695 <td valign="top">'. 02696 $selector.'<br />'. 02697 $this->wrapLabels($params['info']). 02698 '</td> 02699 <td valign="top">'. 02700 implode('<br />',$icons['L']).'</td> 02701 <td valign="top">'. 02702 implode('<br />',$icons['R']).'</td> 02703 <td><img src="clear.gif" width="5" height="1" alt="" /></td> 02704 <td valign="top">'. 02705 $this->wrapLabels($params['thumbnails']). 02706 '</td> 02707 </tr> 02708 </table>'; 02709 02710 // Creating the hidden field which contains the actual value as a comma list. 02711 $str.='<input type="hidden" name="'.$fName.'" value="'.htmlspecialchars(implode(',',$uidList)).'" />'; 02712 02713 return $str; 02714 } 02715 02723 function getClipboardElements($allowed,$mode) { 02724 02725 $output = array(); 02726 02727 if (is_object($this->clipObj)) { 02728 switch($mode) { 02729 case 'file': 02730 $elFromTable = $this->clipObj->elFromTable('_FILE'); 02731 $allowedExts = t3lib_div::trimExplode(',', $allowed, 1); 02732 02733 if ($allowedExts) { // If there are a set of allowed extensions, filter the content: 02734 foreach($elFromTable as $elValue) { 02735 $pI = pathinfo($elValue); 02736 $ext = strtolower($pI['extension']); 02737 if (in_array($ext, $allowedExts)) { 02738 $output[] = $elValue; 02739 } 02740 } 02741 } else { // If all is allowed, insert all: (This does NOT respect any disallowed extensions, but those will be filtered away by the backend TCEmain) 02742 $output = $elFromTable; 02743 } 02744 break; 02745 case 'db': 02746 $allowedTables = t3lib_div::trimExplode(',', $allowed, 1); 02747 if (!strcmp(trim($allowedTables[0]),'*')) { // All tables allowed for relation: 02748 $output = $this->clipObj->elFromTable(''); 02749 } else { // Only some tables, filter them: 02750 foreach($allowedTables as $tablename) { 02751 $elFromTable = $this->clipObj->elFromTable($tablename); 02752 $output = array_merge($output,$elFromTable); 02753 } 02754 } 02755 $output = array_keys($output); 02756 break; 02757 } 02758 } 02759 02760 return $output; 02761 } 02762 02772 function getClickMenu($str,$table,$uid='') { 02773 if ($this->enableClickMenu) { 02774 $onClick = $GLOBALS['SOBE']->doc->wrapClickMenuOnIcon($str,$table,$uid,1,'','+copy,info,edit,view', TRUE); 02775 return '<a href="#" onclick="'.htmlspecialchars($onClick).'">'.$str.'</a>'; 02776 } 02777 } 02778 02793 function renderWizards($itemKinds,$wizConf,$table,$row,$field,&$PA,$itemName,$specConf,$RTE=0) { 02794 02795 // Init: 02796 $fieldChangeFunc = $PA['fieldChangeFunc']; 02797 $item = $itemKinds[0]; 02798 $outArr = array(); 02799 $colorBoxLinks = array(); 02800 $fName = '['.$table.']['.$row['uid'].']['.$field.']'; 02801 $md5ID = 'ID'.t3lib_div::shortmd5($itemName); 02802 $listFlag = '_list'; 02803 02804 // Manipulate the field name (to be the true form field name) and remove a suffix-value if the item is a selector box with renderMode "singlebox": 02805 if ($PA['fieldConf']['config']['form_type']=='select') { 02806 if ($PA['fieldConf']['config']['maxitems']<=1) { // Single select situation: 02807 $listFlag = ''; 02808 } elseif ($PA['fieldConf']['config']['renderMode']=='singlebox') { 02809 $itemName.='[]'; 02810 $listFlag = ''; 02811 } 02812 } 02813 02814 // traverse wizards: 02815 if (is_array($wizConf) && !$this->disableWizards) { 02816 foreach($wizConf as $wid => $wConf) { 02817 if (substr($wid,0,1)!='_' 02818 && (!$wConf['enableByTypeConfig'] || @in_array($wid,$specConf['wizards']['parameters'])) 02819 && ($RTE || !$wConf['RTEonly']) 02820 ) { 02821 02822 // Title / icon: 02823 $iTitle = htmlspecialchars($this->sL($wConf['title'])); 02824 if ($wConf['icon']) { 02825 $iDat = $this->getIcon($wConf['icon']); 02826 $icon = '<img src="'.$iDat[0].'" '.$iDat[1][3].' border="0"'.t3lib_BEfunc::titleAltAttrib($iTitle).' />'; 02827 } else { 02828 $icon = $iTitle; 02829 } 02830 02831 // 02832 switch((string)$wConf['type']) { 02833 case 'userFunc': 02834 case 'script': 02835 case 'popup': 02836 case 'colorbox': 02837 if (!$wConf['notNewRecords'] || t3lib_div::testInt($row['uid'])) { 02838 02839 // Setting &P array contents: 02840 $params = array(); 02841 $params['params'] = $wConf['params']; 02842 $params['exampleImg'] = $wConf['exampleImg']; 02843 $params['table'] = $table; 02844 $params['uid'] = $row['uid']; 02845 $params['pid'] = $row['pid']; 02846 $params['field'] = $field; 02847 $params['md5ID'] = $md5ID; 02848 $params['returnUrl'] = $this->thisReturnUrl(); 02849 02850 // Resolving script filename and setting URL. 02851 if (!strcmp(substr($wConf['script'],0,4), 'EXT:')) { 02852 $wScript = t3lib_div::getFileAbsFileName($wConf['script']); 02853 if ($wScript) { 02854 $wScript = '../'.substr($wScript,strlen(PATH_site)); 02855 } else break; 02856 } else { 02857 $wScript = $wConf['script']; 02858 } 02859 $url = $this->backPath.$wScript.(strstr($wScript,'?') ? '' : '?'); 02860 02861 // If there is no script and the type is "colorbox", break right away: 02862 if ((string)$wConf['type']=='colorbox' && !$wConf['script']) { break; } 02863 02864 // If "script" type, create the links around the icon: 02865 if ((string)$wConf['type']=='script') { 02866 $aUrl = $url.t3lib_div::implodeArrayForUrl('',array('P'=>$params)); 02867 $outArr[]='<a href="'.htmlspecialchars($aUrl).'" onclick="'.$this->blur().'return !TBE_EDITOR_isFormChanged();">'. 02868 $icon. 02869 '</a>'; 02870 } else { 02871 02872 // ... else types "popup", "colorbox" and "userFunc" will need additional parameters: 02873 $params['formName'] = $this->formName; 02874 $params['itemName'] = $itemName; 02875 $params['fieldChangeFunc'] = $fieldChangeFunc; 02876 02877 switch((string)$wConf['type']) { 02878 case 'popup': 02879 case 'colorbox': 02880 // Current form value is passed as P[currentValue]! 02881 $addJS = $wConf['popup_onlyOpenIfSelected']?'if (!TBE_EDITOR_curSelected(\''.$itemName.$listFlag.'\')){alert('.$GLOBALS['LANG']->JScharCode($this->getLL('m_noSelItemForEdit')).'); return false;}':''; 02882 $curSelectedValues='+\'&P[currentSelectedValues]=\'+TBE_EDITOR_curSelected(\''.$itemName.$listFlag.'\')'; 02883 $aOnClick= $this->blur(). 02884 $addJS. 02885 'vHWin=window.open(\''.$url.t3lib_div::implodeArrayForUrl('',array('P'=>$params)).'\'+\'&P[currentValue]=\'+TBE_EDITOR_rawurlencode('.$this->elName($itemName).'.value,200)'.$curSelectedValues.',\'popUp'.$md5ID.'\',\''.$wConf['JSopenParams'].'\');'. 02886 'vHWin.focus();return false;'; 02887 // Setting "colorBoxLinks" - user LATER to wrap around the color box as well: 02888 $colorBoxLinks = Array('<a href="#" onclick="'.htmlspecialchars($aOnClick).'">','</a>'); 02889 if ((string)$wConf['type']=='popup') { 02890 $outArr[] = $colorBoxLinks[0].$icon.$colorBoxLinks[1]; 02891 } 02892 break; 02893 case 'userFunc': 02894 $params['item'] = &$item; // Reference set! 02895 $params['icon'] = $icon; 02896 $params['iTitle'] = $iTitle; 02897 $params['wConf'] = $wConf; 02898 $params['row'] = $row; 02899 $outArr[] = t3lib_div::callUserFunction($wConf['userFunc'],$params,$this); 02900 break; 02901 } 02902 } 02903 02904 // Hide the real form element? 02905 if (is_array($wConf['hideParent']) || $wConf['hideParent']) { 02906 $item = $itemKinds[1]; // Setting the item to a hidden-field. 02907 if (is_array($wConf['hideParent'])) { 02908 $item.= $this->getSingleField_typeNone_render($wConf['hideParent'], $PA['itemFormElValue']); 02909 } 02910 } 02911 } 02912 break; 02913 case 'select': 02914 $fieldValue = array('config' => $wConf); 02915 $TSconfig = $this->setTSconfig($table, $row); 02916 $TSconfig[$field] = $TSconfig[$field]['wizards.'][$wid.'.']; 02917 $selItems = $this->addSelectOptionsToItemArray($this->initItemArray($fieldValue), $fieldValue, $TSconfig, $field); 02918 02919 $opt = array(); 02920 $opt[] = '<option>'.$iTitle.'</option>'; 02921 foreach($selItems as $p) { 02922 $opt[] = '<option value="'.htmlspecialchars($p[1]).'">'.htmlspecialchars($p[0]).'</option>'; 02923 } 02924 if ($wConf['mode']=='append') { 02925 $assignValue = $this->elName($itemName).'.value=\'\'+this.options[this.selectedIndex].value+'.$this->elName($itemName).'.value'; 02926 } elseif ($wConf['mode']=='prepend') { 02927 $assignValue = $this->elName($itemName).'.value+=\'\'+this.options[this.selectedIndex].value'; 02928 } else { 02929 $assignValue = $this->elName($itemName).'.value=this.options[this.selectedIndex].value'; 02930 } 02931 $sOnChange = $assignValue.';this.selectedIndex=0;'.implode('',$fieldChangeFunc); 02932 $outArr[] = '<select name="_WIZARD'.$fName.'" onchange="'.htmlspecialchars($sOnChange).'">'.implode('',$opt).'</select>'; 02933 break; 02934 } 02935 02936 // Color wizard colorbox: 02937 if ((string)$wConf['type']=='colorbox') { 02938 $dim = t3lib_div::intExplode('x',$wConf['dim']); 02939 $dX = t3lib_div::intInRange($dim[0],1,200,20); 02940 $dY = t3lib_div::intInRange($dim[1],1,200,20); 02941 $color = $row[$field] ? ' bgcolor="'.htmlspecialchars($row[$field]).'"' : ''; 02942 $outArr[] = '<table border="0" cellpadding="0" cellspacing="0" id="'.$md5ID.'"'.$color.' style="'.htmlspecialchars($wConf['tableStyle']).'"> 02943 <tr> 02944 <td>'. 02945 $colorBoxLinks[0]. 02946 '<img src="clear.gif" width="'.$dX.'" height="'.$dY.'"'.t3lib_BEfunc::titleAltAttrib(trim($iTitle.' '.$row[$field])).' border="0" />'. 02947 $colorBoxLinks[1]. 02948 '</td> 02949 </tr> 02950 </table>'; 02951 } 02952 } 02953 } 02954 02955 // For each rendered wizard, put them together around the item. 02956 if (count($outArr)) { 02957 if ($wizConf['_HIDDENFIELD']) $item = $itemKinds[1]; 02958 02959 $outStr = ''; 02960 $vAlign = $wizConf['_VALIGN'] ? ' valign="'.$wizConf['_VALIGN'].'"' : ''; 02961 if (count($outArr)>1 || $wizConf['_PADDING']) { 02962 $dist = intval($wizConf['_DISTANCE']); 02963 if ($wizConf['_VERTICAL']) { 02964 $dist = $dist ? '<tr><td><img src="clear.gif" width="1" height="'.$dist.'" alt="" /></td></tr>' : ''; 02965 $outStr = '<tr><td>'.implode('</td></tr>'.$dist.'<tr><td>',$outArr).'</td></tr>'; 02966 } else { 02967 $dist = $dist ? '<td><img src="clear.gif" height="1" width="'.$dist.'" alt="" /></td>' : ''; 02968 $outStr = '<tr><td'.$vAlign.'>'.implode('</td>'.$dist.'<td'.$vAlign.'>',$outArr).'</td></tr>'; 02969 } 02970 $outStr = '<table border="0" cellpadding="'.intval($wizConf['_PADDING']).'" cellspacing="0">'.$outStr.'</table>'; 02971 } else { 02972 $outStr = implode('',$outArr); 02973 } 02974 02975 if (!strcmp($wizConf['_POSITION'],'left')) { 02976 $outStr = '<tr><td'.$vAlign.'>'.$outStr.'</td><td'.$vAlign.'>'.$item.'</td></tr>'; 02977 } elseif (!strcmp($wizConf['_POSITION'],'top')) { 02978 $outStr = '<tr><td>'.$outStr.'</td></tr><tr><td>'.$item.'</td></tr>'; 02979 } elseif (!strcmp($wizConf['_POSITION'],'bottom')) { 02980 $outStr = '<tr><td>'.$item.'</td></tr><tr><td>'.$outStr.'</td></tr>'; 02981 } else { 02982 $outStr = '<tr><td'.$vAlign.'>'.$item.'</td><td'.$vAlign.'>'.$outStr.'</td></tr>'; 02983 } 02984 02985 $item = '<table border="0" cellpadding="0" cellspacing="0">'.$outStr.'</table>'; 02986 } 02987 } 02988 return $item; 02989 } 02990 02997 function getIcon($icon) { 02998 if (substr($icon,0,4)=='EXT:') { 02999 $file = t3lib_div::getFileAbsFileName($icon); 03000 if ($file) { 03001 $file = substr($file,strlen(PATH_site)); 03002 $selIconFile = $this->backPath.'../'.$file; 03003 $selIconInfo = @getimagesize(PATH_site.$file); 03004 } 03005 } elseif (substr($icon,0,3)=='../') { 03006 $selIconFile = $this->backPath.t3lib_div::resolveBackPath($icon); 03007 $selIconInfo = @getimagesize(PATH_site.t3lib_div::resolveBackPath(substr($icon,3))); 03008 } elseif (substr($icon,0,4)=='ext/' || substr($icon,0,7)=='sysext/') { 03009 $selIconFile = $this->backPath.$icon; 03010 $selIconInfo = @getimagesize(PATH_typo3.$icon); 03011 } else { 03012 $selIconFile = $this->backPath.'t3lib/gfx/'.$icon; 03013 $selIconInfo = @getimagesize(PATH_t3lib.'gfx/'.$icon); 03014 } 03015 return array($selIconFile,$selIconInfo); 03016 } 03017 03024 function optionTagStyle($iconString) { 03025 if ($iconString) { 03026 list($selIconFile,$selIconInfo) = $this->getIcon($iconString); 03027 $padTop = t3lib_div::intInRange(($selIconInfo[1]-12)/2,0); 03028 $styleAttr = 'background-image: url('.$selIconFile.'); background-repeat: no-repeat; height: '.t3lib_div::intInRange(($selIconInfo[1]+2)-$padTop,0).'px; padding-top: '.$padTop.'px; padding-left: '.($selIconInfo[0]+4).'px;'; 03029 return $styleAttr; 03030 } 03031 } 03032 03040 function extractValuesOnlyFromValueLabelList($itemFormElValue) { 03041 // Get values of selected items: 03042 $itemArray = t3lib_div::trimExplode(',',$itemFormElValue,1); 03043 foreach($itemArray as $tk => $tv) { 03044 $tvP = explode('|',$tv,2); 03045 $tvP[0] = rawurldecode($tvP[0]); 03046 03047 $itemArray[$tk] = $tvP[0]; 03048 } 03049 return $itemArray; 03050 } 03051 03062 function wrapOpenPalette($header,$table,$row,$palette,$retFunc=0) { 03063 $fieldL=array(); 03064 if (!is_array($this->palFieldArr[$palette])) {$this->palFieldArr[$palette]=array();} 03065 $palFieldN = is_array($this->palFieldArr[$palette]) ? count($this->palFieldArr[$palette]) : 0; 03066 $palJSFunc = 'TBE_EDITOR_palUrl(\''.($table.':'.$row['uid'].':'.$palette).'\',\''.implode(',',$this->palFieldArr[$palette]).'\','.$palFieldN.',\''.$table.'\',\''.$row['uid'].'\',1);'; 03067 03068 $aOnClick = $this->blur().substr($palJSFunc,0,-3).'0);return false;'; 03069 03070 $iconCode = '<a href="#" onclick="'.htmlspecialchars($aOnClick).'" title="'.htmlspecialchars($table).'">'. 03071 $header. 03072 '</a>'; 03073 return $retFunc ? array($iconCode,$palJSFunc) : $iconCode; 03074 } 03075 03086 function checkBoxParams($itemName,$thisValue,$c,$iCount,$addFunc='') { 03087 $onClick = $this->elName($itemName).'.value=this.checked?('.$this->elName($itemName).'.value|'.pow(2,$c).'):('.$this->elName($itemName).'.value&'.(pow(2,$iCount)-1-pow(2,$c)).');'. 03088 $addFunc; 03089 $str = ' onclick="'.htmlspecialchars($onClick).'"'. 03090 (($thisValue&pow(2,$c))?' checked="checked"':''); 03091 return $str; 03092 } 03093 03100 function elName($itemName) { 03101 return 'document.'.$this->formName."['".$itemName."']"; 03102 } 03103 03111 function noTitle($str,$wrapParts=array()) { 03112 return strcmp($str,'') ? $str : $wrapParts[0].'['.$GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:labels.no_title').']'.$wrapParts[1]; 03113 } 03114 03120 function blur() { 03121 return $GLOBALS['CLIENT']['FORMSTYLE'] ? 'this.blur();':''; 03122 } 03123 03129 function thisReturnUrl() { 03130 return $this->returnUrl ? $this->returnUrl : t3lib_div::linkThisScript(); 03131 } 03132 03142 function getSingleHiddenField($table,$field,$row) { 03143 global $TCA; 03144 $out=''; 03145 t3lib_div::loadTCA($table); 03146 if ($TCA[$table]['columns'][$field]) { 03147 03148 $uid=$row['uid']; 03149 $itemName=$this->prependFormFieldNames.'['.$table.']['.$uid.']['.$field.']'; 03150 $itemValue=$row[$field]; 03151 $item.='<input type="hidden" name="'.$itemName.'" value="'.htmlspecialchars($itemValue).'" />'; 03152 $out = $item; 03153 } 03154 return $out; 03155 } 03156 03164 function formWidth($size=48,$textarea=0) { 03165 // Input or text-field attribute (size or cols) 03166 if ($this->docLarge) $size = round($size*$this->form_largeComp); 03167 $wAttrib = $textarea?'cols':'size'; 03168 if (!$GLOBALS['CLIENT']['FORMSTYLE']) { // If not setting the width by style-attribute 03169 $retVal = ' '.$wAttrib.'="'.$size.'"'; 03170 } else { // Setting width by style-attribute. 'cols' MUST be avoided with NN6+ 03171 $pixels = ceil($size*$this->form_rowsToStylewidth); 03172 $theStyle = 'width:'.$pixels.'px;'.$this->defStyle.$this->formElStyle($textarea?'text':'input'); 03173 $retVal = ' style="'.htmlspecialchars($theStyle).'"'; 03174 03175 $class = $this->formElClass($textarea?'text':'input'); 03176 if ($class) { 03177 $retVal.= ' class="'.htmlspecialchars($class).'"'; 03178 } 03179 } 03180 return $retVal; 03181 } 03182 03191 function formWidthText($size=48,$wrap='') { 03192 $wTags = $this->formWidth($size,1); 03193 // Netscape 6+ seems to have this ODD problem where there WILL ALWAYS be wrapping with the cols-attribute set and NEVER without the col-attribute... 03194 if (strtolower(trim($wrap))!='off' && $GLOBALS['CLIENT']['BROWSER']=='net' && $GLOBALS['CLIENT']['VERSION']>=5) { 03195 $wTags.=' cols="'.$size.'"'; 03196 } 03197 return $wTags; 03198 } 03199 03207 function formElStyle($type) { 03208 return $this->formElStyleClassValue($type); 03209 } 03210 03218 function formElClass($type) { 03219 return $this->formElStyleClassValue($type, TRUE); 03220 } 03221 03229 function formElStyleClassValue($type, $class=FALSE) { 03230 // Get value according to field: 03231 if (isset($this->fieldStyle[$type])) { 03232 $style = trim($this->fieldStyle[$type]); 03233 } else { 03234 $style = trim($this->fieldStyle['all']); 03235 } 03236 03237 // Check class prefixed: 03238 if (substr($style,0,6)=='CLASS:') { 03239 return $class ? trim(substr($style,6)) : ''; 03240 } else { 03241 return !$class ? $style : ''; 03242 } 03243 } 03244 03251 function insertDefStyle($type) { 03252 $out = ''; 03253 03254 $style = trim($this->defStyle.$this->formElStyle($type)); 03255 $out.= $style?' style="'.htmlspecialchars($style).'"':''; 03256 03257 $class = $this->formElClass($type); 03258 $out.= $class?' class="'.htmlspecialchars($class).'"':''; 03259 03260 return $out; 03261 } 03262 03270 function getDynTabMenu($parts, $idString) { 03271 if (is_object($GLOBALS['TBE_TEMPLATE'])) { 03272 return $GLOBALS['TBE_TEMPLATE']->getDynTabMenu($parts, $idString); 03273 } else { 03274 $output = ''; 03275 foreach($parts as $singlePad) { 03276 $output.=' 03277 <h3>'.htmlspecialchars($singlePad['label']).'</h3> 03278 '.($singlePad['description'] ? '<p class="c-descr">'.nl2br(htmlspecialchars($singlePad['description'])).'</p>' : '').' 03279 '.$singlePad['content']; 03280 } 03281 03282 return '<div class="typo3-dyntabmenu-divs">'.$output.'</div>'; 03283 } 03284 } 03285 03286 03287 03288 03289 03290 03291 03292 03293 03294 03295 03296 /************************************************************ 03297 * 03298 * Item-array manipulation functions (check/select/radio) 03299 * 03300 ************************************************************/ 03301 03309 function initItemArray($fieldValue) { 03310 $items = array(); 03311 if (is_array($fieldValue['config']['items'])) { 03312 reset ($fieldValue['config']['items']); 03313 while (list($itemName,$itemValue) = each($fieldValue['config']['items'])) { 03314 $items[] = array($this->sL($itemValue[0]), $itemValue[1], $itemValue[2]); 03315 } 03316 } 03317 return $items; 03318 } 03319 03327 function addItems($items,$iArray) { 03328 global $TCA; 03329 if (is_array($iArray)) { 03330 reset($iArray); 03331 while(list($value,$label)=each($iArray)) { 03332 $items[]=array($this->sl($label),$value); 03333 } 03334 } 03335 return $items; 03336 } 03337 03349 function procItems($items,$iArray,$config,$table,$row,$field) { 03350 global $TCA; 03351 03352 $params=array(); 03353 $params['items'] = &$items; 03354 $params['config'] = $config; 03355 $params['TSconfig'] = $iArray; 03356 $params['table'] = $table; 03357 $params['row'] = $row; 03358 $params['field'] = $field; 03359 03360 t3lib_div::callUserFunction($config['itemsProcFunc'],$params,$this); 03361 return $items; 03362 } 03363 03373 function addSelectOptionsToItemArray($items,$fieldValue,$TSconfig,$field) { 03374 global $TCA; 03375 03376 // Values from foreign tables: 03377 if ($fieldValue['config']['foreign_table']) { 03378 $items = $this->foreignTable($items,$fieldValue,$TSconfig,$field); 03379 if ($fieldValue['config']['neg_foreign_table']) { 03380 $items = $this->foreignTable($items,$fieldValue,$TSconfig,$field,1); 03381 } 03382 } 03383 03384 // Values from a file folder: 03385 if ($fieldValue['config']['fileFolder']) { 03386 $fileFolder = t3lib_div::getFileAbsFileName($fieldValue['config']['fileFolder']); 03387 if (@is_dir($fileFolder)) { 03388 03389 // Configurations: 03390 $extList = $fieldValue['config']['fileFolder_extList']; 03391 $recursivityLevels = isset($fieldValue['config']['fileFolder_recursions']) ? t3lib_div::intInRange($fieldValue['config']['fileFolder_recursions'],0,99) : 99; 03392 03393 // Get files: 03394 $fileFolder = ereg_replace('\/$','',$fileFolder).'/'; 03395 $fileArr = t3lib_div::getAllFilesAndFoldersInPath(array(),$fileFolder,$extList,0,$recursivityLevels); 03396 $fileArr = t3lib_div::removePrefixPathFromList($fileArr, $fileFolder); 03397 03398 foreach($fileArr as $fileRef) { 03399 $fI = pathinfo($fileRef); 03400 $icon = t3lib_div::inList('gif,png,jpeg,jpg', strtolower($fI['extension'])) ? '../'.substr($fileFolder,strlen(PATH_site)).$fileRef : ''; 03401 $items[] = array( 03402 $fileRef, 03403 $fileRef, 03404 $icon 03405 ); 03406 } 03407 } 03408 } 03409 03410 // If 'special' is configured: 03411 if ($fieldValue['config']['special']) { 03412 switch ($fieldValue['config']['special']) { 03413 case 'tables': 03414 $temp_tc = array_keys($TCA); 03415 $descr = ''; 03416 03417 foreach($temp_tc as $theTableNames) { 03418 if (!$TCA[$theTableNames]['ctrl']['adminOnly']) { 03419 03420 // Icon: 03421 $icon = '../typo3/'.t3lib_iconWorks::skinImg($this->backPath,t3lib_iconWorks::getIcon($theTableNames, array()),'',1); 03422 03423 // Add description texts: 03424 if ($this->edit_showFieldHelp) { 03425 $GLOBALS['LANG']->loadSingleTableDescription($theTableNames); 03426 $fDat = $GLOBALS['TCA_DESCR'][$theTableNames]['columns']['']; 03427 $descr = $fDat['description']; 03428 } 03429 03430 // Item configuration: 03431 $items[] = array( 03432 $this->sL($TCA[$theTableNames]['ctrl']['title']), 03433 $theTableNames, 03434 $icon, 03435 $descr 03436 ); 03437 } 03438 } 03439 break; 03440 case 'pagetypes': 03441 $theTypes = $TCA['pages']['columns']['doktype']['config']['items']; 03442 03443 foreach($theTypes as $theTypeArrays) { 03444 // Icon: 03445 $icon = $theTypeArrays[1]!='--div--' ? '../typo3/'.t3lib_iconWorks::skinImg($this->backPath,t3lib_iconWorks::getIcon('pages', array('doktype' => $theTypeArrays[1])),'',1) : ''; 03446 03447 // Item configuration: 03448 $items[] = array( 03449 $this->sL($theTypeArrays[0]), 03450 $theTypeArrays[1], 03451 $icon 03452 ); 03453 } 03454 break; 03455 case 'exclude': 03456 $theTypes = t3lib_BEfunc::getExcludeFields(); 03457 $descr = ''; 03458 03459 foreach($theTypes as $theTypeArrays) { 03460 list($theTable, $theField) = explode(':', $theTypeArrays[1]); 03461 03462 // Add description texts: 03463 if ($this->edit_showFieldHelp) { 03464 $GLOBALS['LANG']->loadSingleTableDescription($theTable); 03465 $fDat = $GLOBALS['TCA_DESCR'][$theTable]['columns'][$theField]; 03466 $descr = $fDat['description']; 03467 } 03468 03469 // Item configuration: 03470 $items[] = array( 03471 ereg_replace(':$','',$theTypeArrays[0]), 03472 $theTypeArrays[1], 03473 '', 03474 $descr 03475 ); 03476 } 03477 break; 03478 case 'explicitValues': 03479 $theTypes = t3lib_BEfunc::getExplicitAuthFieldValues(); 03480 03481 // Icons: 03482 $icons = array( 03483 'ALLOW' => '../typo3/'.t3lib_iconWorks::skinImg($this->backPath,'gfx/icon_ok2.gif','',1), 03484 'DENY' => '../typo3/'.t3lib_iconWorks::skinImg($this->backPath,'gfx/icon_fatalerror.gif','',1), 03485 ); 03486 03487 // Traverse types: 03488 foreach($theTypes as $tableFieldKey => $theTypeArrays) { 03489 03490 if (is_array($theTypeArrays['items'])) { 03491 // Add header: 03492 $items[] = array( 03493 $theTypeArrays['tableFieldLabel'], 03494 '--div--', 03495 ); 03496 03497 // Traverse options for this field: 03498 foreach($theTypeArrays['items'] as $itemValue => $itemContent) { 03499 // Add item to be selected: 03500 $items[] = array( 03501 '['.$itemContent[2].'] '.$itemContent[1], 03502 $tableFieldKey.':'.ereg_replace('[:|,]','',$itemValue).':'.$itemContent[0], 03503 $icons[$itemContent[0]] 03504 ); 03505 } 03506 } 03507 } 03508 break; 03509 case 'languages': 03510 $items = array_merge($items,t3lib_BEfunc::getSystemLanguages()); 03511 break; 03512 case 'custom': 03513 // Initialize: 03514 $customOptions = $GLOBALS['TYPO3_CONF_VARS']['BE']['customPermOptions']; 03515 if (is_array($customOptions)) { 03516 foreach($customOptions as $coKey => $coValue) { 03517 if (is_array($coValue['items'])) { 03518 // Add header: 03519 $items[] = array( 03520 $GLOBALS['LANG']->sl($coValue['header']), 03521 '--div--', 03522 ); 03523 03524 // Traverse items: 03525 foreach($coValue['items'] as $itemKey => $itemCfg) { 03526 // Icon: 03527 if ($itemCfg[1]) { 03528 list($icon) = $this->getIcon($itemCfg[1]); 03529 if ($icon) $icon = '../typo3/'.$icon; 03530 } else $icon = ''; 03531 03532 // Add item to be selected: 03533 $items[] = array( 03534 $GLOBALS['LANG']->sl($itemCfg[0]), 03535 $coKey.':'.ereg_replace('[:|,]','',$itemKey), 03536 $icon, 03537 $GLOBALS['LANG']->sl($itemCfg[2]), 03538 ); 03539 } 03540 } 03541 } 03542 } 03543 break; 03544 case 'modListGroup': 03545 case 'modListUser': 03546 if (!is_object($loadModules)) { 03547 $loadModules = t3lib_div::makeInstance('t3lib_loadModules'); 03548 $loadModules->load($GLOBALS['TBE_MODULES']); 03549 } 03550 03551 $modList = $fieldValue['config']['special']=='modListUser' ? $loadModules->modListUser : $loadModules->modListGroup; 03552 if (is_array($modList)) { 03553 $descr = ''; 03554 03555 foreach($modList as $theMod) { 03556 03557 // Icon: 03558 $icon = $GLOBALS['LANG']->moduleLabels['tabs_images'][$theMod.'_tab']; 03559 if ($icon) { 03560 $icon = '../'.substr($icon,strlen(PATH_site)); 03561 } 03562 03563 // Description texts: 03564 if ($this->edit_showFieldHelp) { 03565 $descr = $GLOBALS['LANG']->moduleLabels['labels'][$theMod.'_tablabel']. 03566 chr(10). 03567 $GLOBALS['LANG']->moduleLabels['labels'][$theMod.'_tabdescr']; 03568 } 03569 03570 // Item configuration: 03571 $items[] = array( 03572 $this->addSelectOptionsToItemArray_makeModuleData($theMod), 03573 $theMod, 03574 $icon, 03575 $descr 03576 ); 03577 } 03578 } 03579 break; 03580 } 03581 } 03582 03583 // Return the items: 03584 return $items; 03585 } 03586 03595 function addSelectOptionsToItemArray_makeModuleData($value) { 03596 $label = ''; 03597 // Add label for main module: 03598 $pp = explode('_',$value); 03599 if (count($pp)>1) $label.=$GLOBALS['LANG']->moduleLabels['tabs'][$pp[0].'_tab'].'>'; 03600 // Add modules own label now: 03601 $label.= $GLOBALS['LANG']->moduleLabels['tabs'][$value.'_tab']; 03602 03603 return $label; 03604 } 03605 03617 function foreignTable($items,$fieldValue,$TSconfig,$field,$pFFlag=0) { 03618 global $TCA; 03619 03620 // Init: 03621 $pF=$pFFlag?'neg_':''; 03622 $f_table = $fieldValue['config'][$pF.'foreign_table']; 03623 $uidPre = $pFFlag?'-':''; 03624 03625 // Get query: 03626 $res = t3lib_BEfunc::exec_foreign_table_where_query($fieldValue,$field,$TSconfig,$pF); 03627 03628 // Perform lookup 03629 if ($GLOBALS['TYPO3_DB']->sql_error()) { 03630 echo($GLOBALS['TYPO3_DB']->sql_error()."\n\nThis may indicate a table defined in tables.php is not existing in the database!"); 03631 return array(); 03632 } 03633 03634 // Get label prefix. 03635 $lPrefix = $this->sL($fieldValue['config'][$pF.'foreign_table_prefix']); 03636 03637 // Get icon field + path if any: 03638 $iField = $TCA[$f_table]['ctrl']['selicon_field']; 03639 $iPath = trim($TCA[$f_table]['ctrl']['selicon_field_path']); 03640 03641 // Traverse the selected rows to add them: 03642 while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) { 03643 // Prepare the icon if available: 03644 if ($iField && $iPath && $row[$iField]) { 03645 $iParts = t3lib_div::trimExplode(',',$row[$iField],1); 03646 $icon = '../'.$iPath.'/'.trim($iParts[0]); 03647 } elseif (t3lib_div::inList('singlebox,checkbox',$fieldValue['config']['renderMode'])) { 03648 $icon = '../typo3/'.t3lib_iconWorks::skinImg($this->backPath,t3lib_iconWorks::getIcon($f_table, $row),'',1); 03649 } else $icon = ''; 03650 03651 // Add the item: 03652 $items[] = array( 03653 t3lib_div::fixed_lgd_cs($lPrefix.strip_tags(t3lib_BEfunc::getRecordTitle($f_table,$row)),$this->titleLen), 03654 $uidPre.$row['uid'], 03655 $icon 03656 ); 03657 } 03658 return $items; 03659 } 03660 03661 03662 03663 03664 03665 03666 03667 03668 03669 03670 03671 03672 03673 03674 03675 03676 03677 03678 03679 03680 03681 03682 03683 03684 03685 /******************************************** 03686 * 03687 * Template functions 03688 * 03689 ********************************************/ 03690 03697 function setNewBEDesign() { 03698 03699 // Wrapping all table rows for a particular record being edited: 03700 $this->totalWrap=' 03701 <table border="0" cellspacing="0" cellpadding="0" width="'.($this->docLarge ? 440+150 : 440).'" class="typo3-TCEforms">'. 03702 '<tr class="bgColor2"> 03703 <td> </td> 03704 <td>###RECORD_ICON### <span class="typo3-TCEforms-recHeader">###TABLE_TITLE###</span> ###ID_NEW_INDICATOR### - ###RECORD_LABEL###</td> 03705 </tr>'. 03706 '|'. 03707 '<tr> 03708 <td> </td> 03709 <td><img src="clear.gif" width="'.($this->docLarge ? 440+150 : 440).'" height="1" alt="" /></td> 03710 </tr> 03711 </table>'; 03712 03713 // Wrapping a single field: 03714 $this->fieldTemplate=' 03715 <tr ###BGCOLOR_HEAD######CLASSATTR_2###> 03716 <td>###FIELD_HELP_ICON###</td> 03717 <td width="99%"><span style="color:###FONTCOLOR_HEAD###;"###CLASSATTR_4###><b>###FIELD_NAME###</b></span>###FIELD_HELP_TEXT###</td> 03718 </tr> 03719 <tr ###BGCOLOR######CLASSATTR_1###> 03720 <td nowrap="nowrap"><img name="req_###FIELD_TABLE###_###FIELD_ID###_###FIELD_FIELD###" src="clear.gif" width="10" height="10" alt="" /><img name="cm_###FIELD_TABLE###_###FIELD_ID###_###FIELD_FIELD###" src="clear.gif" width="7" height="10" alt="" /></td> 03721 <td valign="top">###FIELD_ITEM######FIELD_PAL_LINK_ICON###</td> 03722 </tr>'; 03723 03724 $this->palFieldTemplate=' 03725 <tr ###BGCOLOR######CLASSATTR_1###> 03726 <td> </td> 03727 <td nowrap="nowrap" valign="top">###FIELD_PALETTE###</td> 03728 </tr>'; 03729 $this->palFieldTemplateHeader=' 03730 <tr ###BGCOLOR_HEAD######CLASSATTR_2###> 03731 <td> </td> 03732 <td nowrap="nowrap" valign="top"><strong>###FIELD_HEADER###</strong></td> 03733 </tr>'; 03734 03735 $this->sectionWrap=' 03736 <tr> 03737 <td colspan="2"><img src="clear.gif" width="1" height="###SPACE_BEFORE###" alt="" /></td> 03738 </tr> 03739 <tr> 03740 <td colspan="2"><table ###TABLE_ATTRIBS###>###CONTENT###</table></td> 03741 </tr> 03742 '; 03743 } 03744 03752 function intoTemplate($inArr,$altTemplate='') { 03753 // Put into template_ 03754 $fieldTemplateParts = explode('###FIELD_',$this->rplColorScheme($altTemplate?$altTemplate:$this->fieldTemplate)); 03755 reset($fieldTemplateParts); 03756 $out=current($fieldTemplateParts); 03757 while(list(,$part)=each($fieldTemplateParts)) { 03758 list($key,$val)=explode('###',$part,2); 03759 $out.=$inArr[$key]; 03760 $out.=$val; 03761 } 03762 return $out; 03763 } 03764 03776 function addUserTemplateMarkers($marker,$table,$field,$row,&$PA) { 03777 return $marker; 03778 } 03779 03787 function wrapLabels($str) { 03788 return $str; 03789 } 03790 03800 function wrapTotal($c,$rec,$table) { 03801 $parts = $this->replaceTableWrap(explode('|',$this->totalWrap,2),$rec,$table); 03802 return $parts[0].$c.$parts[1].implode('',$this->hiddenFieldAccum); 03803 } 03804 03813 function replaceTableWrap($arr,$rec,$table) { 03814 global $TCA; 03815 reset($arr); 03816 while(list($k,$v)=each($arr)) { 03817 03818 // Make "new"-label 03819 if (strstr($rec['uid'],'NEW')) { 03820 $newLabel = ' <span class="typo3-TCEforms-newToken">'. 03821 $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:labels.new',1). 03822 '</span>'; 03823 03824 $truePid = t3lib_BEfunc::getTSconfig_pidValue($table,$rec['uid'],$rec['pid']); 03825 $prec = t3lib_BEfunc::getRecord('pages',$truePid,'title'); 03826 $rLabel = '<em>[PID: '.$truePid.'] '.htmlspecialchars(trim(t3lib_div::fixed_lgd_cs(t3lib_BEfunc::getRecordTitle('pages',$prec),40))).'</em>'; 03827 } else { 03828 $newLabel = ' <span class="typo3-TCEforms-recUid">['.$rec['uid'].']</span>'; 03829 $rLabel = htmlspecialchars(trim(t3lib_div::fixed_lgd_cs(t3lib_BEfunc::getRecordTitle($table,$rec),40))); 03830 } 03831 03832 // Make substitutions: 03833 $arr[$k] = str_replace('###ID_NEW_INDICATOR###', $newLabel, $arr[$k]); 03834 $arr[$k] = str_replace('###RECORD_LABEL###',$rLabel,$arr[$k]); 03835 $arr[$k] = str_replace('###TABLE_TITLE###',htmlspecialchars($this->sL($TCA[$table]['ctrl']['title'])),$arr[$k]); 03836 03837 $titleA=t3lib_BEfunc::titleAltAttrib($this->getRecordPath($table,$rec)); 03838 $arr[$k]=str_replace('###RECORD_ICON###',t3lib_iconWorks::getIconImage($table,$rec,$this->backPath,'class="absmiddle"'.$titleA),$arr[$k]); 03839 } 03840 return $arr; 03841 } 03842 03850 function wrapBorder(&$out_array,&$out_pointer) { 03851 if ($this->sectionWrap && $out_array[$out_pointer]) { 03852 $tableAttribs=''; 03853 $tableAttribs.= $this->borderStyle[0] ? ' style="'.htmlspecialchars($this->borderStyle[0]).'"':''; 03854 $tableAttribs.= $this->borderStyle[2] ? ' background="'.htmlspecialchars($this->backPath.$this->borderStyle[2]).'"':''; 03855 $tableAttribs.= $this->borderStyle[3] ? ' class="'.htmlspecialchars($this->borderStyle[3]).'"':''; 03856 if ($tableAttribs) { 03857 $tableAttribs='border="0" cellspacing="0" cellpadding="0" width="100%"'.$tableAttribs; 03858 $out_array[$out_pointer] = str_replace('###CONTENT###',$out_array[$out_pointer], 03859 str_replace('###TABLE_ATTRIBS###',$tableAttribs, 03860 str_replace('###SPACE_BEFORE###',intval($this->borderStyle[1]),$this->sectionWrap))); 03861 } 03862 $out_pointer++; 03863 } 03864 } 03865 03872 function rplColorScheme($inTemplate) { 03873 // Colors: 03874 $inTemplate = str_replace('###BGCOLOR###',$this->colorScheme[0]?' bgcolor="'.$this->colorScheme[0].'"':'',$inTemplate); 03875 $inTemplate = str_replace('###BGCOLOR_HEAD###',$this->colorScheme[1]?' bgcolor="'.$this->colorScheme[1].'"':'',$inTemplate); 03876 $inTemplate = str_replace('###FONTCOLOR_HEAD###',$this->colorScheme[3],$inTemplate); 03877 03878 // Classes: 03879 $inTemplate = str_replace('###CLASSATTR_1###',$this->classScheme[0]?' class="'.$this->classScheme[0].'"':'',$inTemplate); 03880 $inTemplate = str_replace('###CLASSATTR_2###',$this->classScheme[1]?' class="'.$this->classScheme[1].'"':'',$inTemplate); 03881 $inTemplate = str_replace('###CLASSATTR_4###',$this->classScheme[3]?' class="'.$this->classScheme[3].'"':'',$inTemplate); 03882 03883 return $inTemplate; 03884 } 03885 03892 function getDivider() { 03893 //return "<hr />"; 03894 } 03895 03902 function printPalette($palArr) { 03903 03904 // Init color/class attributes: 03905 $ccAttr2 = $this->colorScheme[2] ? ' bgcolor="'.$this->colorScheme[2].'"' : ''; 03906 $ccAttr2.= $this->classScheme[2] ? ' class="'.$this->classScheme[2].'"' : ''; 03907 $ccAttr4 = $this->colorScheme[4] ? ' style="color:'.$this->colorScheme[4].'"' : ''; 03908 $ccAttr4.= $this->classScheme[4] ? ' class="'.$this->classScheme[4].'"' : ''; 03909 03910 // Traverse palette fields and render them into table rows: 03911 foreach($palArr as $content) { 03912 $hRow[]='<td'.$ccAttr2.'> </td> 03913 <td nowrap="nowrap"'.$ccAttr2.'>'. 03914 '<span'.$ccAttr4.'>'. 03915 $content['NAME']. 03916 '</span>'. 03917 '</td>'; 03918 $iRow[]='<td valign="top">'. 03919 '<img name="req_'.$content['TABLE'].'_'.$content['ID'].'_'.$content['FIELD'].'" src="clear.gif" width="10" height="10" vspace="4" alt="" />'. 03920 '<img name="cm_'.$content['TABLE'].'_'.$content['ID'].'_'.$content['FIELD'].'" src="clear.gif" width="7" height="10" vspace="4" alt="" />'. 03921 '</td> 03922 <td nowrap="nowrap" valign="top">'. 03923 $content['ITEM']. 03924 $content['HELP_ICON']. 03925 '</td>'; 03926 } 03927 03928 // Final wrapping into the table: 03929 $out='<table border="0" cellpadding="0" cellspacing="0" class="typo3-TCEforms-palette"> 03930 <tr> 03931 <td><img src="clear.gif" width="'.intval($this->paletteMargin).'" height="1" alt="" /></td>'. 03932 implode(' 03933 ',$hRow).' 03934 </tr> 03935 <tr> 03936 <td></td>'. 03937 implode(' 03938 ',$iRow).' 03939 </tr> 03940 </table>'; 03941 03942 return $out; 03943 } 03944 03953 function helpTextIcon($table,$field,$force=0) { 03954 if ($this->globalShowHelp && $GLOBALS['TCA_DESCR'][$table]['columns'][$field] && (($this->edit_showFieldHelp=='icon'&&!$this->doLoadTableDescr($table)) || $force)) { 03955 $aOnClick = 'vHWin=window.open(\''.$this->backPath.'view_help.php?tfID='.($table.'.'.$field).'\',\'viewFieldHelp\',\'height=400,width=600,status=0,menubar=0,scrollbars=1\');vHWin.focus();return false;'; 03956 return '<a href="#" onclick="'.htmlspecialchars($aOnClick).'">'. 03957 '<img'.t3lib_iconWorks::skinImg($this->backPath,'gfx/helpbubble.gif','width="14" height="14"').' hspace="2" border="0" class="absmiddle"'.($GLOBALS['CLIENT']['FORMSTYLE']?' style="cursor:help;"':'').' alt="" />'. 03958 '</a>'; 03959 } else { 03960 // Detects fields with no CSH and outputs dummy line to insert into CSH locallang file: 03961 #debug(array("'".$field.".description' => '[FILL IN] ".$table."->".$field."',"),$table); 03962 return ' '; 03963 } 03964 } 03965 03973 function helpText($table,$field) { 03974 if ($this->globalShowHelp && $GLOBALS['TCA_DESCR'][$table]['columns'][$field] && ($this->edit_showFieldHelp=='text' || $this->doLoadTableDescr($table))) { 03975 $fDat = $GLOBALS['TCA_DESCR'][$table]['columns'][$field]; 03976 return '<table border="0" cellpadding="2" cellspacing="0" width="90%"><tr><td valign="top" width="14">'. 03977 $this->helpTextIcon( 03978 $table, 03979 $field, 03980 $fDat['details']||$fDat['syntax']||$fDat['image_descr']||$fDat['image']||$fDat['seeAlso'] 03981 ). 03982 '</td><td valign="top"><span class="typo3-TCEforms-helpText">'. 03983 $GLOBALS['LANG']->hscAndCharConv(strip_tags($fDat['description']),1). 03984 '</span></td></tr></table>'; 03985 } 03986 } 03987 03994 function setColorScheme($scheme) { 03995 $this->colorScheme = $this->defColorScheme; 03996 $this->classScheme = $this->defClassScheme; 03997 03998 $parts = t3lib_div::trimExplode(',',$scheme); 03999 foreach($parts as $key => $col) { 04000 // Split for color|class: 04001 list($color,$class) = t3lib_div::trimExplode('|',$col); 04002 04003 // Handle color values: 04004 if ($color) $this->colorScheme[$key] = $color; 04005 if ($color=='-') $this->colorScheme[$key] = ''; 04006 04007 // Handle class values: 04008 if ($class) $this->classScheme[$key] = $class; 04009 if ($class=='-') $this->classScheme[$key] = ''; 04010 } 04011 } 04012 04018 function resetSchemes() { 04019 $this->setColorScheme($GLOBALS['TBE_STYLES']['colorschemes'][0]); 04020 $this->fieldStyle = $GLOBALS['TBE_STYLES']['styleschemes'][0]; 04021 $this->borderStyle = $GLOBALS['TBE_STYLES']['borderschemes'][0]; 04022 } 04023 04029 function storeSchemes() { 04030 $this->savedSchemes['classScheme'] = $this->classScheme; 04031 $this->savedSchemes['colorScheme'] = $this->colorScheme; 04032 $this->savedSchemes['fieldStyle'] = $this->fieldStyle; 04033 $this->savedSchemes['borderStyle'] = $this->borderStyle; 04034 } 04035 04041 function restoreSchemes() { 04042 $this->classScheme = $this->savedSchemes['classScheme']; 04043 $this->colorScheme = $this->savedSchemes['colorScheme']; 04044 $this->fieldStyle = $this->savedSchemes['fieldStyle']; 04045 $this->borderStyle = $this->savedSchemes['borderStyle']; 04046 } 04047 04048 04049 04050 04051 04052 04053 04054 04055 04056 04057 04058 04059 04060 /******************************************** 04061 * 04062 * JavaScript related functions 04063 * 04064 ********************************************/ 04065 04071 function JStop() { 04072 04073 $out = ''; 04074 04075 // Additional top HTML: 04076 if (count($this->additionalCode_pre)) { 04077 $out.= implode(' 04078 04079 <!-- NEXT: --> 04080 ',$this->additionalCode_pre); 04081 } 04082 04083 // Additional top JavaScript 04084 if (count($this->additionalJS_pre)) { 04085 $out.=' 04086 04087 04088 <!-- 04089 JavaScript in top of page (before form): 04090 --> 04091 04092 <script type="text/javascript"> 04093 /*<![CDATA[*/ 04094 04095 '.implode(' 04096 04097 // NEXT: 04098 ',$this->additionalJS_pre).' 04099 04100 /*]]>*/ 04101 </script> 04102 '; 04103 } 04104 04105 // Return result: 04106 return $out; 04107 } 04108 04122 function JSbottom($formname='forms[0]') { 04123 04124 // required 04125 $reqLines=array(); 04126 $reqLinesCheck=array(); 04127 $reqLinesSet=array(); 04128 reset($this->requiredFields); 04129 while(list($itemImgName,$itemName)=each($this->requiredFields)) { 04130 $reqLines[]=" TBE_REQUIRED['".$itemName."']=1;"; 04131 $reqLinesCheck[]=" if (!document.".$formname."['".$itemName."'].value) {OK=0;}"; 04132 $reqLinesSet[]=" if (!document.".$formname."['".$itemName."'].value) {TBE_EDITOR_setImage('req_".$itemImgName."','TBE_EDITOR_req');}"; 04133 } 04134 04135 $reqRange=array(); 04136 $reqRangeCheck=array(); 04137 $reqRangeSet=array(); 04138 reset($this->requiredElements); 04139 while(list($itemName,$range)=each($this->requiredElements)) { 04140 $reqRange[]=" TBE_RANGE['".$itemName."']=1;"; 04141 $reqRange[]=" TBE_RANGE_lower['".$itemName."']=".$range[0].";"; 04142 $reqRange[]=" TBE_RANGE_upper['".$itemName."']=".$range[1].";"; 04143 $reqRangeCheck[]=" if (!TBE_EDITOR_checkRange(document.".$formname."['".$itemName."_list'],".$range[0].",".$range[1].")) {OK=0;}"; 04144 $reqRangeSet[]=" if (!TBE_EDITOR_checkRange(document.".$formname."['".$itemName."_list'],".$range[0].",".$range[1].")) {TBE_EDITOR_setImage('req_".$range['imgName']."','TBE_EDITOR_req');}"; 04145 } 04146 04147 $this->TBE_EDITOR_fieldChanged_func='TBE_EDITOR_fieldChanged_fName(fName,formObj[fName+"_list"]);'; 04148 04149 if ($this->loadMD5_JS) { 04150 $out.=' 04151 <script type="text/javascript" src="'.$this->backPath.'md5.js"></script>'; 04152 } 04153 $out.=' 04154 <script type="text/javascript" src="'.$this->backPath.'t3lib/jsfunc.evalfield.js"></script> 04155 <script type="text/javascript"> 04156 /*<![CDATA[*/ 04157 04158 var TBE_EDITOR_req=new Image(); TBE_EDITOR_req.src = "'.t3lib_iconWorks::skinImg($this->backPath,'gfx/required_h.gif','',1).'"; 04159 var TBE_EDITOR_cm=new Image(); TBE_EDITOR_cm.src = "'.t3lib_iconWorks::skinImg($this->backPath,'gfx/content_client.gif','',1).'"; 04160 var TBE_EDITOR_sel=new Image(); TBE_EDITOR_sel.src = "'.t3lib_iconWorks::skinImg($this->backPath,'gfx/content_selected.gif','',1).'"; 04161 var TBE_EDITOR_clear=new Image(); TBE_EDITOR_clear.src = "'.$this->backPath.'clear.gif"; 04162 var TBE_REQUIRED=new Array(); 04163 '.implode(chr(10),$reqLines).' 04164 04165 var TBE_RANGE=new Array(); 04166 var TBE_RANGE_lower=new Array(); 04167 var TBE_RANGE_upper=new Array(); 04168 '.implode(chr(10),$reqRange).' 04169 04170 // $this->additionalJS_post: 04171 '.implode(chr(10),$this->additionalJS_post).' 04172 04173 var TBE_EDITOR_loadTime = 0; 04174 var TBE_EDITOR_isChanged = 0; 04175 04176 function TBE_EDITOR_loginRefreshed() { // 04177 var date = new Date(); 04178 TBE_EDITOR_loadTime = Math.floor(date.getTime()/1000); 04179 if (top.busy && top.busy.loginRefreshed) {top.busy.loginRefreshed();} 04180 } 04181 function TBE_EDITOR_checkLoginTimeout() { // 04182 var date = new Date(); 04183 var theTime = Math.floor(date.getTime()/1000); 04184 if (theTime > TBE_EDITOR_loadTime+'.intval($GLOBALS['BE_USER']->auth_timeout_field).'-10) { 04185 return true; 04186 } 04187 } 04188 function TBE_EDITOR_setHiddenContent(RTEcontent,theField) { // 04189 document.'.$formname.'[theField].value = RTEcontent; 04190 alert(document.'.$formname.'[theField].value); 04191 } 04192 function TBE_EDITOR_fieldChanged_fName(fName,el) { // 04193 var idx='.(2+substr_count($this->prependFormFieldNames,'[')).'; 04194 var table = TBE_EDITOR_split(fName, "[", idx); 04195 var uid = TBE_EDITOR_split(fName, "[", idx+1); 04196 var field = TBE_EDITOR_split(fName, "[", idx+2); 04197 04198 table = table.substr(0,table.length-1); 04199 uid = uid.substr(0,uid.length-1); 04200 field = field.substr(0,field.length-1); 04201 TBE_EDITOR_fieldChanged(table,uid,field,el); 04202 } 04203 function TBE_EDITOR_fieldChanged(table,uid,field,el) { // 04204 var theField = "'.$this->prependFormFieldNames.'["+table+"]["+uid+"]["+field+"]"; 04205 TBE_EDITOR_isChanged = 1; 04206 04207 // Set change image: 04208 var imgObjName = "cm_"+table+"_"+uid+"_"+field; 04209 TBE_EDITOR_setImage(imgObjName,"TBE_EDITOR_cm"); 04210 04211 // Set change image 04212 if (document.'.$formname.'[theField] && document.'.$formname.'[theField].type=="select-one" && document.'.$formname.'[theField+"_selIconVal"]) { 04213 var imgObjName = "selIcon_"+table+"_"+uid+"_"+field+"_"; 04214 TBE_EDITOR_setImage(imgObjName+document.'.$formname.'[theField+"_selIconVal"].value,"TBE_EDITOR_clear"); 04215 document.'.$formname.'[theField+"_selIconVal"].value = document.'.$formname.'[theField].selectedIndex; 04216 TBE_EDITOR_setImage(imgObjName+document.'.$formname.'[theField+"_selIconVal"].value,"TBE_EDITOR_sel"); 04217 } 04218 04219 // Set required flag: 04220 var imgReqObjName = "req_"+table+"_"+uid+"_"+field; 04221 if (TBE_REQUIRED[theField] && document.'.$formname.'[theField]) { 04222 if (document.'.$formname.'[theField].value) { 04223 TBE_EDITOR_setImage(imgReqObjName,"TBE_EDITOR_clear"); 04224 } else { 04225 TBE_EDITOR_setImage(imgReqObjName,"TBE_EDITOR_req"); 04226 } 04227 } 04228 if (TBE_RANGE[theField] && document.'.$formname.'[theField]) { 04229 if (TBE_EDITOR_checkRange(document.'.$formname.'[theField+"_list"],TBE_RANGE_lower[theField],TBE_RANGE_upper[theField])) { 04230 TBE_EDITOR_setImage(imgReqObjName,"TBE_EDITOR_clear"); 04231 } else { 04232 TBE_EDITOR_setImage(imgReqObjName,"TBE_EDITOR_req"); 04233 } 04234 } 04235 '.(!$this->isPalettedoc?'':' 04236 TBE_EDITOR_setOriginalFormFieldValue(theField); 04237 ').' 04238 } 04239 '.($this->isPalettedoc?' 04240 function TBE_EDITOR_setOriginalFormFieldValue(theField) { // 04241 if ('.$this->isPalettedoc.' && '.$this->isPalettedoc.'.document.'.$formname.' && '.$this->isPalettedoc.'.document.'.$formname.'[theField]) { 04242 '.$this->isPalettedoc.'.document.'.$formname.'[theField].value = document.'.$formname.'[theField].value; 04243 } 04244 } 04245 ':'').' 04246 function TBE_EDITOR_isFormChanged(noAlert) { // 04247 if (TBE_EDITOR_isChanged && !noAlert && confirm('.$GLOBALS['LANG']->JScharCode($GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:labels.fieldsChanged')).')) { 04248 return 0; 04249 } 04250 return TBE_EDITOR_isChanged; 04251 } 04252 function TBE_EDITOR_checkAndDoSubmit(sendAlert) { // 04253 if (TBE_EDITOR_checkSubmit(sendAlert)) { 04254 TBE_EDITOR_submitForm(); 04255 } 04256 } 04257 04264 function TBE_EDITOR_checkSubmit(sendAlert) { // 04265 if (TBE_EDITOR_checkLoginTimeout() && confirm('.$GLOBALS['LANG']->JScharCode($this->getLL('m_refresh_login')).')) { 04266 vHWin=window.open(\''.$this->backPath.'login_frameset.php?\',\'relogin\',\'height=300,width=400,status=0,menubar=0\'); 04267 vHWin.focus(); 04268 return false; 04269 } 04270 var OK=1; 04271 04272 // $this->additionalJS_post: 04273 '.implode(chr(10),$this->additionalJS_submit).' 04274 04275 if(!OK) { 04276 if (!confirm(unescape("SYSTEM ERROR: One or more Rich Text Editors on the page could not be contacted. This IS an error, although it should not be regular.\nYou can save the form now by pressing OK, but you will loose the Rich Text Editor content if you do.\n\nPlease report the error to your administrator if it persists."))) { 04277 return false; 04278 } else { 04279 OK = 1; 04280 } 04281 } 04282 04283 '.implode(chr(10),$reqLinesCheck).' 04284 '.implode(chr(10),$reqRangeCheck).' 04285 04286 if (OK || sendAlert==-1) { 04287 return true; 04288 } else { 04289 if(sendAlert) alert('.$GLOBALS['LANG']->JScharCode($GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:labels.fieldsMissing')).'); 04290 return false; 04291 } 04292 } 04293 function TBE_EDITOR_checkRange(el,lower,upper) { // 04294 if (el && el.length>=lower && el.length<=upper) { 04295 return true; 04296 } else { 04297 return false; 04298 } 04299 } 04300 function TBE_EDITOR_initRequired() { // 04301 '.implode(chr(10),$reqLinesSet).' 04302 '.implode(chr(10),$reqRangeSet).' 04303 } 04304 function TBE_EDITOR_setImage(name,imgName) { // 04305 if (document[name]) {document[name].src = eval(imgName+".src");} 04306 } 04307 function TBE_EDITOR_submitForm() { // 04308 '.($this->doSaveFieldName?'document.'.$this->formName."['".$this->doSaveFieldName."'].value=1;":'').' 04309 document.'.$this->formName.'.submit(); 04310 } 04311 function typoSetup () { // 04312 this.passwordDummy = "********"; 04313 this.decimalSign = "."; 04314 } 04315 var TS = new typoSetup(); 04316 var evalFunc = new evalFunc(); 04317 04318 function typo3FormFieldSet(theField, evallist, is_in, checkbox, checkboxValue) { // 04319 if (document.'.$formname.'[theField]) { 04320 var theFObj = new evalFunc_dummy (evallist,is_in, checkbox, checkboxValue); 04321 var theValue = document.'.$formname.'[theField].value; 04322 if (checkbox && theValue==checkboxValue) { 04323 document.'.$formname.'[theField+"_hr"].value=""; 04324 if (document.'.$formname.'[theField+"_cb"]) document.'.$formname.'[theField+"_cb"].checked = ""; 04325 } else { 04326 document.'.$formname.'[theField+"_hr"].value = evalFunc.outputObjValue(theFObj, theValue); 04327 if (document.'.$formname.'[theField+"_cb"]) document.'.$formname.'[theField+"_cb"].checked = "on"; 04328 } 04329 } 04330 } 04331 function typo3FormFieldGet(theField, evallist, is_in, checkbox, checkboxValue, checkbox_off, checkSetValue) { // 04332 if (document.'.$formname.'[theField]) { 04333 var theFObj = new evalFunc_dummy (evallist,is_in, checkbox, checkboxValue); 04334 if (checkbox_off) { 04335 if (document.'.$formname.'[theField+"_cb"].checked) { 04336 document.'.$formname.'[theField].value=checkSetValue; 04337 } else { 04338 document.'.$formname.'[theField].value=checkboxValue; 04339 } 04340 }else{ 04341 document.'.$formname.'[theField].value = evalFunc.evalObjValue(theFObj, document.'.$formname.'[theField+"_hr"].value); 04342 } 04343 typo3FormFieldSet(theField, evallist, is_in, checkbox, checkboxValue); 04344 } 04345 } 04346 function TBE_EDITOR_split(theStr1, delim, index) { // 04347 var theStr = ""+theStr1; 04348 var lengthOfDelim = delim.length; 04349 sPos = -lengthOfDelim; 04350 if (index<1) {index=1;} 04351 for (var a=1; a<index; a++) { 04352 sPos = theStr.indexOf(delim, sPos+lengthOfDelim); 04353 if (sPos==-1) {return null;} 04354 } 04355 ePos = theStr.indexOf(delim, sPos+lengthOfDelim); 04356 if(ePos == -1) {ePos = theStr.length;} 04357 return (theStr.substring(sPos+lengthOfDelim,ePos)); 04358 } 04359 function TBE_EDITOR_palUrl(inData,fieldList,fieldNum,table,uid,isOnFocus) { // 04360 var url = "'.$this->backPath.'alt_palette.php?inData="+inData+"&formName='.rawurlencode($this->formName).'"+"&prependFormFieldNames='.rawurlencode($this->prependFormFieldNames).'"; 04361 var field = ""; 04362 var theField=""; 04363 for (var a=0; a<fieldNum;a++) { 04364 field = TBE_EDITOR_split(fieldList, ",", a+1); 04365 theField = "'.$this->prependFormFieldNames.'["+table+"]["+uid+"]["+field+"]"; 04366 if (document.'.$formname.'[theField]) url+="&rec["+field+"]="+TBE_EDITOR_rawurlencode(document.'.$formname.'[theField].value); 04367 } 04368 if (top.topmenuFrame) { 04369 top.topmenuFrame.document.location = url+"&backRef="+(top.content.list_frame ? (top.content.list_frame.view_frame ? "top.content.list_frame.view_frame" : "top.content.list_frame") : "top.content"); 04370 } else if (!isOnFocus) { 04371 var vHWin=window.open(url,"palette","height=300,width=200,status=0,menubar=0,scrollbars=1"); 04372 vHWin.focus(); 04373 } 04374 } 04375 function TBE_EDITOR_curSelected(theField) { // 04376 var fObjSel = document.'.$formname.'[theField]; 04377 var retVal=""; 04378 if (fObjSel) { 04379 if (fObjSel.type=="select-multiple" || fObjSel.type=="select-one") { 04380 var l=fObjSel.length; 04381 for (a=0;a<l;a++) { 04382 if (fObjSel.options[a].selected==1) { 04383 retVal+=fObjSel.options[a].value+","; 04384 } 04385 } 04386 } 04387 } 04388 return retVal; 04389 } 04390 function TBE_EDITOR_rawurlencode(str,maxlen) { // 04391 var output = str; 04392 if (maxlen) output = output.substr(0,200); 04393 output = escape(output); 04394 output = TBE_EDITOR_str_replace("*","%2A", output); 04395 output = TBE_EDITOR_str_replace("+","%2B", output); 04396 output = TBE_EDITOR_str_replace("/","%2F", output); 04397 output = TBE_EDITOR_str_replace("@","%40", output); 04398 return output; 04399 } 04400 function TBE_EDITOR_str_replace(match,replace,string) { // 04401 var input = ""+string; 04402 var matchStr = ""+match; 04403 if (!matchStr) {return string;} 04404 var output = ""; 04405 var pointer=0; 04406 var pos = input.indexOf(matchStr); 04407 while (pos!=-1) { 04408 output+=""+input.substr(pointer, pos-pointer)+replace; 04409 pointer=pos+matchStr.length; 04410 pos = input.indexOf(match,pos+1); 04411 } 04412 output+=""+input.substr(pointer); 04413 return output; 04414 } 04415 /*]]>*/ 04416 </script> 04417 <script type="text/javascript"> 04418 /*<![CDATA[*/ 04419 04420 '.$this->extJSCODE.' 04421 04422 TBE_EDITOR_initRequired(); 04423 TBE_EDITOR_loginRefreshed(); 04424 /*]]>*/ 04425 </script>'; 04426 return $out; 04427 } 04428 04435 function dbFileCon($formObj='document.forms[0]') { 04436 $str=' 04437 04438 // *************** 04439 // Used to connect the db/file browser with this document and the formfields on it! 04440 // *************** 04441 04442 var browserWin=""; 04443 04444 function setFormValueOpenBrowser(mode,params) { // 04445 var url = "'.$this->backPath.'browser.php?mode="+mode+"&bparams="+params; 04446 04447 browserWin = window.open(url,"Typo3WinBrowser","height=350,width="+(mode=="db"?650:600)+",status=0,menubar=0,resizable=1,scrollbars=1"); 04448 browserWin.focus(); 04449 } 04450 function setFormValueFromBrowseWin(fName,value,label) { // 04451 var formObj = setFormValue_getFObj(fName) 04452 if (formObj && value!="--div--") { 04453 fObj = formObj[fName+"_list"]; 04454 // Inserting element 04455 var l=fObj.length; 04456 var setOK=1; 04457 if (!formObj[fName+"_mul"] || formObj[fName+"_mul"].value==0) { 04458 for (a=0;a<l;a++) { 04459 if (fObj.options[a].value==value) { 04460 setOK=0; 04461 } 04462 } 04463 } 04464 if (setOK) { 04465 fObj.length++; 04466 fObj.options[l].value=value; 04467 fObj.options[l].text=unescape(label); 04468 04469 // Traversing list and set the hidden-field 04470 setHiddenFromList(fObj,formObj[fName]); 04471 '.$this->TBE_EDITOR_fieldChanged_func.' 04472 } 04473 } 04474 } 04475 function setHiddenFromList(fObjSel,fObjHid) { // 04476 l=fObjSel.length; 04477 fObjHid.value=""; 04478 for (a=0;a<l;a++) { 04479 fObjHid.value+=fObjSel.options[a].value+","; 04480 } 04481 } 04482 function setFormValueManipulate(fName,type) { // 04483 var formObj = setFormValue_getFObj(fName) 04484 if (formObj) { 04485 var localArray_V = new Array(); 04486 var localArray_L = new Array(); 04487 var localArray_S = new Array(); 04488 var fObjSel = formObj[fName+"_list"]; 04489 var l=fObjSel.length; 04490 var c=0; 04491 if (type=="Remove" || type=="Top" || type=="Bottom") { 04492 if (type=="Top") { 04493 for (a=0;a<l;a++) { 04494 if (fObjSel.options[a].selected==1) { 04495 localArray_V[c]=fObjSel.options[a].value; 04496 localArray_L[c]=fObjSel.options[a].text; 04497 localArray_S[c]=1; 04498 c++; 04499 } 04500 } 04501 } 04502 for (a=0;a<l;a++) { 04503 if (fObjSel.options[a].selected!=1) { 04504 localArray_V[c]=fObjSel.options[a].value; 04505 localArray_L[c]=fObjSel.options[a].text; 04506 localArray_S[c]=0; 04507 c++; 04508 } 04509 } 04510 if (type=="Bottom") { 04511 for (a=0;a<l;a++) { 04512 if (fObjSel.options[a].selected==1) { 04513 localArray_V[c]=fObjSel.options[a].value; 04514 localArray_L[c]=fObjSel.options[a].text; 04515 localArray_S[c]=1; 04516 c++; 04517 } 04518 } 04519 } 04520 } 04521 if (type=="Down") { 04522 var tC = 0; 04523 var tA = new Array(); 04524 04525 for (a=0;a<l;a++) { 04526 if (fObjSel.options[a].selected!=1) { 04527 // Add non-selected element: 04528 localArray_V[c]=fObjSel.options[a].value; 04529 localArray_L[c]=fObjSel.options[a].text; 04530 localArray_S[c]=0; 04531 c++; 04532 04533 // Transfer any accumulated and reset: 04534 if (tA.length > 0) { 04535 for (aa=0;aa<tA.length;aa++) { 04536 localArray_V[c]=fObjSel.options[tA[aa]].value; 04537 localArray_L[c]=fObjSel.options[tA[aa]].text; 04538 localArray_S[c]=1; 04539 c++; 04540 } 04541 04542 var tC = 0; 04543 var tA = new Array(); 04544 } 04545 } else { 04546 tA[tC] = a; 04547 tC++; 04548 } 04549 } 04550 // Transfer any remaining: 04551 if (tA.length > 0) { 04552 for (aa=0;aa<tA.length;aa++) { 04553 localArray_V[c]=fObjSel.options[tA[aa]].value; 04554 localArray_L[c]=fObjSel.options[tA[aa]].text; 04555 localArray_S[c]=1; 04556 c++; 04557 } 04558 } 04559 } 04560 if (type=="Up") { 04561 var tC = 0; 04562 var tA = new Array(); 04563 var c = l-1; 04564 04565 for (a=l-1;a>=0;a--) { 04566 if (fObjSel.options[a].selected!=1) { 04567 04568 // Add non-selected element: 04569 localArray_V[c]=fObjSel.options[a].value; 04570 localArray_L[c]=fObjSel.options[a].text; 04571 localArray_S[c]=0; 04572 c--; 04573 04574 // Transfer any accumulated and reset: 04575 if (tA.length > 0) { 04576 for (aa=0;aa<tA.length;aa++) { 04577 localArray_V[c]=fObjSel.options[tA[aa]].value; 04578 localArray_L[c]=fObjSel.options[tA[aa]].text; 04579 localArray_S[c]=1; 04580 c--; 04581 } 04582 04583 var tC = 0; 04584 var tA = new Array(); 04585 } 04586 } else { 04587 tA[tC] = a; 04588 tC++; 04589 } 04590 } 04591 // Transfer any remaining: 04592 if (tA.length > 0) { 04593 for (aa=0;aa<tA.length;aa++) { 04594 localArray_V[c]=fObjSel.options[tA[aa]].value; 04595 localArray_L[c]=fObjSel.options[tA[aa]].text; 04596 localArray_S[c]=1; 04597 c--; 04598 } 04599 } 04600 c=l; // Restore length value in "c" 04601 } 04602 04603 // Transfer items in temporary storage to list object: 04604 fObjSel.length = c; 04605 for (a=0;a<c;a++) { 04606 fObjSel.options[a].value = localArray_V[a]; 04607 fObjSel.options[a].text = localArray_L[a]; 04608 fObjSel.options[a].selected = localArray_S[a]; 04609 } 04610 setHiddenFromList(fObjSel,formObj[fName]); 04611 04612 '.$this->TBE_EDITOR_fieldChanged_func.' 04613 } 04614 } 04615 function setFormValue_getFObj(fName) { // 04616 var formObj = '.$formObj.'; 04617 if (formObj) { 04618 if (formObj[fName] && formObj[fName+"_list"] && formObj[fName+"_list"].type=="select-multiple") { 04619 return formObj; 04620 } else { 04621 alert("Formfields missing:\n fName: "+formObj[fName]+"\n fName_list:"+formObj[fName+"_list"]+"\n type:"+formObj[fName+"_list"].type+"\n fName:"+fName); 04622 } 04623 } 04624 return ""; 04625 } 04626 04627 // END: dbFileCon parts. 04628 '; 04629 return $str; 04630 } 04631 04637 function printNeededJSFunctions() { 04638 // JS evaluation: 04639 $out = $this->JSbottom($this->formName); 04640 // 04641 if ($this->printNeededJS['dbFileIcons']) { 04642 $out.= ' 04643 04644 04645 04646 <!-- 04647 JavaScript after the form has been drawn: 04648 --> 04649 04650 <script type="text/javascript"> 04651 /*<![CDATA[*/ 04652 '.$this->dbFileCon('document.'.$this->formName).' 04653 /*]]>*/ 04654 </script>'; 04655 } 04656 return $out; 04657 } 04658 04664 function printNeededJSFunctions_top() { 04665 // JS evaluation: 04666 $out = $this->JStop($this->formName); 04667 return $out; 04668 } 04669 04670 04671 04672 04673 04674 04675 04676 04677 04678 04679 04680 04681 04682 04683 04684 04685 04686 04687 04688 04689 04690 04691 04692 04693 04694 04695 04696 04697 04698 /******************************************** 04699 * 04700 * Various helper functions 04701 * 04702 ********************************************/ 04703 04704 04712 function getDefaultRecord($table,$pid=0) { 04713 global $TCA; 04714 if ($TCA[$table]) { 04715 t3lib_div::loadTCA($table); 04716 $row = array(); 04717 04718 if ($pid<0 && $TCA[$table]['ctrl']['useColumnsForDefaultValues']) { 04719 // Fetches the previous record: 04720 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*', $table, 'uid='.abs($pid).t3lib_BEfunc::deleteClause($table)); 04721 if ($drow = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) { 04722 // Gets the list of fields to copy from the previous record. 04723 $fArr = explode(',',$TCA[$table]['ctrl']['useColumnsForDefaultValues']); 04724 foreach($fArr as $theF) { 04725 if ($TCA[$table]['columns'][$theF]) { 04726 $row[$theF] = $drow[$theF]; 04727 } 04728 } 04729 } 04730 $GLOBALS['TYPO3_DB']->sql_free_result($res); 04731 } 04732 04733 foreach($TCA[$table]['columns'] as $field => $info) { 04734 if (isset($info['config']['default'])) { 04735 $row[$field] = $info['config']['default']; 04736 } 04737 } 04738 04739 return $row; 04740 } 04741 } 04742 04751 function getRecordPath($table,$rec) { 04752 t3lib_BEfunc::fixVersioningPid($table,$rec); 04753 list($tscPID,$thePidValue)=$this->getTSCpid($table,$rec['uid'],$rec['pid']); 04754 if ($thePidValue>=0) { 04755 return t3lib_BEfunc::getRecordPath($tscPID,$this->readPerms(),15); 04756 } 04757 } 04758 04765 function readPerms() { 04766 if (!$this->perms_clause_set) { 04767 $this->perms_clause = $GLOBALS['BE_USER']->getPagePermsClause(1); 04768 $this->perms_clause_set=1; 04769 } 04770 return $this->perms_clause; 04771 } 04772 04779 function sL($str) { 04780 return $GLOBALS['LANG']->sL($str); 04781 } 04782 04792 function getLL($str) { 04793 switch(substr($str,0,2)) { 04794 case 'l_': 04795 return $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:labels.'.substr($str,2)); 04796 break; 04797 case 'm_': 04798 return $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.php:mess.'.substr($str,2)); 04799 break; 04800 } 04801 } 04802 04810 function isPalettesCollapsed($table,$palette) { 04811 global $TCA; 04812 04813 if ($TCA[$table]['ctrl']['canNotCollapse']) return 0; 04814 if (is_array($TCA[$table]['palettes'][$palette]) && $TCA[$table]['palettes'][$palette]['canNotCollapse']) return 0; 04815 return $this->palettesCollapsed; 04816 } 04817 04825 function isDisplayCondition($displayCond,$row) { 04826 $output = FALSE; 04827 04828 $parts = explode(':',$displayCond); 04829 switch((string)$parts[0]) { // Type of condition: 04830 case 'FIELD': 04831 switch((string)$parts[2]) { 04832 case 'REQ': 04833 if (strtolower($parts[3])=='true') { 04834 $output = $row[$parts[1]] ? TRUE : FALSE; 04835 } elseif (strtolower($parts[3])=='false') { 04836 $output = !$row[$parts[1]] ? TRUE : FALSE; 04837 } 04838 break; 04839 case '>': 04840 $output = $row[$parts[1]] > $parts[3]; 04841 break; 04842 case '<': 04843 $output = $row[$parts[1]] < $parts[3]; 04844 break; 04845 case '>=': 04846 $output = $row[$parts[1]] >= $parts[3]; 04847 break; 04848 case '<=': 04849 $output = $row[$parts[1]] <= $parts[3]; 04850 break; 04851 case '-': 04852 case '!-': 04853 $cmpParts = explode('-',$parts[3]); 04854 $output = $row[$parts[1]] >= $cmpParts[0] && $row[$parts[1]] <= $cmpParts[1]; 04855 if ($parts[2]{0}=='!') $output = !$output; 04856 break; 04857 case 'IN': 04858 case '!IN': 04859 $output = t3lib_div::inList($parts[3],$row[$parts[1]]); 04860 if ($parts[2]{0}=='!') $output = !$output; 04861 break; 04862 case '=': 04863 case '!=': 04864 $output = t3lib_div::inList($parts[3],$row[$parts[1]]); 04865 if ($parts[2]{0}=='!') $output = !$output; 04866 break; 04867 } 04868 break; 04869 case 'EXT': 04870 switch((string)$parts[2]) { 04871 case 'LOADED': 04872 if (strtolower($parts[3])=='true') { 04873 $output = t3lib_extMgm::isLoaded($parts[1]) ? TRUE : FALSE; 04874 } elseif (strtolower($parts[3])=='false') { 04875 $output = !t3lib_extMgm::isLoaded($parts[1]) ? TRUE : FALSE; 04876 } 04877 break; 04878 } 04879 break; 04880 case 'REC': 04881 switch((string)$parts[1]) { 04882 case 'NEW': 04883 if (strtolower($parts[2])=='true') { 04884 $output = !(intval($row['uid']) > 0) ? TRUE : FALSE; 04885 } elseif (strtolower($parts[2])=='false') { 04886 $output = (intval($row['uid']) > 0) ? TRUE : FALSE; 04887 } 04888 break; 04889 } 04890 break; 04891 } 04892 04893 return $output; 04894 } 04895 04906 function getTSCpid($table,$uid,$pid) { 04907 $key = $table.':'.$uid.':'.$pid; 04908 if (!isset($this->cache_getTSCpid[$key])) { 04909 $this->cache_getTSCpid[$key] = t3lib_BEfunc::getTSCpid($table,$uid,$pid); 04910 } 04911 return $this->cache_getTSCpid[$key]; 04912 } 04913 04920 function doLoadTableDescr($table) { 04921 global $TCA; 04922 return $TCA[$table]['interface']['always_description']; 04923 } 04924 04932 function getAvailableLanguages($onlyIsoCoded=1,$setDefault=1) { 04933 $isL = t3lib_extMgm::isLoaded('static_info_tables'); 04934 04935 // Find all language records in the system: 04936 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('static_lang_isocode,title,uid', 'sys_language', 'pid=0 AND hidden=0'.t3lib_BEfunc::deleteClause('sys_language'), '', 'title'); 04937 04938 // Traverse them: 04939 $output=array(); 04940 if ($setDefault) { 04941 $output[0]=array( 04942 'uid' => 0, 04943 'title' => 'Default language', 04944 'ISOcode' => 'DEF' 04945 ); 04946 } 04947 while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) { 04948 $output[$row['uid']]=$row; 04949 04950 if ($isL && $row['static_lang_isocode']) { 04951 $rr = t3lib_BEfunc::getRecord('static_languages',$row['static_lang_isocode'],'lg_iso_2'); 04952 if ($rr['lg_iso_2']) $output[$row['uid']]['ISOcode']=$rr['lg_iso_2']; 04953 } 04954 04955 if ($onlyIsoCoded && !$output[$row['uid']]['ISOcode']) unset($output[$row['uid']]); 04956 } 04957 return $output; 04958 } 04959 } 04960 04961 04962 04963 04964 04965 04966 04967 04968 04974 class t3lib_TCEforms_FE extends t3lib_TCEforms { 04975 04982 function wrapLabels($str) { 04983 return '<font face="verdana" size="1" color="black">'.$str.'</font>'; 04984 } 04985 04992 function printPalette($palArr) { 04993 $out=''; 04994 reset($palArr); 04995 $bgColor=' bgcolor="#D6DAD0"'; 04996 while(list(,$content)=each($palArr)) { 04997 $hRow[]='<td'.$bgColor.'><font face="verdana" size="1"> </font></td><td nowrap="nowrap"'.$bgColor.'><font color="#666666" face="verdana" size="1">'.$content['NAME'].'</font></td>'; 04998 $iRow[]='<td valign="top">'. 04999 '<img name="req_'.$content['TABLE'].'_'.$content['ID'].'_'.$content['FIELD'].'" src="clear.gif" width="10" height="10" alt="" />'. 05000 '<img name="cm_'.$content['TABLE'].'_'.$content['ID'].'_'.$content['FIELD'].'" src="clear.gif" width="7" height="10" alt="" />'. 05001 '</td><td nowrap="nowrap" valign="top">'.$content['ITEM'].$content['HELP_ICON'].'</td>'; 05002 } 05003 $out='<table border="0" cellpadding="0" cellspacing="0"> 05004 <tr><td><img src="clear.gif" width="'.intval($this->paletteMargin).'" height="1" alt="" /></td>'.implode('',$hRow).'</tr> 05005 <tr><td></td>'.implode('',$iRow).'</tr> 05006 </table>'; 05007 05008 return $out; 05009 } 05010 05017 function setFancyDesign() { 05018 $this->fieldTemplate=' 05019 <tr> 05020 <td nowrap="nowrap" bgcolor="#F6F2E6">###FIELD_HELP_ICON###<font face="verdana" size="1" color="black"><b>###FIELD_NAME###</b></font>###FIELD_HELP_TEXT###</td> 05021 </tr> 05022 <tr> 05023 <td nowrap="nowrap" bgcolor="#ABBBB4"><img name="req_###FIELD_TABLE###_###FIELD_ID###_###FIELD_FIELD###" src="clear.gif" width="10" height="10" alt="" /><img name="cm_###FIELD_TABLE###_###FIELD_ID###_###FIELD_FIELD###" src="clear.gif" width="7" height="10" alt="" /><font face="verdana" size="1" color="black">###FIELD_ITEM###</font>###FIELD_PAL_LINK_ICON###</td> 05024 </tr> '; 05025 05026 $this->totalWrap='<table border="0" cellpadding="1" cellspacing="0" bgcolor="black"><tr><td><table border="0" cellpadding="2" cellspacing="0">|</table></td></tr></table>'; 05027 05028 $this->palFieldTemplate=' 05029 <tr> 05030 <td nowrap="nowrap" bgcolor="#ABBBB4"><font face="verdana" size="1" color="black">###FIELD_PALETTE###</font></td> 05031 </tr> '; 05032 $this->palFieldTemplateHeader=' 05033 <tr> 05034 <td nowrap="nowrap" bgcolor="#F6F2E6"><font face="verdana" size="1" color="black"><b>###FIELD_HEADER###</b></font></td> 05035 </tr> '; 05036 } 05037 } 05038 05039 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_tceforms.php']) { 05040 include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_tceforms.php']); 05041 } 05042 ?>