PageRenderTime 288ms CodeModel.GetById 122ms app.highlight 79ms RepoModel.GetById 21ms app.codeStats 3ms

/t3lib/class.t3lib_tceforms.php

https://bitbucket.org/linxpinx/mercurial
PHP | 6382 lines | 4001 code | 798 blank | 1583 comment | 708 complexity | a04d5f4bb8b3f1feefb1b0ecf4a536a7 MD5 | raw file

Large files files are truncated, but you can click here to view the full file

   1<?php
   2/***************************************************************
   3*  Copyright notice
   4*
   5*  (c) 1999-2010 Kasper Skaarhoj (kasperYYYY@typo3.com)
   6*  All rights reserved
   7*
   8*  This script is part of the TYPO3 project. The TYPO3 project is
   9*  free software; you can redistribute it and/or modify
  10*  it under the terms of the GNU General Public License as published by
  11*  the Free Software Foundation; either version 2 of the License, or
  12*  (at your option) any later version.
  13*
  14*  The GNU General Public License can be found at
  15*  http://www.gnu.org/copyleft/gpl.html.
  16*  A copy is found in the textfile GPL.txt and important notices to the license
  17*  from the author is found in LICENSE.txt distributed with these scripts.
  18*
  19*
  20*  This script is distributed in the hope that it will be useful,
  21*  but WITHOUT ANY WARRANTY; without even the implied warranty of
  22*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  23*  GNU General Public License for more details.
  24*
  25*  This copyright notice MUST APPEAR in all copies of the script!
  26***************************************************************/
  27/**
  28 * Contains TYPO3 Core Form generator - AKA "TCEforms"
  29 *
  30 * $Id: class.t3lib_tceforms.php 8493 2010-08-05 18:45:15Z ohader $
  31 * Revised for TYPO3 3.6 August/2003 by Kasper Skaarhoj
  32 * XHTML compliant
  33 *
  34 * @author	Kasper Skaarhoj <kasperYYYY@typo3.com>
  35 */
  36/**
  37 * [CLASS/FUNCTION INDEX of SCRIPT]
  38 *
  39 *
  40 *
  41 *  196: class t3lib_TCEforms
  42 *  302:     function t3lib_TCEforms()
  43 *  338:     function initDefaultBEmode()
  44 *
  45 *              SECTION: Rendering the forms, fields etc
  46 *  385:     function getSoloField($table,$row,$theFieldToReturn)
  47 *  424:     function getMainFields($table,$row,$depth=0)
  48 *  618:     function getListedFields($table,$row,$list)
  49 *  660:     function getPaletteFields($table,$row,$palette,$header='',$itemList='',$collapsedHeader='')
  50 *  737:     function getSingleField($table,$field,$row,$altName='',$palette=0,$extra='',$pal=0)
  51 *  900:     function getSingleField_SW($table,$field,$row,&$PA)
  52 *
  53 *              SECTION: Rendering of each TCEform field type
  54 *  976:     function getSingleField_typeInput($table,$field,$row,&$PA)
  55 * 1057:     function getSingleField_typeText($table,$field,$row,&$PA)
  56 * 1178:     function getSingleField_typeCheck($table,$field,$row,&$PA)
  57 * 1244:     function getSingleField_typeRadio($table,$field,$row,&$PA)
  58 * 1279:     function getSingleField_typeSelect($table,$field,$row,&$PA)
  59 * 1359:     function getSingleField_typeSelect_single($table,$field,$row,&$PA,$config,$selItems,$nMV_label)
  60 * 1490:     function getSingleField_typeSelect_checkbox($table,$field,$row,&$PA,$config,$selItems,$nMV_label)
  61 * 1609:     function getSingleField_typeSelect_singlebox($table,$field,$row,&$PA,$config,$selItems,$nMV_label)
  62 * 1719:     function getSingleField_typeSelect_multiple($table,$field,$row,&$PA,$config,$selItems,$nMV_label)
  63 * 1823:     function getSingleField_typeGroup($table,$field,$row,&$PA)
  64 * 1992:     function getSingleField_typeNone($table,$field,$row,&$PA)
  65 * 2008:     function getSingleField_typeNone_render($config,$itemValue)
  66 * 2070:     function getSingleField_typeFlex($table,$field,$row,&$PA)
  67 * 2205:     function getSingleField_typeFlex_langMenu($languages,$elName,$selectedLanguage,$multi=1)
  68 * 2224:     function getSingleField_typeFlex_sheetMenu($sArr,$elName,$sheetKey)
  69 * 2259:     function getSingleField_typeFlex_draw($dataStruct,$editData,$cmdData,$table,$field,$row,&$PA,$formPrefix='',$level=0,$tRows=array())
  70 * 2452:     function getSingleField_typeUnknown($table,$field,$row,&$PA)
  71 * 2467:     function getSingleField_typeUser($table,$field,$row,&$PA)
  72 *
  73 *              SECTION: Field content processing
  74 * 2496:     function formatValue ($config, $itemValue)
  75 *
  76 *              SECTION: "Configuration" fetching/processing functions
  77 * 2588:     function getRTypeNum($table,$row)
  78 * 2614:     function rearrange($fields)
  79 * 2640:     function getExcludeElements($table,$row,$typeNum)
  80 * 2688:     function getFieldsToAdd($table,$row,$typeNum)
  81 * 2713:     function mergeFieldsWithAddedFields($fields,$fieldsToAdd)
  82 * 2745:     function setTSconfig($table,$row,$field='')
  83 * 2767:     function getSpecConfForField($table,$row,$field)
  84 * 2788:     function getSpecConfFromString($extraString, $defaultExtras)
  85 * 3007:     function loadPaletteElements($table, $row, $palette, $itemList='')
  86 *
  87 *              SECTION: Display of localized content etc.
  88 * 2816:     function registerDefaultLanguageData($table,$rec)
  89 * 2848:     function getLanguageOverlayRawValue($table, $row, $field, $fieldConf)
  90 * 2876:     function renderDefaultLanguageContent($table,$field,$row,$item)
  91 * 2899:     function renderDefaultLanguageDiff($table,$field,$row,$item)
  92 *
  93 *              SECTION: Form element helper functions
  94 * 2955:     function dbFileIcons($fName,$mode,$allowed,$itemArray,$selector='',$params=array(),$onFocus='')
  95 * 3108:     function getClipboardElements($allowed,$mode)
  96 * 3157:     function getClickMenu($str,$table,$uid='')
  97 * 3178:     function renderWizards($itemKinds,$wizConf,$table,$row,$field,&$PA,$itemName,$specConf,$RTE=0)
  98 * 3382:     function getIcon($icon)
  99 * 3409:     function optionTagStyle($iconString)
 100 * 3425:     function extractValuesOnlyFromValueLabelList($itemFormElValue)
 101 * 3447:     function wrapOpenPalette($header,$table,$row,$palette,$retFunc=0)
 102 * 3471:     function checkBoxParams($itemName,$thisValue,$c,$iCount,$addFunc='')
 103 * 3485:     function elName($itemName)
 104 * 3496:     function noTitle($str,$wrapParts=array())
 105 * 3505:     function blur()
 106 * 3514:     function thisReturnUrl()
 107 * 3527:     function getSingleHiddenField($table,$field,$row)
 108 * 3549:     function formWidth($size=48,$textarea=0)
 109 * 3576:     function formWidthText($size=48,$wrap='')
 110 * 3592:     function formElStyle($type)
 111 * 3603:     function formElClass($type)
 112 * 3614:     function formElStyleClassValue($type, $class=FALSE)
 113 * 3638:     function insertDefStyle($type)
 114 * 3657:     function getDynTabMenu($parts, $idString)
 115 *
 116 *              SECTION: Item-array manipulation functions (check/select/radio)
 117 * 3696:     function initItemArray($fieldValue)
 118 * 3714:     function addItems($items,$iArray)
 119 * 3736:     function procItems($items,$iArray,$config,$table,$row,$field)
 120 * 3760:     function addSelectOptionsToItemArray($items,$fieldValue,$TSconfig,$field)
 121 * 3980:     function addSelectOptionsToItemArray_makeModuleData($value)
 122 * 4002:     function foreignTable($items,$fieldValue,$TSconfig,$field,$pFFlag=0)
 123 *
 124 *              SECTION: Template functions
 125 * 4083:     function setNewBEDesign()
 126 * 4138:     function intoTemplate($inArr,$altTemplate='')
 127 * 4162:     function addUserTemplateMarkers($marker,$table,$field,$row,&$PA)
 128 * 4173:     function wrapLabels($str)
 129 * 4186:     function wrapTotal($c,$rec,$table)
 130 * 4199:     function replaceTableWrap($arr,$rec,$table)
 131 * 4236:     function wrapBorder(&$out_array,&$out_pointer)
 132 * 4258:     function rplColorScheme($inTemplate)
 133 * 4278:     function getDivider()
 134 * 4288:     function printPalette($palArr)
 135 * 4339:     function helpTextIcon($table,$field,$force=0)
 136 * 4359:     function helpText($table,$field)
 137 * 4380:     function setColorScheme($scheme)
 138 * 4404:     function resetSchemes()
 139 * 4415:     function storeSchemes()
 140 * 4427:     function restoreSchemes()
 141 *
 142 *              SECTION: JavaScript related functions
 143 * 4457:     function JStop()
 144 * 4508:     function JSbottom($formname='forms[0]')
 145 * 4835:     function dbFileCon($formObj='document.forms[0]')
 146 * 5053:     function printNeededJSFunctions()
 147 * 5080:     function printNeededJSFunctions_top()
 148 *
 149 *              SECTION: Various helper functions
 150 * 5128:     function getDefaultRecord($table,$pid=0)
 151 * 5167:     function getRecordPath($table,$rec)
 152 * 5181:     function readPerms()
 153 * 5195:     function sL($str)
 154 * 5208:     function getLL($str)
 155 * 5229:     function isPalettesCollapsed($table,$palette)
 156 * 5245:     function isDisplayCondition($displayCond,$row,$ffValueKey='')
 157 * 5349:     function getTSCpid($table,$uid,$pid)
 158 * 5363:     function doLoadTableDescr($table)
 159 * 5375:     function getAvailableLanguages($onlyIsoCoded=1,$setDefault=1)
 160 *
 161 *
 162 * 5417: class t3lib_TCEforms_FE extends t3lib_TCEforms
 163 * 5425:     function wrapLabels($str)
 164 * 5435:     function printPalette($palArr)
 165 * 5460:     function setFancyDesign()
 166 *
 167 * TOTAL FUNCTIONS: 100
 168 * (This index is automatically created/updated by the extension "extdeveval")
 169 *
 170 */
 171
 172
 173
 174
 175
 176
 177
 178
 179
 180
 181
 182
 183
 184
 185
 186/**
 187 * 'TCEforms' - Class for creating the backend editing forms.
 188 *
 189 * @author	Kasper Skaarhoj <kasperYYYY@typo3.com>
 190 * @coauthor	Rene Fritz <r.fritz@colorcube.de>
 191 * @package TYPO3
 192 * @subpackage t3lib
 193 */
 194class t3lib_TCEforms	{
 195
 196		// variables not commented yet.... (do so...)
 197	var $palFieldArr = array();
 198	var $disableWizards = 0;
 199	var $isPalettedoc = 0;
 200	var $paletteMargin = 1;
 201	var $defStyle = ''; // 'font-family:Verdana;font-size:10px;';
 202	var $cachedTSconfig = array();
 203	var $cachedTSconfig_fieldLevel = array();
 204	var $cachedLanguageFlag = array();
 205	var $cachedAdditionalPreviewLanguages = NULL;
 206	var $transformedRow = array();
 207	var $extJSCODE = '';
 208	var $printNeededJS = array();
 209	var $hiddenFieldAccum=array();
 210	var $TBE_EDITOR_fieldChanged_func='';
 211	var $loadMD5_JS=1;
 212	var $prevBorderStyle='[nothing here...]';	// Something unique...
 213	var $allowUpload=0; 				// If set direct upload fields will be shown
 214	var $titleLen=15; 					// @deprecated since TYPO3 4.1: $BE_USER->uc['titleLen'] but what is default??
 215	var $defaultLanguageData = array();	// Array where records in the default language is stored. (processed by transferdata)
 216	var $defaultLanguageData_diff = array();	// Array where records in the default language is stored (raw without any processing. used for making diff)
 217	var $additionalPreviewLanguageData = array();
 218
 219
 220		// EXTERNAL, static
 221	var $backPath='';					// Set this to the 'backPath' pointing back to the typo3 admin directory from the script where this form is displayed.
 222	var $returnUrl='';					// Alternative return URL path (default is t3lib_div::linkThisScript())
 223	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.
 224	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.
 225	var $disableRTE=0;					// If set, the RTE is disabled (from form display, eg. by checkbox in the bottom of the page!)
 226	var $globalShowHelp=1;				// If false, then all CSH will be disabled, regardless of settings in $this->edit_showFieldHelp
 227	var $localizationMode='';			// If true, the forms are rendering only localization relevant fields of the records.
 228	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.
 229	var $doPrintPalette=1;				// If set to false, palettes will NEVER be rendered.
 230
 231	/**
 232	 * Set to initialized clipboard object; Then the element browser will offer a link to paste in records from clipboard.
 233	 *
 234	 * @var t3lib_clipboard
 235	 */
 236	var $clipObj=FALSE;
 237	var $enableClickMenu=FALSE;			// Enable click menu on reference icons.
 238	var $enableTabMenu = FALSE;			// Enable Tab Menus. If set to true, the JavaScript content from template::getDynTabMenuJScode() must be included in the document.
 239	var $renderReadonly = FALSE; 		// When enabled all fields are rendered non-editable.
 240
 241	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)
 242	var $form_largeComp = 1.33;			// Form field width compensation: Compensation for large documents, doc-tab (editing)
 243	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.
 244	var $maxTextareaWidth=48;			// The maximum abstract value for textareas
 245	var $maxInputWidth=48;				// The maximum abstract value for input fields
 246	var $defaultMultipleSelectorStyle='width:250px;';	// Default style for the selector boxes used for multiple items in "select" and "group" types.
 247
 248
 249		// INTERNAL, static
 250	var $prependFormFieldNames = 'data';		// The string to prepend formfield names with.
 251	var $prependCmdFieldNames = 'cmd';			// The string to prepend commands for tcemain::process_cmdmap with.
 252	var $prependFormFieldNames_file = 'data_files';		// The string to prepend FILE form field names with.
 253	var $formName = 'editform';					// The name attribute of the form.
 254	var $allowOverrideMatrix = array();			// Whitelist that allows TCA field configuration to be overridden by TSconfig, @see overrideFieldConf()
 255
 256
 257
 258		// INTERNAL, dynamic
 259	var $perms_clause='';						// Set by readPerms()  (caching)
 260	var $perms_clause_set=0;					// Set by readPerms()  (caching-flag)
 261	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).
 262	var $docLarge=0;							// If set, the forms will be rendered a little wider, more precisely with a factor of $this->form_largeComp.
 263	var $clientInfo=array();					// Loaded with info about the browser when class is instantiated.
 264	var $RTEenabled=0;							// True, if RTE is possible for the current user (based on result from BE_USER->isRTE())
 265	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)
 266	var $RTEcounter = 0;						// Counter that is incremented before an RTE is created. Can be used for unique ids etc.
 267
 268	var $colorScheme;							// Contains current color scheme
 269	var $classScheme;							// Contains current class scheme
 270	var $defColorScheme;						// Contains the default color scheme
 271	var $defClassScheme;						// Contains the default class scheme
 272	var $fieldStyle;							// Contains field style values
 273	var $borderStyle;							// Contains border style values.
 274
 275	var $commentMessages=array();				// An accumulation of messages from the class.
 276
 277		// INTERNAL, templates
 278	var $totalWrap='<hr />|<hr />';				// Total wrapping for the table rows.
 279	var $fieldTemplate='<strong>###FIELD_NAME###</strong><br />###FIELD_ITEM###<hr />';	// Field template
 280	var $sectionWrap='';						// Wrapping template code for a section
 281	var $palFieldTemplateHeader='';				// Template for palette headers
 282	var $palFieldTemplate='';					// Template for palettes
 283
 284		// INTERNAL, working memory
 285	var $excludeElements='';					// Set to the fields NOT to display, if any.
 286	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)
 287	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!
 288	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.
 289	var $requiredAdditional=array();			// Used to register input-field names, which are required an have additional requirements (e.g. like a date/time must be positive integer). The information of this array is merged with $this->requiredFields later.
 290	var $requiredElements=array();				// Used to register the min and max number of elements for selectorboxes where that apply (in the "group" type for instance)
 291	var $requiredNested=array();				// Used to determine where $requiredFields or $requiredElements are nested (in Tabs or IRRE)
 292	var $renderDepth=0;							// Keeps track of the rendering depth of nested records.
 293	var $savedSchemes=array();					// Color scheme buffer.
 294	var $dynNestedStack = array();				// holds the path an element is nested in (e.g. required for RTEhtmlarea)
 295
 296		// Internal, registers for user defined functions etc.
 297	var $additionalCode_pre = array();			// Additional HTML code, printed before the form.
 298	var $additionalJS_pre = array();			// Additional JavaScript, printed before the form
 299	var $additionalJS_post = array();			// Additional JavaScript printed after the form
 300	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.
 301	var $additionalJS_delete = array();			// Additional JavaScript executed when section element is deleted. This is neceessary, for example, to correctly clean up HTMLArea RTE (bug #8232)
 302
 303	/**
 304	 * Instance of t3lib_tceforms_inline
 305	 *
 306	 * @var t3lib_TCEforms_inline
 307	 */
 308	var $inline;
 309	var $hookObjectsMainFields = array();			// Array containing hook class instances called once for a form
 310	var $hookObjectsSingleField = array();			// Array containing hook class instances called for each field
 311	var $extraFormHeaders = array();			// Rows gettings inserted into the alt_doc headers (when called from alt_doc.php)
 312
 313
 314
 315
 316
 317	/**
 318	 * Constructor function, setting internal variables, loading the styles used.
 319	 *
 320	 * @return	void
 321	 */
 322	function t3lib_TCEforms()	{
 323		global $CLIENT, $TYPO3_CONF_VARS;
 324
 325		$this->clientInfo = t3lib_div::clientInfo();
 326
 327		$this->RTEenabled = $GLOBALS['BE_USER']->isRTE();
 328		if (!$this->RTEenabled)	{
 329			$this->RTEenabled_notReasons = implode(LF,$GLOBALS['BE_USER']->RTE_errors);
 330			$this->commentMessages[] = 'RTE NOT ENABLED IN SYSTEM due to:'.LF.$this->RTEenabled_notReasons;
 331		}
 332
 333			// Default color+class scheme
 334		$this->defColorScheme = array(
 335			$GLOBALS['SOBE']->doc->bgColor,	// Background for the field AND palette
 336			t3lib_div::modifyHTMLColorAll($GLOBALS['SOBE']->doc->bgColor,-20),	// Background for the field header
 337			t3lib_div::modifyHTMLColorAll($GLOBALS['SOBE']->doc->bgColor,-10),	// Background for the palette field header
 338			'black',	// Field header font color
 339			'#666666'	// Palette field header font color
 340		);
 341		$this->defColorScheme = array();
 342
 343			// Override / Setting defaults from TBE_STYLES array
 344		$this->resetSchemes();
 345
 346			// Setting the current colorScheme to default.
 347		$this->defColorScheme = $this->colorScheme;
 348		$this->defClassScheme = $this->classScheme;
 349
 350			// Define whitelist that allows TCA field configuration to be overridden by TSconfig, @see overrideFieldConf():
 351		$this->allowOverrideMatrix = array(
 352			'input' => array('size', 'max'),
 353			'text' => array('cols', 'rows', 'wrap'),
 354			'check' => array('cols', 'showIfRTE'),
 355			'select' => array('size', 'autoSizeMax', 'maxitems', 'minitems'),
 356			'group' => array('size', 'autoSizeMax', 'max_size', 'show_thumbs', 'maxitems', 'minitems', 'disable_controls'),
 357			'inline' => array('appearance', 'behaviour', 'foreign_label', 'foreign_selector', 'foreign_unique', 'maxitems', 'minitems', 'size', 'autoSizeMax', 'symmetric_label'),
 358		);
 359
 360			// Create instance of t3lib_TCEforms_inline only if this a non-IRRE-AJAX call:
 361		if (!isset($GLOBALS['ajaxID']) || strpos($GLOBALS['ajaxID'], 't3lib_TCEforms_inline::')!==0) {
 362			$this->inline = t3lib_div::makeInstance('t3lib_TCEforms_inline');
 363		}
 364			// Create instance of t3lib_TCEforms_suggest only if this a non-Suggest-AJAX call:
 365		if (!isset($GLOBALS['ajaxID']) || strpos($GLOBALS['ajaxID'], 't3lib_TCEforms_suggest::')!==0) {
 366			$this->suggest = t3lib_div::makeInstance('t3lib_TCEforms_suggest');
 367		}
 368
 369			// Prepare user defined objects (if any) for hooks which extend this function:
 370		$this->hookObjectsMainFields = array();
 371		if (is_array ($TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_tceforms.php']['getMainFieldsClass']))	{
 372			foreach ($TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_tceforms.php']['getMainFieldsClass'] as $classRef)	{
 373				$this->hookObjectsMainFields[] = t3lib_div::getUserObj($classRef);
 374			}
 375		}
 376		$this->hookObjectsSingleField = array();
 377		if (is_array ($TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_tceforms.php']['getSingleFieldClass']))	{
 378			foreach ($TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_tceforms.php']['getSingleFieldClass'] as $classRef)	{
 379				$this->hookObjectsSingleField[] = t3lib_div::getUserObj($classRef);
 380			}
 381		}
 382
 383	}
 384
 385	/**
 386	 * Initialize various internal variables.
 387	 *
 388	 * @return	void
 389	 */
 390	function initDefaultBEmode()	{
 391		global $BE_USER;
 392		$this->prependFormFieldNames = 'data';
 393		$this->formName = 'editform';
 394		$this->setNewBEDesign();
 395		$this->docLarge = $BE_USER->uc['edit_wideDocument'] ? 1 : 0;
 396		$this->edit_showFieldHelp = $BE_USER->uc['edit_showFieldHelp'];
 397
 398		$this->edit_docModuleUpload = $BE_USER->uc['edit_docModuleUpload'];
 399		$this->titleLen = $BE_USER->uc['titleLen'];		// @deprecated since TYPO3 4.1
 400
 401		$this->inline->init($this);
 402		$this->suggest->init($this);
 403	}
 404
 405
 406
 407
 408
 409
 410
 411
 412
 413
 414
 415
 416
 417
 418
 419
 420
 421	/*******************************************************
 422	 *
 423	 * Rendering the forms, fields etc
 424	 *
 425	 *******************************************************/
 426
 427	/**
 428	 * Will return the TCEform element for just a single field from a record.
 429	 * The field must be listed in the currently displayed fields (as found in [types][showitem]) for the record.
 430	 * This also means that the $table/$row supplied must be complete so the list of fields to show can be found correctly
 431	 *
 432	 * @param	string		The table name
 433	 * @param	array		The record from the table for which to render a field.
 434	 * @param	string		The field name to return the TCEform element for.
 435	 * @return	string		HTML output
 436	 * @see getMainFields()
 437	 */
 438	function getSoloField($table,$row,$theFieldToReturn)	{
 439		global $TCA;
 440
 441		if ($TCA[$table])	{
 442			t3lib_div::loadTCA($table);
 443			$typeNum = $this->getRTypeNum($table,$row);
 444			if ($TCA[$table]['types'][$typeNum])	{
 445				$itemList = $TCA[$table]['types'][$typeNum]['showitem'];
 446				if ($itemList)	{
 447					$fields = t3lib_div::trimExplode(',',$itemList,1);
 448					$excludeElements = $this->excludeElements = $this->getExcludeElements($table,$row,$typeNum);
 449
 450					foreach($fields as $fieldInfo) {
 451						$parts = explode(';',$fieldInfo);
 452
 453						$theField = trim($parts[0]);
 454						if (!in_array($theField,$excludeElements) && !strcmp($theField,$theFieldToReturn))	{
 455							if ($TCA[$table]['columns'][$theField])	{
 456								$sField = $this->getSingleField($table,$theField,$row,$parts[1],1,$parts[3],$parts[2]);
 457								return $sField['ITEM'];
 458							}
 459						}
 460					}
 461				}
 462			}
 463		}
 464	}
 465
 466	/**
 467	 * Based on the $table and $row of content, this displays the complete TCEform for the record.
 468	 * The input-$row is required to be preprocessed if necessary by eg. the t3lib_transferdata class. For instance the RTE content should be transformed through this class first.
 469	 *
 470	 * @param	string		The table name
 471	 * @param	array		The record from the table for which to render a field.
 472	 * @param	integer		Depth level
 473	 * @return	string		HTML output
 474	 * @see getSoloField()
 475	 */
 476	function getMainFields($table,$row,$depth=0)	{
 477		global $TCA, $TYPO3_CONF_VARS;
 478
 479		$this->renderDepth=$depth;
 480
 481			// Init vars:
 482		$out_array = array(array());
 483		$out_array_meta = array(array(
 484			'title' => $this->getLL('l_generalTab')
 485		));
 486
 487		$out_pointer=0;
 488		$out_sheet=0;
 489		$this->palettesRendered=array();
 490		$this->palettesRendered[$this->renderDepth][$table]=array();
 491
 492			// Hook: getMainFields_preProcess (requested by Thomas Hempel for use with the "dynaflex" extension)
 493		foreach ($this->hookObjectsMainFields as $hookObj)	{
 494			if (method_exists($hookObj,'getMainFields_preProcess'))	{
 495				$hookObj->getMainFields_preProcess($table,$row,$this);
 496			}
 497		}
 498
 499		if ($TCA[$table])	{
 500
 501				// Load the full TCA for the table.
 502			t3lib_div::loadTCA($table);
 503
 504				// Get dividers2tabs setting from TCA of the current table:
 505			$dividers2tabs =& $TCA[$table]['ctrl']['dividers2tabs'];
 506
 507				// Load the description content for the table.
 508			if ($this->edit_showFieldHelp || $this->doLoadTableDescr($table))	{
 509				$GLOBALS['LANG']->loadSingleTableDescription($table);
 510			}
 511				// Get the current "type" value for the record.
 512			$typeNum = $this->getRTypeNum($table,$row);
 513
 514				// Find the list of fields to display:
 515			if ($TCA[$table]['types'][$typeNum])	{
 516				$itemList = $TCA[$table]['types'][$typeNum]['showitem'];
 517				if ($itemList)	{	// If such a list existed...
 518						// Explode the field list and possibly rearrange the order of the fields, if configured for
 519					$fields = t3lib_div::trimExplode(',',$itemList,1);
 520					if ($this->fieldOrder)	{
 521						$fields = $this->rearrange($fields);
 522					}
 523
 524						// Get excluded fields, added fiels and put it together:
 525					$excludeElements = $this->excludeElements = $this->getExcludeElements($table,$row,$typeNum);
 526					$fields = $this->mergeFieldsWithAddedFields($fields,$this->getFieldsToAdd($table,$row,$typeNum));
 527
 528						// If TCEforms will render a tab menu in the next step, push the name to the tab stack:
 529					$tabIdentString = '';
 530					$tabIdentStringMD5 = '';
 531					if (strstr($itemList, '--div--') !== false && $this->enableTabMenu && $dividers2tabs) {
 532						$tabIdentString = 'TCEforms:'.$table.':'.$row['uid'];
 533						$tabIdentStringMD5 = $GLOBALS['TBE_TEMPLATE']->getDynTabMenuId($tabIdentString);
 534							// Remember that were currently working on the general tab:
 535						if (isset($fields[0]) && strpos($fields[0], '--div--') !== 0) {
 536							$this->pushToDynNestedStack('tab', $tabIdentStringMD5.'-1');
 537						}
 538					}
 539
 540						// Traverse the fields to render:
 541					$cc=0;
 542					foreach($fields as $fieldInfo)	{
 543							// Exploding subparts of the field configuration:
 544						$parts = explode(';',$fieldInfo);
 545
 546							// Getting the style information out:
 547						$color_style_parts = t3lib_div::trimExplode('-',$parts[4]);
 548						if (strcmp($color_style_parts[0],''))	{
 549							$this->setColorScheme($GLOBALS['TBE_STYLES']['colorschemes'][intval($color_style_parts[0])]);
 550						}
 551						if (strcmp($color_style_parts[1],''))	{
 552							$this->fieldStyle = $GLOBALS['TBE_STYLES']['styleschemes'][intval($color_style_parts[1])];
 553							if (!isset($this->fieldStyle))	$this->fieldStyle = $GLOBALS['TBE_STYLES']['styleschemes'][0];
 554						}
 555						if (strcmp($color_style_parts[2],''))	{
 556							$this->wrapBorder($out_array[$out_sheet],$out_pointer);
 557							$this->borderStyle = $GLOBALS['TBE_STYLES']['borderschemes'][intval($color_style_parts[2])];
 558							if (!isset($this->borderStyle))	$this->borderStyle = $GLOBALS['TBE_STYLES']['borderschemes'][0];
 559						}
 560
 561							// Render the field:
 562						$theField = $parts[0];
 563						if (!in_array($theField,$excludeElements))	{
 564							if ($TCA[$table]['columns'][$theField])	{
 565								$sFieldPal='';
 566
 567								if ($parts[2] && !isset($this->palettesRendered[$this->renderDepth][$table][$parts[2]]))	{
 568									$sFieldPal=$this->getPaletteFields($table,$row,$parts[2]);
 569									$this->palettesRendered[$this->renderDepth][$table][$parts[2]] = 1;
 570								}
 571								$sField = $this->getSingleField($table,$theField,$row,$parts[1],0,$parts[3],$parts[2]);
 572								if ($sField)	{ $sField.= $sFieldPal; }
 573
 574								$out_array[$out_sheet][$out_pointer].= $sField;
 575							} elseif ($theField=='--div--')	{
 576								if ($cc>0)	{
 577									$out_array[$out_sheet][$out_pointer].=$this->getDivider();
 578
 579									if ($this->enableTabMenu && $dividers2tabs) {
 580										$this->wrapBorder($out_array[$out_sheet],$out_pointer);
 581											// Remove last tab entry from the dynNestedStack:
 582										$out_sheet++;
 583											// Remove the previous sheet from stack (if any):
 584										$this->popFromDynNestedStack('tab', $tabIdentStringMD5.'-'.($out_sheet));
 585											// Remember on which sheet we're currently working:
 586										$this->pushToDynNestedStack('tab', $tabIdentStringMD5.'-'.($out_sheet+1));
 587										$out_array[$out_sheet] = array();
 588										$out_array_meta[$out_sheet]['title'] = $this->sL($parts[1]);
 589 											// Register newline for Tab
 590 										$out_array_meta[$out_sheet]['newline'] = ($parts[2] == "newline");
 591									}
 592								} else {	// Setting alternative title for "General" tab if "--div--" is the very first element.
 593									$out_array_meta[$out_sheet]['title'] = $this->sL($parts[1]);
 594										// Only add the first tab to the dynNestedStack if there are more tabs:
 595									if ($tabIdentString && strpos($itemList, '--div--', strlen($fieldInfo))) {
 596										$this->pushToDynNestedStack('tab', $tabIdentStringMD5.'-1');
 597									}
 598								}
 599							} elseif($theField=='--palette--')	{
 600								if ($parts[2] && !isset($this->palettesRendered[$this->renderDepth][$table][$parts[2]]))	{
 601										// render a 'header' if not collapsed
 602									if ($TCA[$table]['palettes'][$parts[2]]['canNotCollapse'] AND $parts[1]) {
 603										$out_array[$out_sheet][$out_pointer].=$this->getPaletteFields($table,$row,$parts[2],$this->sL($parts[1]));
 604									} else {
 605										$out_array[$out_sheet][$out_pointer].=$this->getPaletteFields($table,$row,$parts[2],'','',$this->sL($parts[1]));
 606									}
 607									$this->palettesRendered[$this->renderDepth][$table][$parts[2]] = 1;
 608								}
 609							}
 610						}
 611
 612						$cc++;
 613					}
 614				}
 615			}
 616		}
 617
 618			// Hook: getMainFields_postProcess (requested by Thomas Hempel for use with the "dynaflex" extension)
 619		foreach ($this->hookObjectsMainFields as $hookObj)	{
 620			if (method_exists($hookObj,'getMainFields_postProcess'))	{
 621				$hookObj->getMainFields_postProcess($table,$row,$this);
 622			}
 623		}
 624
 625			// Wrapping a border around it all:
 626		$this->wrapBorder($out_array[$out_sheet],$out_pointer);
 627
 628			// Resetting styles:
 629		$this->resetSchemes();
 630
 631			// Rendering Main palettes, if any
 632		$mParr = t3lib_div::trimExplode(',',$TCA[$table]['ctrl']['mainpalette']);
 633		$i = 0;
 634		if (count($mParr))	{
 635			foreach ($mParr as $mP)	{
 636				if (!isset($this->palettesRendered[$this->renderDepth][$table][$mP]))	{
 637					$temp_palettesCollapsed=$this->palettesCollapsed;
 638					$this->palettesCollapsed=0;
 639					$label = ($i==0?$this->getLL('l_generalOptions'):$this->getLL('l_generalOptions_more'));
 640					$out_array[$out_sheet][$out_pointer].=$this->getPaletteFields($table,$row,$mP,$label);
 641					$this->palettesCollapsed=$temp_palettesCollapsed;
 642					$this->palettesRendered[$this->renderDepth][$table][$mP] = 1;
 643				}
 644				$this->wrapBorder($out_array[$out_sheet],$out_pointer);
 645				$i++;
 646				if ($this->renderDepth)	{
 647					$this->renderDepth--;
 648				}
 649			}
 650		}
 651
 652			// Return the imploded $out_array:
 653		if ($out_sheet>0)	{	// There were --div-- dividers around...
 654
 655				// Create parts array for the tab menu:
 656			$parts = array();
 657			foreach ($out_array as $idx => $sheetContent)	{
 658				$content = implode('', $sheetContent);
 659				if ($content) {
 660					// Wrap content (row) with table-tag, otherwise tab/sheet will be disabled (see getdynTabMenu() )
 661					$content = '<table border="0" cellspacing="0" cellpadding="0" width="100%">'.$content.'</table>';
 662				}
 663				$parts[$idx] = array(
 664					'label' => $out_array_meta[$idx]['title'],
 665					'content' => $content,
 666					'newline' => $out_array_meta[$idx]['newline'], 	// Newline for this tab/sheet
 667				);
 668			}
 669
 670			if (count($parts) > 1) {
 671					// Unset the current level of tab menus:
 672				$this->popFromDynNestedStack('tab', $tabIdentStringMD5.'-'.($out_sheet+1));
 673				$dividersToTabsBehaviour = (isset($TCA[$table]['ctrl']['dividers2tabs']) ? $TCA[$table]['ctrl']['dividers2tabs'] : 1);
 674				$output = $this->getDynTabMenu($parts, $tabIdentString, $dividersToTabsBehaviour);
 675
 676			} else {
 677					// If there is only one tab/part there is no need to wrap it into the dynTab code
 678				$output = isset($parts[0]) ? trim($parts[0]['content']) : '';
 679			}
 680
 681			$output = '
 682				<tr>
 683					<td colspan="2">
 684					'.$output.'
 685					</td>
 686				</tr>';
 687
 688		} else {
 689				// Only one, so just implode:
 690			$output = implode('',$out_array[$out_sheet]);
 691		}
 692
 693		return $output;
 694	}
 695
 696	/**
 697	 * Will return the TCEform elements for a pre-defined list of fields.
 698	 * Notice that this will STILL use the configuration found in the list [types][showitem] for those fields which are found there. So ideally the list of fields given as argument to this function should also be in the current [types][showitem] list of the record.
 699	 * Used for displaying forms for the frontend edit icons for instance.
 700	 *
 701	 * @param	string		The table name
 702	 * @param	array		The record array.
 703	 * @param	string		Commalist of fields from the table. These will be shown in the specified order in a form.
 704	 * @return	string		TCEform elements in a string.
 705	 */
 706	function getListedFields($table,$row,$list)	{
 707		global $TCA;
 708
 709		t3lib_div::loadTCA($table);
 710		if ($this->edit_showFieldHelp || $this->doLoadTableDescr($table))	{
 711			$GLOBALS['LANG']->loadSingleTableDescription($table);
 712		}
 713
 714		$out = '';
 715		$types_fieldConfig = t3lib_BEfunc::getTCAtypes($table,$row,1);
 716
 717		$editFieldList=array_unique(t3lib_div::trimExplode(',',$list,1));
 718		foreach($editFieldList as $theFieldC)	{
 719			list($theField,$palFields) = preg_split('/\[|\]/', $theFieldC);
 720			$theField = trim($theField);
 721			$palFields = trim($palFields);
 722			if ($TCA[$table]['columns'][$theField])	{
 723				$parts = t3lib_div::trimExplode(';',$types_fieldConfig[$theField]['origString']);
 724				$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.
 725				$out.= $sField;
 726			} elseif($theField=='--div--')	{
 727				$out.= $this->getDivider();
 728			}
 729			if ($palFields)	{
 730				$out.= $this->getPaletteFields($table,$row,'','',implode(',',t3lib_div::trimExplode('|',$palFields,1)));
 731			}
 732		}
 733
 734		return $out;
 735	}
 736
 737	/**
 738	 * Creates a palette (collection of secondary options).
 739	 *
 740	 * @param	string		The table name
 741	 * @param	array		The row array
 742	 * @param	string		The palette number/pointer
 743	 * @param	string		Header string for the palette (used when in-form). If not set, no header item is made.
 744	 * @param	string		Optional alternative list of fields for the palette
 745	 * @param	string		Optional Link text for activating a palette (when palettes does not have another form element to belong to).
 746	 * @return	string		HTML code.
 747	 */
 748	function getPaletteFields($table,$row,$palette,$header='',$itemList='',$collapsedHeader=NULL)	{
 749		if (!$this->doPrintPalette)	{
 750			return '';
 751		}
 752
 753		$out = '';
 754		$parts = $this->loadPaletteElements($table, $row, $palette, $itemList);
 755
 756			// Put palette together if there are fields in it:
 757		if (count($parts))	{
 758			if ($header)	{
 759				$out .= $this->intoTemplate(
 760						array('HEADER' => htmlspecialchars($header)),
 761						$this->palFieldTemplateHeader
 762					);
 763			}
 764
 765			$collapsed = $this->isPalettesCollapsed($table,$palette);
 766
 767			$thePalIcon = '';
 768			if ($collapsed && $collapsedHeader !== NULL) {
 769				list($thePalIcon,) = $this->wrapOpenPalette(t3lib_iconWorks::getSpriteIcon('actions-system-options-view', array('title' => htmlspecialchars($this->getLL('l_moreOptions')))), $table, $row, $palette, 1);
 770				$thePalIcon = '<span style="margin-left: 20px;">' . $thePalIcon . $collapsedHeader . '</span>';
 771			}
 772
 773			$paletteHtml = $this->wrapPaletteField($this->printPalette($parts), $table, $row ,$palette, $collapsed);
 774
 775			$out .= $this->intoTemplate(
 776					array('PALETTE' => $thePalIcon . $paletteHtml),
 777					$this->palFieldTemplate
 778				);
 779		}
 780		return $out;
 781	}
 782
 783	/**
 784	 * Returns the form HTML code for a database table field.
 785	 *
 786	 * @param	string		The table name
 787	 * @param	string		The field name
 788	 * @param	array		The record to edit from the database table.
 789	 * @param	string		Alternative field name label to show.
 790	 * @param	boolean		Set this if the field is on a palette (in top frame), otherwise not. (if set, field will render as a hidden field).
 791	 * @param	string		The "extra" options from "Part 4" of the field configurations found in the "types" "showitem" list. Typically parsed by $this->getSpecConfFromString() in order to get the options as an associative array.
 792	 * @param	integer		The palette pointer.
 793	 * @return	mixed		String (normal) or array (palettes)
 794	 */
 795	function getSingleField($table,$field,$row,$altName='',$palette=0,$extra='',$pal=0)	{
 796		global $TCA,$BE_USER;
 797
 798			// Hook: getSingleField_preProcess
 799		foreach ($this->hookObjectsSingleField as $hookObj)	{
 800			if (method_exists($hookObj,'getSingleField_preProcess'))	{
 801				$hookObj->getSingleField_preProcess($table, $field, $row, $altName, $palette, $extra, $pal, $this);
 802			}
 803		}
 804
 805		$out = '';
 806		$PA = array();
 807		$PA['altName'] = $altName;
 808		$PA['palette'] = $palette;
 809		$PA['extra'] = $extra;
 810		$PA['pal'] = $pal;
 811
 812			// Make sure to load full $TCA array for the table:
 813		t3lib_div::loadTCA($table);
 814
 815			// Get the TCA configuration for the current field:
 816		$PA['fieldConf'] = $TCA[$table]['columns'][$field];
 817		$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
 818
 819		$skipThisField = $this->inline->skipField($table, $field, $row, $PA['fieldConf']['config']);
 820
 821			// Now, check if this field is configured and editable (according to excludefields + other configuration)
 822		if (	is_array($PA['fieldConf']) &&
 823				!$skipThisField &&
 824				(!$PA['fieldConf']['exclude'] || $BE_USER->check('non_exclude_fields',$table.':'.$field)) &&
 825				$PA['fieldConf']['config']['form_type']!='passthrough' &&
 826				($this->RTEenabled || !$PA['fieldConf']['config']['showIfRTE']) &&
 827				(!$PA['fieldConf']['displayCond'] || $this->isDisplayCondition($PA['fieldConf']['displayCond'],$row)) &&
 828				(!$TCA[$table]['ctrl']['languageField'] || $PA['fieldConf']['l10n_display'] || strcmp($PA['fieldConf']['l10n_mode'],'exclude') || $row[$TCA[$table]['ctrl']['languageField']]<=0) &&
 829				(!$TCA[$table]['ctrl']['languageField'] || !$this->localizationMode || $this->localizationMode===$PA['fieldConf']['l10n_cat'])
 830			)	{
 831
 832
 833
 834				// Fetching the TSconfig for the current table/field. This includes the $row which means that
 835			$PA['fieldTSConfig'] = $this->setTSconfig($table,$row,$field);
 836
 837				// If the field is NOT disabled from TSconfig (which it could have been) then render it
 838			if (!$PA['fieldTSConfig']['disabled'])	{
 839					// Override fieldConf by fieldTSconfig:
 840				$PA['fieldConf']['config'] = $this->overrideFieldConf($PA['fieldConf']['config'], $PA['fieldTSConfig']);
 841
 842					// Init variables:
 843				$PA['itemFormElName']=$this->prependFormFieldNames.'['.$table.']['.$row['uid'].']['.$field.']';		// Form field name
 844				$PA['itemFormElName_file']=$this->prependFormFieldNames_file.'['.$table.']['.$row['uid'].']['.$field.']';	// Form field name, in case of file uploads
 845				$PA['itemFormElValue']=$row[$field];		// The value to show in the form field.
 846				$PA['itemFormElID']=$this->prependFormFieldNames.'_'.$table.'_'.$row['uid'].'_'.$field;
 847
 848					// set field to read-only if configured for translated records to show default language content as readonly
 849				if ($PA['fieldConf']['l10n_display'] && t3lib_div::inList($PA['fieldConf']['l10n_display'], 'defaultAsReadonly') && $row[$TCA[$table]['ctrl']['languageField']] > 0) {
 850					$PA['fieldConf']['config']['readOnly'] =  true;
 851					$PA['itemFormElValue'] = $this->defaultLanguageData[$table.':'.$row['uid']][$field];
 852				}
 853
 854					// 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"
 855				if (
 856					($TCA[$table]['ctrl']['type'] && !strcmp($field,$TCA[$table]['ctrl']['type'])) ||
 857					($TCA[$table]['ctrl']['requestUpdate'] && t3lib_div::inList($TCA[$table]['ctrl']['requestUpdate'],$field))) {
 858					if($GLOBALS['BE_USER']->jsConfirmation(1))	{
 859						$alertMsgOnChange = 'if (confirm(TBE_EDITOR.labels.onChangeAlert) && TBE_EDITOR.checkSubmit(-1)){ TBE_EDITOR.submitForm() };';
 860					} else {
 861						$alertMsgOnChange = 'if (TBE_EDITOR.checkSubmit(-1)){ TBE_EDITOR.submitForm() };';
 862					}
 863				} else {
 864					$alertMsgOnChange = '';
 865				}
 866
 867					// Render as a hidden field?
 868				if (in_array($field,$this->hiddenFieldListArr))	{
 869					$this->hiddenFieldAccum[]='<input type="hidden" name="'.$PA['itemFormElName'].'" value="'.htmlspecialchars($PA['itemFormElValue']).'" />';
 870				} else {	// Render as a normal field:
 871
 872						// 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.
 873					if (!$PA['palette'])	{
 874						$paletteFields = $this->loadPaletteElements($table, $row, $PA['pal']);
 875						if ($PA['pal'] && $this->isPalettesCollapsed($table,$PA['pal']) && count($paletteFields))	{
 876							list($thePalIcon,$palJSfunc) = $this->wrapOpenPalette(t3lib_iconWorks::getSpriteIcon('actions-system-options-view', array('title' => htmlspecialchars($this->getLL('l_moreOptions')))),$table,$row,$PA['pal'],1);
 877						} else {
 878							$thePalIcon = '';
 879							$palJSfunc = '';
 880						}
 881					}
 882						// onFocus attribute to add to the field:
 883					$PA['onFocus'] = ($palJSfunc && !$BE_USER->uc['dontShowPalettesOnFocusInAB']) ? ' onfocus="'.htmlspecialchars($palJSfunc).'"' : '';
 884
 885						// Find item
 886					$item='';
 887					$PA['label'] = ($PA['altName'] ? $PA['altName'] : $PA['fieldConf']['label']);
 888					$PA['label'] = ($PA['fieldTSConfig']['label'] ? $PA['fieldTSConfig']['label'] : $PA['label']);
 889					$PA['label'] = ($PA['fieldTSConfig']['label.'][$GLOBALS['LANG']->lang] ? $PA['fieldTSConfig']['label.'][$GLOBALS['LANG']->lang] : $PA['label']);
 890					$PA['label'] = $this->sL($PA['label']);
 891						// JavaScript code for event handlers:
 892					$PA['fieldChangeFunc']=array();
 893					$PA['fieldChangeFunc']['TBE_EDITOR_fieldChanged'] = "TBE_EDITOR.fieldChanged('".$table."','".$row['uid']."','".$field."','".$PA['itemFormElName']."');";
 894					$PA['fieldChangeFunc']['alert']=$alertMsgOnChange;
 895						// if this is the child of an inline type and it is the field creating the label
 896					if ($this->inline->isInlineChildAndLabelField($table, $field)) {
 897						$inlineObjectId = implode(
 898							t3lib_TCEforms_inline::Structure_Separator,
 899							array(
 900								$this->inline->inlineNames['object'],
 901								$table,
 902								$row['uid']
 903							)
 904						);
 905						$PA['fieldChangeFunc']['inline'] = "inline.handleChangedField('" . $PA['itemFormElName'] . "','" . $inlineObjectId . "');";
 906					}
 907
 908						// Based on the type of the item, call a render function:
 909					$item = $this->getSingleField_SW($table,$field,$row,$PA);
 910
 911						// Add language + diff
 912					if ($PA['fieldConf']['l10n_display'] && (t3lib_div::inList($PA['fieldConf']['l10n_display'], 'hideDiff') || t3lib_div::inList($PA['fieldConf']['l10n_display'], 'defaultAsReadonly'))) {
 913						$renderLanguageDiff = false;
 914					} else {
 915						$renderLanguageDiff = true;
 916					}
 917
 918					if ($renderLanguageDiff) {
 919						$item = $this->renderDefaultLanguageContent($table,$field,$row,$item);
 920						$item = $this->renderDefaultLanguageDiff($table,$field,$row,$item);
 921					}
 922
 923						// 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
 924					$PA['label'] = t3lib_div::deHSCentities(htmlspecialchars($PA['label']));
 925					if (t3lib_div::testInt($row['uid']) && $PA['fieldTSConfig']['linkTitleToSelf'] && !t3lib_div::_GP('columnsOnly'))	{
 926						$lTTS_url = $this->backPath.'alt_doc.php?edit['.$table.']['.$row['uid'].']=edit&columnsOnly='.$field.'&returnUrl='.rawurlencode($this->thisReturnUrl());
 927						$PA['label'] = '<a href="'.htmlspecialchars($lTTS_url).'">'.$PA['label'].'</a>';
 928					}
 929
 930						// Create output value:
 931					if ($PA['fieldConf']['config']['form_type']=='user' && $PA['fieldConf']['config']['noTableWrapping'])	{
 932						$out = $item;
 933					} elseif ($PA['palette'])	{
 934							// Array:
 935						$out=array(
 936							'NAME'=>$PA['label'],
 937							'ID'=>$row['uid'],
 938							'FIELD'=>$field,
 939							'TABLE'=>$table,
 940							'ITEM'=>$item,
 941							'HELP_ICON' => $this->helpTextIcon($table,$field,1)
 942						);
 943						$out = $this->addUserTemplateMarkers($out,$table,$field,$row,$PA);
 944					} else {
 945							// String:
 946						$out=array(
 947							'NAME'=>$PA['label'],
 948							'ITEM'=>$item,
 949							'TABLE'=>$table,
 950							'ID'=>$row['uid'],
 951							'HELP_ICON'=>$this->helpTextIcon($table,$field),
 952							'HELP_TEXT'=>$this->helpText($table,$field),
 953							'PAL_LINK_ICON'=>$thePalIcon,
 954							'FIELD'=>$field
 955						);
 956						$out = $this->addUserTemplateMarkers($out,$table,$field,$row,$PA);
 957							// String:
 958						$out=$this->intoTemplate($out);
 959					}
 960				}
 961			} else $this->commentMessages[]=$this->prependFormFieldNames.'['.$table.']['.$row['uid'].']['.$field.']: Disabled by TSconfig';
 962		}
 963			// Hook: getSingleField_postProcess
 964		foreach ($this->hookObjectsSingleField as $hookObj)	{
 965			if (method_exists($hookObj,'getSingleField_postProcess'))	{
 966				$hookObj->getSingleField_postProcess($table, $field, $row, $out, $PA, $this);
 967			}
 968		}
 969			// Return value (string or array)
 970		return $out;
 971	}
 972
 973	/**
 974	 * Rendering a single item for the form
 975	 *
 976	 * @param	string		Table name of record
 977	 * @param	string		Fieldname to render
 978	 * @param	array		The record
 979	 * @param	array		parameters array containing a lot of stuff. Value by Reference!
 980	 * @return	string		Returns the item as HTML code to insert
 981	 * @access private
 982	 * @see getSingleField(), getSingleField_typeFlex_draw()
 983	 */
 984	function getSingleField_SW($table,$field,$row,&$PA)	{
 985		$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
 986
 987		// Hook: getSingleField_beforeRender
 988		foreach ($this->hookObjectsSingleField as $hookObject) {
 989			if (method_exists($hookObject, 'getSingleField_beforeRender')) {
 990				$hookObject->getSingleField_beforeRender($table, $field, $row, $PA);
 991			}
 992		}
 993
 994		switch($PA['fieldConf']['config']['form_type'])	{
 995			case 'input':
 996				$item = $this->getSingleField_typeInput($table,$field,$row,$PA);
 997			break;
 998			case 'text':
 999				$item = $this->getSingleField_typeText($table,$field,$row,$PA);
1000			break;
1001			case 'check':
1002				$item = $this->getSingleField_typeCheck($table,$field,$row,$PA);
1003			break;
1004			case 'radio':
1005				$item = $this->getSingleField_typeRadio($table,$field,$row,$PA);
1006			break;
1007			case 'select':
1008				$item = $this->getSingleField_typeSelect($table,$field,$row,$PA);
1009			break;
1010			case 'group':
1011				$item = $this->getSingleField_typeGroup($table,$field,$row,$PA);
1012			break;
1013			case 'inline':
1014				$item = $this->inline->getSingleField_typeInline($table,$field,$row,$PA);
1015			break;
1016			case 'none':
1017				$item = $this->getSingleField_typeNone($table,$field,$row,$PA);
1018			break;
1019			case 'user':
1020				$item = $this->getSingleField_typeUser($table,$field,$row,$PA);
1021			break;
1022			case 'flex':
1023				$item = $this->getSingleField_typeFlex($table,$field,$row,$PA);
1024			break;
1025			default:
1026				$item = $this->getSingleField_typeUnknown($table,$field,$row,$PA);
1027			break;
1028		}
1029
1030		return $item;
1031	}
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051	/**********************************************************
1052	 *
1053	 * Rendering of each TCEform field type
1054	 *
1055	 ************************************************************/
1056
1057	/**
1058	 * Generation of TCEform elements of the type "input"
1059	 * This will render a single-line input form field, possibly with various control/validation features
1060	 *
1061	 * @param	string		The table name of the record
1062	 * @param	string		The field name which this element is supposed to edit
1063	 * @param	array		The record data array where the value(s) for the field can be found
1064	 * @param	array		An array with additional configuration options.
1065	 * @return	string		The HTML code for the TCEform field
1066	 */
1067	function getSingleField_typeInput($table,$field,$row,&$PA)	{
1068		$config = $PA['fieldConf']['config'];
1069
1070		$specConf = $this->getSpecConfFromString($PA['extra'], $PA['fieldConf']['defaultExtras']);
1071		$size = t3lib_div::intInRange($config['size']?$config['size']:30,5,$this->maxInputWidth);
1072		$evalList = t3lib_div::trimExplode(',',$config['eval'],1);
1073		$classAndStyleAttributes = $this->formWidthAsArray($size);
1074
1075		$fieldAppendix = '';
1076		$cssClasses    = array($classAndStyleAttributes['class']);
1077		$cssStyle      = $classAndStyleAttributes['style'];
1078
1079			// css class and id will show the kind of field
1080		if (in_array('date', $evalList)) {
1081			$inputId = uniqid('tceforms-datefield-');
1082			$cssClasses[] = 'tceforms-textfield tceforms-datefield';
1083			$fieldAppendix = t3lib_iconWorks::getSpriteIcon(
1084				'actions-edit-pick-date',
1085				array(
1086					'style' => 'cursor:pointer;',
1087					'id' => 'picker-' . $inputId
1088				)
1089			);
1090
1091		} elseif (in_array('datetime', $evalList)) {
1092			$inputId = uniqid('tceforms-datetimefield-');
1093			$cssClasses[] = 'tceforms-textfield tceforms-datetimefield';
1094			$fieldAppendix = t3lib_iconWorks::getSpriteIcon(
1095				'actions-edit-pick-date',
1096				array(
1097					'style' => 'cursor:pointer;',
1098					'id' => 'picker-' . $inputId
1099				)
1100			);
1101
1102		} elseif (in_array('timesec', $evalList)) {
1103			$inputId = uniqid('tceforms-timesecfield-');
1104			$cssClasses[] = 'tceforms-textfield tceforms-timesecfield';
1105
1106		} elseif (in_array('year', $evalList)) {
1107			$inputId = uniqid('tceforms-yearfield-');
1108			$cssClasses[] = 'tceforms-textfield tceforms-yearfield';
1109
1110		} elseif (in_array('time', $evalList)) {
1111			$inputId = uniqid('tceforms-timefield-');
1112			$cssClasses[] = 'tceforms-textfield tceforms-timefield';
1113
1114		} elseif (in_array('int', $evalList)) {
1115			$inputId = uniqid('tceforms-intfield-');
1116			$cssClasses[] = 'tceforms-textfield tceforms-intfield';
1117
1118		} elseif (in_array('double2', $evalList)) {
1119			$inputId = uniqid('tceforms-double2field-');
1120			$cssClasses[] = 'tceforms-textfie…

Large files files are truncated, but you can click here to view the full file