PageRenderTime 67ms CodeModel.GetById 26ms RepoModel.GetById 0ms app.codeStats 2ms

/t3lib/class.t3lib_tceforms.php

https://github.com/andreaswolf/typo3-tceforms
PHP | 6513 lines | 4223 code | 671 blank | 1619 comment | 831 complexity | 62ef0b9f429b94ccbed1910110392289 MD5 | raw file
Possible License(s): Apache-2.0, BSD-2-Clause, LGPL-3.0

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-2011 Kasper Skårhøj (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$
  31. * Revised for TYPO3 3.6 August/2003 by Kasper Skårhøj
  32. * XHTML compliant
  33. *
  34. * @author Kasper Skårhøj <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. * 'TCEforms' - Class for creating the backend editing forms.
  173. *
  174. * @author Kasper Skårhøj <kasperYYYY@typo3.com>
  175. * @coauthor René Fritz <r.fritz@colorcube.de>
  176. * @package TYPO3
  177. * @subpackage t3lib
  178. */
  179. class t3lib_TCEforms {
  180. // variables not commented yet.... (do so...)
  181. var $palFieldArr = array();
  182. var $disableWizards = 0;
  183. var $isPalettedoc = 0;
  184. var $paletteMargin = 1;
  185. var $defStyle = ''; // 'font-family:Verdana;font-size:10px;';
  186. var $cachedTSconfig = array();
  187. var $cachedTSconfig_fieldLevel = array();
  188. var $cachedLanguageFlag = array();
  189. var $cachedAdditionalPreviewLanguages = NULL;
  190. var $transformedRow = array();
  191. var $extJSCODE = '';
  192. var $printNeededJS = array();
  193. var $hiddenFieldAccum = array();
  194. var $TBE_EDITOR_fieldChanged_func = '';
  195. var $loadMD5_JS = 1;
  196. var $prevBorderStyle = '[nothing here...]'; // Something unique...
  197. var $allowUpload = 0; // If set direct upload fields will be shown
  198. var $titleLen = 15; // @deprecated since TYPO3 4.1: $BE_USER->uc['titleLen'] but what is default??
  199. var $defaultLanguageData = array(); // Array where records in the default language is stored. (processed by transferdata)
  200. var $defaultLanguageData_diff = array(); // Array where records in the default language is stored (raw without any processing. used for making diff)
  201. var $additionalPreviewLanguageData = array();
  202. // EXTERNAL, static
  203. var $backPath = ''; // Set this to the 'backPath' pointing back to the typo3 admin directory from the script where this form is displayed.
  204. var $returnUrl = ''; // Alternative return URL path (default is t3lib_div::linkThisScript())
  205. 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.
  206. 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.
  207. var $disableRTE = 0; // If set, the RTE is disabled (from form display, eg. by checkbox in the bottom of the page!)
  208. var $globalShowHelp = 1; // If false, then all CSH will be disabled, regardless of settings in $this->edit_showFieldHelp
  209. var $localizationMode = ''; // If true, the forms are rendering only localization relevant fields of the records.
  210. 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.
  211. var $doPrintPalette = 1; // If set to false, palettes will NEVER be rendered.
  212. /**
  213. * Set to initialized clipboard object; Then the element browser will offer a link to paste in records from clipboard.
  214. *
  215. * @var t3lib_clipboard
  216. */
  217. var $clipObj = FALSE;
  218. var $enableClickMenu = FALSE; // Enable click menu on reference icons.
  219. var $enableTabMenu = FALSE; // Enable Tab Menus.
  220. var $renderReadonly = FALSE; // When enabled all fields are rendered non-editable.
  221. 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)
  222. var $form_largeComp = 1.33; // Form field width compensation: Compensation for large documents, doc-tab (editing)
  223. 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.
  224. var $maxTextareaWidth = 48; // The maximum abstract value for textareas
  225. var $maxInputWidth = 48; // The maximum abstract value for input fields
  226. var $defaultMultipleSelectorStyle = 'width:250px;'; // Default style for the selector boxes used for multiple items in "select" and "group" types.
  227. // INTERNAL, static
  228. var $prependFormFieldNames = 'data'; // The string to prepend formfield names with.
  229. var $prependCmdFieldNames = 'cmd'; // The string to prepend commands for tcemain::process_cmdmap with.
  230. var $prependFormFieldNames_file = 'data_files'; // The string to prepend FILE form field names with.
  231. var $formName = 'editform'; // The name attribute of the form.
  232. var $allowOverrideMatrix = array(); // Whitelist that allows TCA field configuration to be overridden by TSconfig, @see overrideFieldConf()
  233. // INTERNAL, dynamic
  234. var $perms_clause = ''; // Set by readPerms() (caching)
  235. var $perms_clause_set = 0; // Set by readPerms() (caching-flag)
  236. 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).
  237. var $docLarge = 0; // If set, the forms will be rendered a little wider, more precisely with a factor of $this->form_largeComp.
  238. var $clientInfo = array(); // Loaded with info about the browser when class is instantiated.
  239. var $RTEenabled = 0; // True, if RTE is possible for the current user (based on result from BE_USER->isRTE())
  240. 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)
  241. var $RTEcounter = 0; // Counter that is incremented before an RTE is created. Can be used for unique ids etc.
  242. var $colorScheme; // Contains current color scheme
  243. var $classScheme; // Contains current class scheme
  244. var $defColorScheme; // Contains the default color scheme
  245. var $defClassScheme; // Contains the default class scheme
  246. var $fieldStyle; // Contains field style values
  247. var $borderStyle; // Contains border style values.
  248. var $commentMessages = array(); // An accumulation of messages from the class.
  249. // INTERNAL, templates
  250. var $totalWrap = '<hr />|<hr />'; // Total wrapping for the table rows.
  251. var $fieldTemplate = '<strong>###FIELD_NAME###</strong><br />###FIELD_ITEM###<hr />'; // Field template
  252. var $sectionWrap = ''; // Wrapping template code for a section
  253. var $palFieldTemplateHeader = ''; // Template for palette headers
  254. var $palFieldTemplate = ''; // Template for palettes
  255. // INTERNAL, working memory
  256. var $excludeElements = ''; // Set to the fields NOT to display, if any.
  257. 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)
  258. 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!
  259. 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.
  260. 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.
  261. var $requiredElements = array(); // Used to register the min and max number of elements for selectorboxes where that apply (in the "group" type for instance)
  262. var $requiredNested = array(); // Used to determine where $requiredFields or $requiredElements are nested (in Tabs or IRRE)
  263. var $renderDepth = 0; // Keeps track of the rendering depth of nested records.
  264. var $savedSchemes = array(); // Color scheme buffer.
  265. var $dynNestedStack = array(); // holds the path an element is nested in (e.g. required for RTEhtmlarea)
  266. // Internal, registers for user defined functions etc.
  267. var $additionalCode_pre = array(); // Additional HTML code, printed before the form.
  268. var $additionalJS_pre = array(); // Additional JavaScript, printed before the form
  269. var $additionalJS_post = array(); // Additional JavaScript printed after the form
  270. 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.
  271. 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)
  272. /**
  273. * Instance of t3lib_tceforms_inline
  274. *
  275. * @var t3lib_TCEforms_inline
  276. */
  277. var $inline;
  278. var $hookObjectsMainFields = array(); // Array containing hook class instances called once for a form
  279. var $hookObjectsSingleField = array(); // Array containing hook class instances called for each field
  280. var $extraFormHeaders = array(); // Rows gettings inserted into the alt_doc headers (when called from alt_doc.php)
  281. public $templateFile = ''; // Form templates, relative to typo3 directory
  282. /**
  283. * Constructor function, setting internal variables, loading the styles used.
  284. *
  285. * @return void
  286. */
  287. function t3lib_TCEforms() {
  288. global $CLIENT, $TYPO3_CONF_VARS;
  289. $this->clientInfo = t3lib_div::clientInfo();
  290. $this->RTEenabled = $GLOBALS['BE_USER']->isRTE();
  291. if (!$this->RTEenabled) {
  292. $this->RTEenabled_notReasons = implode(LF, $GLOBALS['BE_USER']->RTE_errors);
  293. $this->commentMessages[] = 'RTE NOT ENABLED IN SYSTEM due to:' . LF . $this->RTEenabled_notReasons;
  294. }
  295. // Default color+class scheme
  296. $this->defColorScheme = array(
  297. $GLOBALS['SOBE']->doc->bgColor, // Background for the field AND palette
  298. t3lib_div::modifyHTMLColorAll($GLOBALS['SOBE']->doc->bgColor, -20), // Background for the field header
  299. t3lib_div::modifyHTMLColorAll($GLOBALS['SOBE']->doc->bgColor, -10), // Background for the palette field header
  300. 'black', // Field header font color
  301. '#666666' // Palette field header font color
  302. );
  303. $this->defColorScheme = array();
  304. // Override / Setting defaults from TBE_STYLES array
  305. $this->resetSchemes();
  306. // Setting the current colorScheme to default.
  307. $this->defColorScheme = $this->colorScheme;
  308. $this->defClassScheme = $this->classScheme;
  309. // Define whitelist that allows TCA field configuration to be overridden by TSconfig, @see overrideFieldConf():
  310. $this->allowOverrideMatrix = array(
  311. 'input' => array('size', 'max'),
  312. 'text' => array('cols', 'rows', 'wrap'),
  313. 'check' => array('cols', 'showIfRTE'),
  314. 'select' => array('size', 'autoSizeMax', 'maxitems', 'minitems'),
  315. 'group' => array('size', 'autoSizeMax', 'max_size', 'show_thumbs', 'maxitems', 'minitems', 'disable_controls'),
  316. 'inline' => array('appearance', 'behaviour', 'foreign_label', 'foreign_selector', 'foreign_unique', 'maxitems', 'minitems', 'size', 'autoSizeMax', 'symmetric_label'),
  317. );
  318. // Create instance of t3lib_TCEforms_inline only if this a non-IRRE-AJAX call:
  319. if (!isset($GLOBALS['ajaxID']) || strpos($GLOBALS['ajaxID'], 't3lib_TCEforms_inline::') !== 0) {
  320. $this->inline = t3lib_div::makeInstance('t3lib_TCEforms_inline');
  321. }
  322. // Create instance of t3lib_TCEforms_suggest only if this a non-Suggest-AJAX call:
  323. if (!isset($GLOBALS['ajaxID']) || strpos($GLOBALS['ajaxID'], 't3lib_TCEforms_suggest::') !== 0) {
  324. $this->suggest = t3lib_div::makeInstance('t3lib_TCEforms_suggest');
  325. }
  326. // Prepare user defined objects (if any) for hooks which extend this function:
  327. $this->hookObjectsMainFields = array();
  328. if (is_array($TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_tceforms.php']['getMainFieldsClass'])) {
  329. foreach ($TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_tceforms.php']['getMainFieldsClass'] as $classRef) {
  330. $this->hookObjectsMainFields[] = t3lib_div::getUserObj($classRef);
  331. }
  332. }
  333. $this->hookObjectsSingleField = array();
  334. if (is_array($TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_tceforms.php']['getSingleFieldClass'])) {
  335. foreach ($TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_tceforms.php']['getSingleFieldClass'] as $classRef) {
  336. $this->hookObjectsSingleField[] = t3lib_div::getUserObj($classRef);
  337. }
  338. }
  339. $this->templateFile = 'templates/tceforms.html';
  340. }
  341. /**
  342. * Initialize various internal variables.
  343. *
  344. * @return void
  345. */
  346. function initDefaultBEmode() {
  347. global $BE_USER;
  348. $this->prependFormFieldNames = 'data';
  349. $this->formName = 'editform';
  350. $this->setNewBEDesign();
  351. $this->docLarge = $BE_USER->uc['edit_wideDocument'] ? 1 : 0;
  352. $this->edit_showFieldHelp = $BE_USER->uc['edit_showFieldHelp'];
  353. $this->edit_docModuleUpload = $BE_USER->uc['edit_docModuleUpload'];
  354. $this->titleLen = $BE_USER->uc['titleLen']; // @deprecated since TYPO3 4.1
  355. $this->inline->init($this);
  356. $this->suggest->init($this);
  357. }
  358. /*******************************************************
  359. *
  360. * Rendering the forms, fields etc
  361. *
  362. *******************************************************/
  363. /**
  364. * Will return the TCEform element for just a single field from a record.
  365. * The field must be listed in the currently displayed fields (as found in [types][showitem]) for the record.
  366. * This also means that the $table/$row supplied must be complete so the list of fields to show can be found correctly
  367. *
  368. * @param string The table name
  369. * @param array The record from the table for which to render a field.
  370. * @param string The field name to return the TCEform element for.
  371. * @return string HTML output
  372. * @see getMainFields()
  373. */
  374. function getSoloField($table, $row, $theFieldToReturn) {
  375. global $TCA;
  376. if ($TCA[$table]) {
  377. t3lib_div::loadTCA($table);
  378. $typeNum = $this->getRTypeNum($table, $row);
  379. if ($TCA[$table]['types'][$typeNum]) {
  380. $itemList = $TCA[$table]['types'][$typeNum]['showitem'];
  381. if ($itemList) {
  382. $fields = t3lib_div::trimExplode(',', $itemList, 1);
  383. $excludeElements = $this->excludeElements = $this->getExcludeElements($table, $row, $typeNum);
  384. foreach ($fields as $fieldInfo) {
  385. $parts = explode(';', $fieldInfo);
  386. $theField = trim($parts[0]);
  387. if (!in_array($theField, $excludeElements) && !strcmp($theField, $theFieldToReturn)) {
  388. if ($TCA[$table]['columns'][$theField]) {
  389. $sField = $this->getSingleField($table, $theField, $row, $parts[1], 1, $parts[3], $parts[2]);
  390. return $sField['ITEM'];
  391. }
  392. }
  393. }
  394. }
  395. }
  396. }
  397. }
  398. /**
  399. * Based on the $table and $row of content, this displays the complete TCEform for the record.
  400. * 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.
  401. *
  402. * @param string The table name
  403. * @param array The record from the table for which to render a field.
  404. * @param integer Depth level
  405. * @return string HTML output
  406. * @see getSoloField()
  407. */
  408. function getMainFields($table, $row, $depth = 0) {
  409. global $TCA, $TYPO3_CONF_VARS;
  410. $this->renderDepth = $depth;
  411. // Init vars:
  412. $out_array = array(array());
  413. $out_array_meta = array(array(
  414. 'title' => $this->getLL('l_generalTab')
  415. ));
  416. $out_pointer = 0;
  417. $out_sheet = 0;
  418. $this->palettesRendered = array();
  419. $this->palettesRendered[$this->renderDepth][$table] = array();
  420. // Hook: getMainFields_preProcess (requested by Thomas Hempel for use with the "dynaflex" extension)
  421. foreach ($this->hookObjectsMainFields as $hookObj) {
  422. if (method_exists($hookObj, 'getMainFields_preProcess')) {
  423. $hookObj->getMainFields_preProcess($table, $row, $this);
  424. }
  425. }
  426. if ($TCA[$table]) {
  427. // Load the full TCA for the table.
  428. t3lib_div::loadTCA($table);
  429. // Get dividers2tabs setting from TCA of the current table:
  430. $dividers2tabs =& $TCA[$table]['ctrl']['dividers2tabs'];
  431. // Load the description content for the table.
  432. if ($this->edit_showFieldHelp || $this->doLoadTableDescr($table)) {
  433. $GLOBALS['LANG']->loadSingleTableDescription($table);
  434. }
  435. // Get the current "type" value for the record.
  436. $typeNum = $this->getRTypeNum($table, $row);
  437. // Find the list of fields to display:
  438. if ($TCA[$table]['types'][$typeNum]) {
  439. $itemList = $TCA[$table]['types'][$typeNum]['showitem'];
  440. if ($itemList) { // If such a list existed...
  441. // Explode the field list and possibly rearrange the order of the fields, if configured for
  442. $fields = t3lib_div::trimExplode(',', $itemList, 1);
  443. if ($this->fieldOrder) {
  444. $fields = $this->rearrange($fields);
  445. }
  446. // Get excluded fields, added fiels and put it together:
  447. $excludeElements = $this->excludeElements = $this->getExcludeElements($table, $row, $typeNum);
  448. $fields = $this->mergeFieldsWithAddedFields($fields, $this->getFieldsToAdd($table, $row, $typeNum));
  449. // If TCEforms will render a tab menu in the next step, push the name to the tab stack:
  450. $tabIdentString = '';
  451. $tabIdentStringMD5 = '';
  452. if (strstr($itemList, '--div--') !== false && $this->enableTabMenu && $dividers2tabs) {
  453. $tabIdentString = 'TCEforms:' . $table . ':' . $row['uid'];
  454. $tabIdentStringMD5 = $GLOBALS['TBE_TEMPLATE']->getDynTabMenuId($tabIdentString);
  455. // Remember that were currently working on the general tab:
  456. if (isset($fields[0]) && strpos($fields[0], '--div--') !== 0) {
  457. $this->pushToDynNestedStack('tab', $tabIdentStringMD5 . '-1');
  458. }
  459. }
  460. // Traverse the fields to render:
  461. $cc = 0;
  462. foreach ($fields as $fieldInfo) {
  463. // Exploding subparts of the field configuration:
  464. $parts = explode(';', $fieldInfo);
  465. // Getting the style information out:
  466. $color_style_parts = t3lib_div::trimExplode('-', $parts[4]);
  467. if (strcmp($color_style_parts[0], '')) {
  468. $this->setColorScheme($GLOBALS['TBE_STYLES']['colorschemes'][intval($color_style_parts[0])]);
  469. }
  470. if (strcmp($color_style_parts[1], '')) {
  471. $this->fieldStyle = $GLOBALS['TBE_STYLES']['styleschemes'][intval($color_style_parts[1])];
  472. if (!isset($this->fieldStyle)) {
  473. $this->fieldStyle = $GLOBALS['TBE_STYLES']['styleschemes'][0];
  474. }
  475. }
  476. if (strcmp($color_style_parts[2], '')) {
  477. $this->wrapBorder($out_array[$out_sheet], $out_pointer);
  478. $this->borderStyle = $GLOBALS['TBE_STYLES']['borderschemes'][intval($color_style_parts[2])];
  479. if (!isset($this->borderStyle)) {
  480. $this->borderStyle = $GLOBALS['TBE_STYLES']['borderschemes'][0];
  481. }
  482. }
  483. // Render the field:
  484. $theField = $parts[0];
  485. if (!in_array($theField, $excludeElements)) {
  486. if ($TCA[$table]['columns'][$theField]) {
  487. $sFieldPal = '';
  488. if ($parts[2] && !isset($this->palettesRendered[$this->renderDepth][$table][$parts[2]])) {
  489. $sFieldPal = $this->getPaletteFields($table, $row, $parts[2]);
  490. $this->palettesRendered[$this->renderDepth][$table][$parts[2]] = 1;
  491. }
  492. $sField = $this->getSingleField($table, $theField, $row, $parts[1], 0, $parts[3], $parts[2]);
  493. if ($sField) {
  494. $sField .= $sFieldPal;
  495. }
  496. $out_array[$out_sheet][$out_pointer] .= $sField;
  497. } elseif ($theField == '--div--') {
  498. if ($cc > 0) {
  499. $out_array[$out_sheet][$out_pointer] .= $this->getDivider();
  500. if ($this->enableTabMenu && $dividers2tabs) {
  501. $this->wrapBorder($out_array[$out_sheet], $out_pointer);
  502. // Remove last tab entry from the dynNestedStack:
  503. $out_sheet++;
  504. // Remove the previous sheet from stack (if any):
  505. $this->popFromDynNestedStack('tab', $tabIdentStringMD5 . '-' . ($out_sheet));
  506. // Remember on which sheet we're currently working:
  507. $this->pushToDynNestedStack('tab', $tabIdentStringMD5 . '-' . ($out_sheet + 1));
  508. $out_array[$out_sheet] = array();
  509. $out_array_meta[$out_sheet]['title'] = $this->sL($parts[1]);
  510. // Register newline for Tab
  511. $out_array_meta[$out_sheet]['newline'] = ($parts[2] == "newline");
  512. }
  513. } else { // Setting alternative title for "General" tab if "--div--" is the very first element.
  514. $out_array_meta[$out_sheet]['title'] = $this->sL($parts[1]);
  515. // Only add the first tab to the dynNestedStack if there are more tabs:
  516. if ($tabIdentString && strpos($itemList, '--div--', strlen($fieldInfo))) {
  517. $this->pushToDynNestedStack('tab', $tabIdentStringMD5 . '-1');
  518. }
  519. }
  520. } elseif ($theField == '--palette--') {
  521. if ($parts[2] && !isset($this->palettesRendered[$this->renderDepth][$table][$parts[2]])) {
  522. // render a 'header' if not collapsed
  523. if ($TCA[$table]['palettes'][$parts[2]]['canNotCollapse'] AND $parts[1]) {
  524. $out_array[$out_sheet][$out_pointer] .= $this->getPaletteFields($table, $row, $parts[2], $this->sL($parts[1]));
  525. } else {
  526. $out_array[$out_sheet][$out_pointer] .= $this->getPaletteFields($table, $row, $parts[2], '', '', $this->sL($parts[1]));
  527. }
  528. $this->palettesRendered[$this->renderDepth][$table][$parts[2]] = 1;
  529. }
  530. }
  531. }
  532. $cc++;
  533. }
  534. }
  535. }
  536. }
  537. // Hook: getMainFields_postProcess (requested by Thomas Hempel for use with the "dynaflex" extension)
  538. foreach ($this->hookObjectsMainFields as $hookObj) {
  539. if (method_exists($hookObj, 'getMainFields_postProcess')) {
  540. $hookObj->getMainFields_postProcess($table, $row, $this);
  541. }
  542. }
  543. // Wrapping a border around it all:
  544. $this->wrapBorder($out_array[$out_sheet], $out_pointer);
  545. // Resetting styles:
  546. $this->resetSchemes();
  547. // Rendering Main palettes, if any
  548. $mParr = t3lib_div::trimExplode(',', $TCA[$table]['ctrl']['mainpalette']);
  549. $i = 0;
  550. if (count($mParr)) {
  551. foreach ($mParr as $mP) {
  552. if (!isset($this->palettesRendered[$this->renderDepth][$table][$mP])) {
  553. $temp_palettesCollapsed = $this->palettesCollapsed;
  554. $this->palettesCollapsed = 0;
  555. $label = ($i == 0 ? $this->getLL('l_generalOptions') : $this->getLL('l_generalOptions_more'));
  556. $out_array[$out_sheet][$out_pointer] .= $this->getPaletteFields($table, $row, $mP, $label);
  557. $this->palettesCollapsed = $temp_palettesCollapsed;
  558. $this->palettesRendered[$this->renderDepth][$table][$mP] = 1;
  559. }
  560. $this->wrapBorder($out_array[$out_sheet], $out_pointer);
  561. $i++;
  562. if ($this->renderDepth) {
  563. $this->renderDepth--;
  564. }
  565. }
  566. }
  567. // Return the imploded $out_array:
  568. if ($out_sheet > 0) { // There were --div-- dividers around...
  569. // Create parts array for the tab menu:
  570. $parts = array();
  571. foreach ($out_array as $idx => $sheetContent) {
  572. $content = implode('', $sheetContent);
  573. if ($content) {
  574. // Wrap content (row) with table-tag, otherwise tab/sheet will be disabled (see getdynTabMenu() )
  575. $content = '<table border="0" cellspacing="0" cellpadding="0" width="100%">' . $content . '</table>';
  576. }
  577. $parts[$idx] = array(
  578. 'label' => $out_array_meta[$idx]['title'],
  579. 'content' => $content,
  580. 'newline' => $out_array_meta[$idx]['newline'], // Newline for this tab/sheet
  581. );
  582. }
  583. if (count($parts) > 1) {
  584. // Unset the current level of tab menus:
  585. $this->popFromDynNestedStack('tab', $tabIdentStringMD5 . '-' . ($out_sheet + 1));
  586. $dividersToTabsBehaviour = (isset($TCA[$table]['ctrl']['dividers2tabs']) ? $TCA[$table]['ctrl']['dividers2tabs'] : 1);
  587. $output = $this->getDynTabMenu($parts, $tabIdentString, $dividersToTabsBehaviour);
  588. } else {
  589. // If there is only one tab/part there is no need to wrap it into the dynTab code
  590. $output = isset($parts[0]) ? trim($parts[0]['content']) : '';
  591. }
  592. $output = '
  593. <tr>
  594. <td colspan="2">
  595. ' . $output . '
  596. </td>
  597. </tr>';
  598. } else {
  599. // Only one, so just implode:
  600. $output = implode('', $out_array[$out_sheet]);
  601. }
  602. return $output;
  603. }
  604. /**
  605. * Will return the TCEform elements for a pre-defined list of fields.
  606. * 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.
  607. * Used for displaying forms for the frontend edit icons for instance.
  608. *
  609. * @param string The table name
  610. * @param array The record array.
  611. * @param string Commalist of fields from the table. These will be shown in the specified order in a form.
  612. * @return string TCEform elements in a string.
  613. */
  614. function getListedFields($table, $row, $list) {
  615. global $TCA;
  616. t3lib_div::loadTCA($table);
  617. if ($this->edit_showFieldHelp || $this->doLoadTableDescr($table)) {
  618. $GLOBALS['LANG']->loadSingleTableDescription($table);
  619. }
  620. $out = '';
  621. $types_fieldConfig = t3lib_BEfunc::getTCAtypes($table, $row, 1);
  622. $editFieldList = array_unique(t3lib_div::trimExplode(',', $list, 1));
  623. foreach ($editFieldList as $theFieldC) {
  624. list($theField, $palFields) = preg_split('/\[|\]/', $theFieldC);
  625. $theField = trim($theField);
  626. $palFields = trim($palFields);
  627. if ($TCA[$table]['columns'][$theField]) {
  628. $parts = t3lib_div::trimExplode(';', $types_fieldConfig[$theField]['origString']);
  629. $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.
  630. $out .= $sField;
  631. } elseif ($theField == '--div--') {
  632. $out .= $this->getDivider();
  633. }
  634. if ($palFields) {
  635. $out .= $this->getPaletteFields($table, $row, '', '', implode(',', t3lib_div::trimExplode('|', $palFields, 1)));
  636. }
  637. }
  638. return $out;
  639. }
  640. /**
  641. * Creates a palette (collection of secondary options).
  642. *
  643. * @param string The table name
  644. * @param array The row array
  645. * @param string The palette number/pointer
  646. * @param string Header string for the palette (used when in-form). If not set, no header item is made.
  647. * @param string Optional alternative list of fields for the palette
  648. * @param string Optional Link text for activating a palette (when palettes does not have another form element to belong to).
  649. * @return string HTML code.
  650. */
  651. function getPaletteFields($table, $row, $palette, $header = '', $itemList = '', $collapsedHeader = NULL) {
  652. if (!$this->doPrintPalette) {
  653. return '';
  654. }
  655. $out = '';
  656. $parts = $this->loadPaletteElements($table, $row, $palette, $itemList);
  657. // Put palette together if there are fields in it:
  658. if (count($parts)) {
  659. $realFields = 0;
  660. foreach ($parts as $part) {
  661. if ($part['NAME'] !== '--linebreak--') {
  662. $realFields++;
  663. }
  664. }
  665. if ($realFields > 0) {
  666. if ($header) {
  667. $out .= $this->intoTemplate(
  668. array('HEADER' => htmlspecialchars($header)),
  669. $this->palFieldTemplateHeader
  670. );
  671. }
  672. $collapsed = $this->isPalettesCollapsed($table, $palette);
  673. $thePalIcon = '';
  674. if ($collapsed && $collapsedHeader !== NULL) {
  675. list($thePalIcon,) = $this->wrapOpenPalette(
  676. t3lib_iconWorks::getSpriteIcon(
  677. 'actions-system-options-view',
  678. array('title' => htmlspecialchars($this->getLL('l_moreOptions')))
  679. ), $table, $row, $palette, 1);
  680. $thePalIcon = '<span style="margin-left: 20px;">' . $thePalIcon . $collapsedHeader . '</span>';
  681. }
  682. $paletteHtml = $this->wrapPaletteField($this->printPalette($parts), $table, $row, $palette, $collapsed);
  683. $out .= $this->intoTemplate(
  684. array('PALETTE' => $thePalIcon . $paletteHtml),
  685. $this->palFieldTemplate
  686. );
  687. }
  688. }
  689. return $out;
  690. }
  691. /**
  692. * Returns the form HTML code for a database table field.
  693. *
  694. * @param string The table name
  695. * @param string The field name
  696. * @param array The record to edit from the database table.
  697. * @param string Alternative field name label to show.
  698. * @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).
  699. * @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.
  700. * @param integer The palette pointer.
  701. * @return mixed String (normal) or array (palettes)
  702. */
  703. function getSingleField($table, $field, $row, $altName = '', $palette = 0, $extra = '', $pal = 0) {
  704. global $TCA, $BE_USER;
  705. // Hook: getSingleField_preProcess
  706. foreach ($this->hookObjectsSingleField as $hookObj) {
  707. if (method_exists($hookObj, 'getSingleField_preProcess')) {
  708. $hookObj->getSingleField_preProcess($table, $field, $row, $altName, $palette, $extra, $pal, $this);
  709. }
  710. }
  711. $out = '';
  712. $PA = array();
  713. $PA['altName'] = $altName;
  714. $PA['palette'] = $palette;
  715. $PA['extra'] = $extra;
  716. $PA['pal'] = $pal;
  717. // Make sure to load full $TCA array for the table:
  718. t3lib_div::loadTCA($table);
  719. // Get the TCA configuration for the current field:
  720. $PA['fieldConf'] = $TCA[$table]['columns'][$field];
  721. $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
  722. $skipThisField = $this->inline->skipField($table, $field, $row, $PA['fieldConf']['config']);
  723. // Now, check if this field is configured and editable (according to excludefields + other configuration)
  724. if (is_array($PA['fieldConf']) &&
  725. !$skipThisField &&
  726. (!$PA['fieldConf']['exclude'] || $BE_USER->check('non_exclude_fields', $table . ':' . $field)) &&
  727. $PA['fieldConf']['config']['form_type'] != 'passthrough' &&
  728. ($this->RTEenabled || !$PA['fieldConf']['config']['showIfRTE']) &&
  729. (!$PA['fieldConf']['displayCond'] || $this->isDisplayCondition($PA['fieldConf']['displayCond'], $row)) &&
  730. (!$TCA[$table]['ctrl']['languageField'] || $PA['fieldConf']['l10n_display'] || strcmp($PA['fieldConf']['l10n_mode'], 'exclude') || $row[$TCA[$table]['ctrl']['languageField']] <= 0) &&
  731. (!$TCA[$table]['ctrl']['languageField'] || !$this->localizationMode || $this->localizationMode === $PA['fieldConf']['l10n_cat'])
  732. ) {
  733. // Fetching the TSconfig for the current table/field. This includes the $row which means that
  734. $PA['fieldTSConfig'] = $this->setTSconfig($table, $row, $field);
  735. // If the field is NOT disabled from TSconfig (which it could have been) then render it
  736. if (!$PA['fieldTSConfig']['disabled']) {
  737. // Override fieldConf by fieldTSconfig:
  738. $PA['fieldConf']['config'] = $this->overrideFieldConf($PA['fieldConf']['config'], $PA['fieldTSConfig']);
  739. // Init variables:
  740. $PA['itemFormElName'] = $this->prependFormFieldNames . '[' . $table . '][' . $row['uid'] . '][' . $field . ']'; // Form field name
  741. $PA['itemFormElName_file'] = $this->prependFormFieldNames_file . '[' . $table . '][' . $row['uid'] . '][' . $field . ']'; // Form field name, in case of file uploads
  742. $PA['itemFormElValue'] = $row[$field]; // The value to show in the form field.
  743. $PA['itemFormElID'] = $this->prependFormFieldNames . '_' . $table . '_' . $row['uid'] . '_' . $field;
  744. // set field to read-only if configured for translated records to show default language content as readonly
  745. if ($PA['fieldConf']['l10n_display'] && t3lib_div::inList($PA['fieldConf']['l10n_display'], 'defaultAsReadonly') && $row[$TCA[$table]['ctrl']['languageField']] > 0) {
  746. $PA['fieldConf']['config']['readOnly'] = true;
  747. $PA['itemFormElValue'] = $this->defaultLanguageData[$table . ':' . $row['uid']][$field];
  748. }
  749. // 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"
  750. if (
  751. ($TCA[$table]['ctrl']['type'] && !strcmp($field, $TCA[$table]['ctrl']['type'])) ||
  752. ($TCA[$table]['ctrl']['requestUpdate'] && t3lib_div::inList($TCA[$table]['ctrl']['requestUpdate'], $field))) {
  753. if ($GLOBALS['BE_USER']->jsConfirmation(1)) {
  754. $alertMsgOnChange = 'if (confirm(TBE_EDITOR.labels.onChangeAlert) && TBE_EDITOR.checkSubmit(-1)){ TBE_EDITOR.submitForm() };';
  755. } else {
  756. $alertMsgOnChange = 'if (TBE_EDITOR.checkSubmit(-1)){ TBE_EDITOR.submitForm() };';
  757. }
  758. } else {
  759. $alertMsgOnChange = '';
  760. }
  761. // Render as a hidden field?
  762. if (in_array($field, $this->hiddenFieldListArr)) {
  763. $this->hiddenFieldAccum[] = '<input type="hidden" name="' . $PA['itemFormElName'] . '" value="' . htmlspecialchars($PA['itemFormElValue']) . '" />';
  764. } else { // Render as a normal field:
  765. // 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.
  766. if (!$PA['palette']) {
  767. $paletteFields = $this->loadPaletteElements($table, $row, $PA['pal']);
  768. if ($PA['pal'] && $this->isPalettesCollapsed($table, $PA['pal']) && count($paletteFields)) {
  769. list($thePalIcon, $palJSfunc) = $this->wrapOpenPalette(t3lib_iconWorks::getSpriteIcon('actions-system-options-view', array('title' => htmlspecialchars($this->getLL('l_moreOptions')))), $table, $row, $PA['pal'], 1);
  770. } else {
  771. $thePalIcon = '';
  772. $palJSfunc = '';
  773. }
  774. }
  775. // onFocus attribute to add to the field:
  776. $PA['onFocus'] = ($palJSfunc && !$BE_USER->uc['dontShowPalettesOnFocusInAB']) ? ' onfocus="' . htmlspecialchars($palJSfunc) . '"' : '';
  777. // Find item
  778. $item = '';
  779. $PA['label'] = ($PA['altName'] ? $PA['altName'] : $PA['fieldConf']['label']);
  780. $PA['label'] = ($PA['fieldTSConfig']['label'] ? $PA['fieldTSConfig']['label'] : $PA['label']);
  781. $PA['label'] = ($PA['fieldTSConfig']['label.'][$GLOBALS['LANG']->lang] ? $PA['fieldTSConfig']['label.'][$GLOBALS['LANG']->lang] : $PA['label']);
  782. $PA['label'] = $this->sL($PA['label']);
  783. // JavaScript code for event handlers:
  784. $PA['fieldChangeFunc'] = array();
  785. $PA['fieldChangeFunc']['TBE_EDITOR_fieldChanged'] = "TBE_EDITOR.fieldChanged('" . $table . "','" . $row['uid'] . "','" . $field . "','" . $PA['itemFormElName'] . "');";
  786. $PA['fieldChangeFunc']['alert'] = $alertMsgOnChange;
  787. // if this is the child of an inline type and it is the field creating the label
  788. if ($this->inline->isInlineChildAndLabelField($table, $field)) {
  789. $inlineObjectId = implode(
  790. t3lib_TCEforms_inline::Structure_Separator,
  791. array(
  792. $this->inline->inlineNames['object'],
  793. $table,
  794. $row['uid']
  795. )
  796. );
  797. $PA['fieldChangeFunc']['inline'] = "inline.handleChangedField('" . $PA['itemFormElName'] . "','" . $inlineObjectId . "');";
  798. }
  799. // Based on the type of the item, call a render function:
  800. $item = $this->getSingleField_SW($table, $field, $row, $PA);
  801. // Add language + diff
  802. if ($PA['fieldConf']['l10n_display'] && (t3lib_div::inList($PA['fieldConf']['l10n_display'], 'hideDiff') || t3lib_div::inList($PA['fieldConf']['l10n_display'], 'defaultAsReadonly'))) {
  803. $renderLanguageDiff = false;
  804. } else {
  805. $renderLanguageDiff = true;
  806. }
  807. if ($renderLanguageDiff) {
  808. $item = $this->renderDefaultLanguageContent($table, $field, $row, $item);
  809. $item = $this->renderDefaultLanguageDiff($table, $field, $row, $item);
  810. }
  811. // 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
  812. $label = t3lib_div::deHSCentities(htmlspecialchars($PA['label']));
  813. if (t3lib_div::testInt($row['uid']) && $PA['fieldTSConfig']['linkTitleToSelf'] && !t3lib_div::_GP('columnsOnly')) {
  814. $lTTS_url = $this->backPath . 'alt_doc.php?edit[' . $table . '][' . $row['uid'] . ']=edit&columnsOnly=' . $field . '&returnUrl=' . rawurlencode($this->thisReturnUrl());
  815. $label = '<a href="' . htmlspecialchars($lTTS_url) . '">' . $label . '</a>';
  816. }
  817. // wrap the label with help text
  818. $PA['label'] = $label = t3lib_BEfunc::wrapInHelp($table, $field, $label);
  819. // Create output value:
  820. if ($PA['fieldConf']['config']['form_type'] == 'user' && $PA['fieldConf']['config']['noTableWrapping']) {
  821. $out = $item;
  822. } elseif ($PA['palette']) {
  823. // Array:
  824. $out = array(
  825. 'NAME' => $label,
  826. 'ID' => $row['uid'],
  827. 'FIELD' => $field,
  828. 'TABLE' => $table,
  829. 'ITEM' => $item
  830. );
  831. $out = $this->addUserTemplateMarkers($out, $table, $field, $row, $PA);
  832. } else {
  833. // String:
  834. $out = array(
  835. 'NAME' => $label,
  836. 'ITEM' => $item,
  837. 'TABLE' => $table,
  838. 'ID' => $row['uid'],
  839. 'PAL_LINK_ICON' => $thePalIcon,
  840. 'FIELD' => $field
  841. );
  842. $out = $this->addUserTemplateMarkers($out, $table, $field, $row, $PA);
  843. // String:
  844. $out = $this->intoTemplate($out);
  845. }
  846. }
  847. } else {
  848. $this->commentMessages[] = $this->prependFormFieldNames . '[' . $table . '][' . $row['uid'] . '][' . $field . ']: Disabled by TSconfig';
  849. }
  850. }
  851. // Hook: getSingleField_postProcess
  852. foreach ($this->hookObjectsSingleField as $hookObj) {
  853. if (method_exists($hookObj, 'getSingleField_postProcess')) {
  854. $hookObj->getSingleField_postProcess($table, $field, $row, $out, $PA, $this);
  855. }
  856. }
  857. // Return value (string or array)
  858. return $out;
  859. }
  860. /**
  861. * Rendering a single item for the form
  862. *
  863. * @param string Table name of record
  864. * @param string Fieldname to render
  865. * @param array The record
  866. * @param array parameters array containing a lot of stuff. Value by Reference!
  867. * @return string Returns the item as HTML code to insert
  868. * @access private
  869. * @see getSingleField(), getSingleField_typeFlex_draw()
  870. */
  871. function getSingleField_SW($table, $field, $row, &$PA) {
  872. $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
  873. // Hook: getSingleField_beforeRender
  874. foreach ($this->hookObjectsSingleField as $hookObject) {
  875. if (method_exists($hookObject, 'getSingleField_beforeRender')) {
  876. $hookObject->getSingleField_beforeRender($table, $field, $row, $PA);
  877. }
  878. }
  879. switch ($PA['fieldConf']['config']['form_type']) {
  880. case 'input':
  881. $item = $this->getSingleField_typeInput($table, $field, $row, $PA);
  882. break;
  883. case 'text':
  884. $item = $this->getSingleField_typeText($table, $field, $row, $PA);
  885. break;
  886. case 'check':
  887. $item = $this->getSingleField_typeCheck($table, $field, $row, $PA);
  888. break;
  889. case 'radio':
  890. $item = $this->getSingleField_typeRadio($table, $field, $row, $PA);
  891. break;
  892. case 'select':
  893. $item = $this->getSingleField_typeSelect($table, $field, $row, $PA);
  894. break;
  895. case 'group':
  896. $item = $this->getSingleField_typeGroup($table, $field, $row, $PA);
  897. break;
  898. case 'inline':
  899. $item = $this->inline->getSingleField_typeInline($table, $field, $row, $PA);
  900. break;
  901. case 'none':
  902. $item = $this->getSingleField_typeNone($table, $field, $row, $PA);
  903. break;
  904. case 'user':
  905. $item = $this->getSingleField_typeUser($table, $field, $row, $PA);
  906. break;
  907. case 'flex':
  908. $item = $this->getSingleField_typeFlex($table, $field, $row, $PA);
  909. break;
  910. default:
  911. $item = $this->getSingleField_typeUnknown($table, $field, $row, $PA);
  912. break;
  913. }
  914. return $item;
  915. }
  916. /**********************************************************
  917. *
  918. * Rendering of each TCEform field type
  919. *
  920. ************************************************************/
  921. /**
  922. * Generation of TCEform elements of the type "input"
  923. * This will render a single-line input form field, possibly with various control/validation features
  924. *
  925. * @param string The table name of the record
  926. * @param string The field name which this element is supposed to edit
  927. * @param array The record data array where the value(s) for the field can be found
  928. * @param array An array with additional configuration options.
  929. * @return string The HTML code for the TCEform field
  930. */
  931. function getSingleField_typeInput($table, $field, $row, &$PA) {
  932. $config = $PA['fieldConf']['config'];
  933. $specConf = $this->getSpecConfFromString($PA['extra'], $PA['fieldConf']['defaultExtras']);
  934. $size = t3lib_div::intInRange($config['size'] ? $config['size'] : 30, 5, $this->maxInputWidth);
  935. $evalList = t3lib_div::trimExplode(',', $config['eval'], 1);
  936. $classAndStyleAttributes = $this->formWidthAsArray($size);
  937. $fieldAppendix = '';
  938. $cssClasses = array($classAndStyleAttributes['class']);
  939. $cssStyle = $classAndStyleAttributes['style'];
  940. if (!isset($config['checkbox'])) {
  941. $config['checkbox'] = '0';
  942. $checkboxIsset = FALSE;
  943. } else {
  944. $checkboxIsset = TRUE;
  945. }
  946. if (in_array('date', $evalList) || in_array('datetime', $evalList)) {
  947. if (in_array('datetime', $evalList)) {
  948. $class = 'datetime';
  949. } else {
  950. $class = 'date';
  951. }
  952. $dateRange = '';
  953. if (isset($config['range']['lower'])) {
  954. $dateRange .= ' lower-' . intval($config['range']['lower']);
  955. }
  956. if (isset($config['range']['upper'])) {
  957. $dateRange .= ' upper-' . intval($config['range']['upper']);
  958. }
  959. $inputId = uniqid('tceforms-' . $class . 'field-');
  960. $cssClasses[] = 'tceforms-textfield tceforms-' . $class . 'field' . $dateRange;
  961. $fieldAppendix = t3lib_iconWorks::getSpriteIcon(
  962. 'actions-edit-pick-date',
  963. array(
  964. 'style' => 'cursor:pointer;',
  965. 'id' => 'picker-' . $inputId
  966. )
  967. );
  968. } elseif (in_array('timesec', $evalList)) {
  969. $inputId = uniqid('tceforms-timesecfield-');
  970. $cssClasses[] = 'tceforms-textfield tceforms-timesecfield';
  971. } elseif (in_array('year', $evalList)) {
  972. $inputId = uniqid('tceforms-yearfield-');
  973. $cssClasses[] = 'tceforms-textfield tceforms-yearfield';
  974. } elseif (in_array('time', $evalList)) {
  975. $inputId = uniqid('tceforms-timefield-');
  976. $cssClasses[] = 'tceforms-textfield tceforms-timefield';
  977. } elseif (in_array('int', $evalLis

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