*/ /** * [CLASS/FUNCTION INDEX of SCRIPT] * * * * 196: class t3lib_TCEforms * 302: function t3lib_TCEforms() * 338: function initDefaultBEmode() * * SECTION: Rendering the forms, fields etc * 385: function getSoloField($table,$row,$theFieldToReturn) * 424: function getMainFields($table,$row,$depth=0) * 618: function getListedFields($table,$row,$list) * 660: function getPaletteFields($table,$row,$palette,$header='',$itemList='',$collapsedHeader='') * 737: function getSingleField($table,$field,$row,$altName='',$palette=0,$extra='',$pal=0) * 900: function getSingleField_SW($table,$field,$row,&$PA) * * SECTION: Rendering of each TCEform field type * 976: function getSingleField_typeInput($table,$field,$row,&$PA) * 1057: function getSingleField_typeText($table,$field,$row,&$PA) * 1178: function getSingleField_typeCheck($table,$field,$row,&$PA) * 1244: function getSingleField_typeRadio($table,$field,$row,&$PA) * 1279: function getSingleField_typeSelect($table,$field,$row,&$PA) * 1359: function getSingleField_typeSelect_single($table,$field,$row,&$PA,$config,$selItems,$nMV_label) * 1490: function getSingleField_typeSelect_checkbox($table,$field,$row,&$PA,$config,$selItems,$nMV_label) * 1609: function getSingleField_typeSelect_singlebox($table,$field,$row,&$PA,$config,$selItems,$nMV_label) * 1719: function getSingleField_typeSelect_multiple($table,$field,$row,&$PA,$config,$selItems,$nMV_label) * 1823: function getSingleField_typeGroup($table,$field,$row,&$PA) * 1992: function getSingleField_typeNone($table,$field,$row,&$PA) * 2008: function getSingleField_typeNone_render($config,$itemValue) * 2070: function getSingleField_typeFlex($table,$field,$row,&$PA) * 2205: function getSingleField_typeFlex_langMenu($languages,$elName,$selectedLanguage,$multi=1) * 2224: function getSingleField_typeFlex_sheetMenu($sArr,$elName,$sheetKey) * 2259: function getSingleField_typeFlex_draw($dataStruct,$editData,$cmdData,$table,$field,$row,&$PA,$formPrefix='',$level=0,$tRows=array()) * 2452: function getSingleField_typeUnknown($table,$field,$row,&$PA) * 2467: function getSingleField_typeUser($table,$field,$row,&$PA) * * SECTION: Field content processing * 2496: function formatValue ($config, $itemValue) * * SECTION: "Configuration" fetching/processing functions * 2588: function getRTypeNum($table,$row) * 2614: function rearrange($fields) * 2640: function getExcludeElements($table,$row,$typeNum) * 2688: function getFieldsToAdd($table,$row,$typeNum) * 2713: function mergeFieldsWithAddedFields($fields,$fieldsToAdd) * 2745: function setTSconfig($table,$row,$field='') * 2767: function getSpecConfForField($table,$row,$field) * 2788: function getSpecConfFromString($extraString, $defaultExtras) * * SECTION: Display of localized content etc. * 2816: function registerDefaultLanguageData($table,$rec) * 2848: function getLanguageOverlayRawValue($table, $row, $field, $fieldConf) * 2876: function renderDefaultLanguageContent($table,$field,$row,$item) * 2899: function renderDefaultLanguageDiff($table,$field,$row,$item) * * SECTION: Form element helper functions * 2955: function dbFileIcons($fName,$mode,$allowed,$itemArray,$selector='',$params=array(),$onFocus='') * 3108: function getClipboardElements($allowed,$mode) * 3157: function getClickMenu($str,$table,$uid='') * 3178: function renderWizards($itemKinds,$wizConf,$table,$row,$field,&$PA,$itemName,$specConf,$RTE=0) * 3382: function getIcon($icon) * 3409: function optionTagStyle($iconString) * 3425: function extractValuesOnlyFromValueLabelList($itemFormElValue) * 3447: function wrapOpenPalette($header,$table,$row,$palette,$retFunc=0) * 3471: function checkBoxParams($itemName,$thisValue,$c,$iCount,$addFunc='') * 3485: function elName($itemName) * 3496: function noTitle($str,$wrapParts=array()) * 3505: function blur() * 3514: function thisReturnUrl() * 3527: function getSingleHiddenField($table,$field,$row) * 3549: function formWidth($size=48,$textarea=0) * 3576: function formWidthText($size=48,$wrap='') * 3592: function formElStyle($type) * 3603: function formElClass($type) * 3614: function formElStyleClassValue($type, $class=FALSE) * 3638: function insertDefStyle($type) * 3657: function getDynTabMenu($parts, $idString) * * SECTION: Item-array manipulation functions (check/select/radio) * 3696: function initItemArray($fieldValue) * 3714: function addItems($items,$iArray) * 3736: function procItems($items,$iArray,$config,$table,$row,$field) * 3760: function addSelectOptionsToItemArray($items,$fieldValue,$TSconfig,$field) * 3980: function addSelectOptionsToItemArray_makeModuleData($value) * 4002: function foreignTable($items,$fieldValue,$TSconfig,$field,$pFFlag=0) * * SECTION: Template functions * 4083: function setNewBEDesign() * 4138: function intoTemplate($inArr,$altTemplate='') * 4162: function addUserTemplateMarkers($marker,$table,$field,$row,&$PA) * 4173: function wrapLabels($str) * 4186: function wrapTotal($c,$rec,$table) * 4199: function replaceTableWrap($arr,$rec,$table) * 4236: function wrapBorder(&$out_array,&$out_pointer) * 4258: function rplColorScheme($inTemplate) * 4278: function getDivider() * 4288: function printPalette($palArr) * 4339: function helpTextIcon($table,$field,$force=0) * 4359: function helpText($table,$field) * 4380: function setColorScheme($scheme) * 4404: function resetSchemes() * 4415: function storeSchemes() * 4427: function restoreSchemes() * * SECTION: JavaScript related functions * 4457: function JStop() * 4508: function JSbottom($formname='forms[0]') * 4835: function dbFileCon($formObj='document.forms[0]') * 5053: function printNeededJSFunctions() * 5080: function printNeededJSFunctions_top() * * SECTION: Various helper functions * 5128: function getDefaultRecord($table,$pid=0) * 5167: function getRecordPath($table,$rec) * 5181: function readPerms() * 5195: function sL($str) * 5208: function getLL($str) * 5229: function isPalettesCollapsed($table,$palette) * 5245: function isDisplayCondition($displayCond,$row,$ffValueKey='') * 5349: function getTSCpid($table,$uid,$pid) * 5363: function doLoadTableDescr($table) * 5375: function getAvailableLanguages($onlyIsoCoded=1,$setDefault=1) * * * 5417: class t3lib_TCEforms_FE extends t3lib_TCEforms * 5425: function wrapLabels($str) * 5435: function printPalette($palArr) * 5460: function setFancyDesign() * * TOTAL FUNCTIONS: 100 * (This index is automatically created/updated by the extension "extdeveval") * */ require_once(PATH_t3lib.'class.t3lib_diff.php'); require_once(PATH_t3lib.'class.t3lib_tceforms_inline.php'); /** * 'TCEforms' - Class for creating the backend editing forms. * * @author Kasper Skaarhoj * @coauthor Rene Fritz * @package TYPO3 * @subpackage t3lib */ class t3lib_TCEforms { // variables not commented yet.... (do so...) var $palFieldArr = array(); var $disableWizards = 0; var $isPalettedoc = 0; var $paletteMargin = 1; var $defStyle = ''; // 'font-family:Verdana;font-size:10px;'; var $cachedTSconfig = array(); var $cachedTSconfig_fieldLevel = array(); var $cachedLanguageFlag = array(); var $cachedAdditionalPreviewLanguages = NULL; var $transformedRow = array(); var $extJSCODE = ''; var $printNeededJS = array(); var $hiddenFieldAccum=array(); var $TBE_EDITOR_fieldChanged_func=''; var $loadMD5_JS=1; var $prevBorderStyle='[nothing here...]'; // Something unique... var $allowUpload=0; // If set direct upload fields will be shown var $titleLen=15; // @deprecated: $BE_USER->uc['titleLen'] but what is default?? var $defaultLanguageData = array(); // Array where records in the default language is stored. (processed by transferdata) var $defaultLanguageData_diff = array(); // Array where records in the default language is stored (raw without any processing. used for making diff) var $additionalPreviewLanguageData = array(); // EXTERNAL, static var $backPath=''; // Set this to the 'backPath' pointing back to the typo3 admin directory from the script where this form is displayed. var $returnUrl=''; // Alternative return URL path (default is t3lib_div::linkThisScript()) 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. 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. var $disableRTE=0; // If set, the RTE is disabled (from form display, eg. by checkbox in the bottom of the page!) var $globalShowHelp=1; // If false, then all CSH will be disabled, regardless of settings in $this->edit_showFieldHelp var $localizationMode=''; // If true, the forms are rendering only localization relevant fields of the records. 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. var $doPrintPalette=1; // If set to false, palettes will NEVER be rendered. /** * Set to initialized clipboard object; Then the element browser will offer a link to paste in records from clipboard. * * @var t3lib_clipboard */ var $clipObj=FALSE; var $enableClickMenu=FALSE; // Enable click menu on reference icons. var $enableTabMenu = FALSE; // Enable Tab Menus. If set to true, the JavaScript content from template::getDynTabMenuJScode() must be included in the document. var $renderReadonly = FALSE; // When enabled all fields are rendered non-editable. 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) var $form_largeComp = 1.33; // Form field width compensation: Compensation for large documents, doc-tab (editing) 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. var $maxTextareaWidth=48; // The maximum abstract value for textareas var $maxInputWidth=48; // The maximum abstract value for input fields var $defaultMultipleSelectorStyle='width:250px;'; // Default style for the selector boxes used for multiple items in "select" and "group" types. // INTERNAL, static var $prependFormFieldNames = 'data'; // The string to prepend formfield names with. var $prependCmdFieldNames = 'cmd'; // The string to prepend commands for tcemain::process_cmdmap with. var $prependFormFieldNames_file = 'data_files'; // The string to prepend FILE form field names with. var $formName = 'editform'; // The name attribute of the form. var $allowOverrideMatrix = array(); // Whitelist that allows TCA field configuration to be overridden by TSconfig, @see overrideFieldConf() // INTERNAL, dynamic var $perms_clause=''; // Set by readPerms() (caching) var $perms_clause_set=0; // Set by readPerms() (caching-flag) 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). var $docLarge=0; // If set, the forms will be rendered a little wider, more precisely with a factor of $this->form_largeComp. var $clientInfo=array(); // Loaded with info about the browser when class is instantiated. var $RTEenabled=0; // True, if RTE is possible for the current user (based on result from BE_USER->isRTE()) 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) var $RTEcounter = 0; // Counter that is incremented before an RTE is created. Can be used for unique ids etc. var $colorScheme; // Contains current color scheme var $classScheme; // Contains current class scheme var $defColorScheme; // Contains the default color scheme var $defClassScheme; // Contains the default class scheme var $fieldStyle; // Contains field style values var $borderStyle; // Contains border style values. var $commentMessages=array(); // An accumulation of messages from the class. // INTERNAL, templates var $totalWrap='
|
'; // Total wrapping for the table rows. var $fieldTemplate='###FIELD_NAME###
###FIELD_ITEM###
'; // Field template var $sectionWrap=''; // Wrapping template code for a section var $palFieldTemplateHeader=''; // Template for palette headers var $palFieldTemplate=''; // Template for palettes // INTERNAL, working memory var $excludeElements=''; // Set to the fields NOT to display, if any. 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) 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! 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. var $requiredElements=array(); // Used to register the min and max number of elements for selectorboxes where that apply (in the "group" type for instance) var $renderDepth=0; // Keeps track of the rendering depth of nested records. var $savedSchemes=array(); // Color scheme buffer. var $dynNestedStack = array(); // holds the path an element is nested in (e.g. required for RTEhtmlarea) // Internal, registers for user defined functions etc. var $additionalCode_pre = array(); // Additional HTML code, printed before the form. var $additionalJS_pre = array(); // Additional JavaScript, printed before the form var $additionalJS_post = array(); // Additional JavaScript printed after the form 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. /** * Instance of t3lib_tceforms_inline * * @var t3lib_TCEforms_inline */ var $inline; var $hookObjectsMainFields = array(); // Array containing hook class instances called once for a form var $hookObjectsSingleField = array(); // Array containing hook class instances called for each field var $extraFormHeaders = array(); // Rows gettings inserted into the alt_doc headers (when called from alt_doc.php) /** * Constructor function, setting internal variables, loading the styles used. * * @return void */ function t3lib_TCEforms() { global $CLIENT, $TYPO3_CONF_VARS; $this->clientInfo = t3lib_div::clientInfo(); $this->RTEenabled = $GLOBALS['BE_USER']->isRTE(); if (!$this->RTEenabled) { $this->RTEenabled_notReasons = implode(chr(10),$GLOBALS['BE_USER']->RTE_errors); $this->commentMessages[] = 'RTE NOT ENABLED IN SYSTEM due to:'.chr(10).$this->RTEenabled_notReasons; } // Default color+class scheme $this->defColorScheme = array( $GLOBALS['SOBE']->doc->bgColor, // Background for the field AND palette t3lib_div::modifyHTMLColorAll($GLOBALS['SOBE']->doc->bgColor,-20), // Background for the field header t3lib_div::modifyHTMLColorAll($GLOBALS['SOBE']->doc->bgColor,-10), // Background for the palette field header 'black', // Field header font color '#666666' // Palette field header font color ); $this->defColorScheme = array(); // Override / Setting defaults from TBE_STYLES array $this->resetSchemes(); // Setting the current colorScheme to default. $this->defColorScheme = $this->colorScheme; $this->defClassScheme = $this->classScheme; // Define whitelist that allows TCA field configuration to be overridden by TSconfig, @see overrideFieldConf(): $this->allowOverrideMatrix = array( 'input' => array('size', 'max'), 'text' => array('cols', 'rows', 'wrap'), 'check' => array('cols', 'showIfRTE'), 'select' => array('size', 'autoSizeMax', 'maxitems', 'minitems'), 'group' => array('size', 'autoSizeMax', 'max_size', 'show_thumbs', 'maxitems', 'minitems'), 'inline' => array('appearance', 'foreign_label', 'foreign_selector', 'foreign_unique', 'maxitems', 'minitems', 'size', 'autoSizeMax', 'symmetric_label'), ); $this->inline = t3lib_div::makeInstance('t3lib_TCEforms_inline'); // Prepare user defined objects (if any) for hooks which extend this function: $this->hookObjectsMainFields = array(); if (is_array ($TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_tceforms.php']['getMainFieldsClass'])) { foreach ($TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_tceforms.php']['getMainFieldsClass'] as $classRef) { $this->hookObjectsMainFields[] = &t3lib_div::getUserObj($classRef); } } $this->hookObjectsSingleField = array(); if (is_array ($TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_tceforms.php']['getSingleFieldClass'])) { foreach ($TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_tceforms.php']['getSingleFieldClass'] as $classRef) { $this->hookObjectsSingleField[] = &t3lib_div::getUserObj($classRef); } } } /** * Initialize various internal variables. * * @return void */ function initDefaultBEmode() { global $BE_USER; $this->prependFormFieldNames = 'data'; $this->formName = 'editform'; $this->setNewBEDesign(); $this->docLarge = $BE_USER->uc['edit_wideDocument'] ? 1 : 0; $this->edit_showFieldHelp = $BE_USER->uc['edit_showFieldHelp']; $this->edit_docModuleUpload = $BE_USER->uc['edit_docModuleUpload']; $this->titleLen = $BE_USER->uc['titleLen']; // @deprecated $this->inline->init($this); } /******************************************************* * * Rendering the forms, fields etc * *******************************************************/ /** * Will return the TCEform element for just a single field from a record. * The field must be listed in the currently displayed fields (as found in [types][showitem]) for the record. * This also means that the $table/$row supplied must be complete so the list of fields to show can be found correctly * * @param string The table name * @param array The record from the table for which to render a field. * @param string The field name to return the TCEform element for. * @return string HTML output * @see getMainFields() */ function getSoloField($table,$row,$theFieldToReturn) { global $TCA; if ($TCA[$table]) { t3lib_div::loadTCA($table); $typeNum = $this->getRTypeNum($table,$row); if ($TCA[$table]['types'][$typeNum]) { $itemList = $TCA[$table]['types'][$typeNum]['showitem']; if ($itemList) { $fields = t3lib_div::trimExplode(',',$itemList,1); $excludeElements = $this->excludeElements = $this->getExcludeElements($table,$row,$typeNum); reset($fields); while(list(,$fieldInfo)=each($fields)) { $parts = explode(';',$fieldInfo); $theField = trim($parts[0]); if (!in_array($theField,$excludeElements) && !strcmp($theField,$theFieldToReturn)) { if ($TCA[$table]['columns'][$theField]) { $sField = $this->getSingleField($table,$theField,$row,$parts[1],1,$parts[3],$parts[2]); return $sField['ITEM']; } } } } } } } /** * Based on the $table and $row of content, this displays the complete TCEform for the record. * 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. * * @param string The table name * @param array The record from the table for which to render a field. * @param integer Depth level * @return string HTML output * @see getSoloField() */ function getMainFields($table,$row,$depth=0) { global $TCA, $TYPO3_CONF_VARS; $this->renderDepth=$depth; // Init vars: $out_array = array(array()); $out_array_meta = array(array( 'title' => $this->getLL('l_generalTab') )); $out_pointer=0; $out_sheet=0; $this->palettesRendered=array(); $this->palettesRendered[$this->renderDepth][$table]=array(); // Hook: getMainFields_preProcess (requested by Thomas Hempel for use with the "dynaflex" extension) foreach ($this->hookObjectsMainFields as $hookObj) { if (method_exists($hookObj,'getMainFields_preProcess')) { $hookObj->getMainFields_preProcess($table,$row,$this); } } if ($TCA[$table]) { // Load the full TCA for the table. t3lib_div::loadTCA($table); // Load the description content for the table. if ($this->edit_showFieldHelp || $this->doLoadTableDescr($table)) { $GLOBALS['LANG']->loadSingleTableDescription($table); } // Get the current "type" value for the record. $typeNum = $this->getRTypeNum($table,$row); // Find the list of fields to display: if ($TCA[$table]['types'][$typeNum]) { $itemList = $TCA[$table]['types'][$typeNum]['showitem']; if ($itemList) { // If such a list existed... // Explode the field list and possibly rearrange the order of the fields, if configured for $fields = t3lib_div::trimExplode(',',$itemList,1); if ($this->fieldOrder) { $fields = $this->rearrange($fields); } // Get excluded fields, added fiels and put it together: $excludeElements = $this->excludeElements = $this->getExcludeElements($table,$row,$typeNum); $fields = $this->mergeFieldsWithAddedFields($fields,$this->getFieldsToAdd($table,$row,$typeNum)); // If TCEforms will render a tab menu in the next step, push the name to the tab stack: if (strstr($itemList, '--div--') !== false && $this->enableTabMenu && $TCA[$table]['ctrl']['dividers2tabs']) { $tabIdentString = 'TCEforms:'.$table.':'.$row['uid']; $tabIdentStringMD5 = $GLOBALS['TBE_TEMPLATE']->getDynTabMenuId('TCEforms:'.$table.':'.$row['uid']); // Remember that were currently working on the general tab: if (isset($fields[0]) && strpos($fields[0], '--div--') !== 0) { $this->pushToDynNestedStack('tab', $tabIdentStringMD5.'-1'); } } // Traverse the fields to render: $cc=0; foreach($fields as $fieldInfo) { // Exploding subparts of the field configuration: $parts = explode(';',$fieldInfo); // Getting the style information out: $color_style_parts = t3lib_div::trimExplode('-',$parts[4]); if (strcmp($color_style_parts[0],'')) { $this->setColorScheme($GLOBALS['TBE_STYLES']['colorschemes'][intval($color_style_parts[0])]); } if (strcmp($color_style_parts[1],'')) { $this->fieldStyle = $GLOBALS['TBE_STYLES']['styleschemes'][intval($color_style_parts[1])]; if (!isset($this->fieldStyle)) $this->fieldStyle = $GLOBALS['TBE_STYLES']['styleschemes'][0]; } if (strcmp($color_style_parts[2],'')) { $this->wrapBorder($out_array[$out_sheet],$out_pointer); $this->borderStyle = $GLOBALS['TBE_STYLES']['borderschemes'][intval($color_style_parts[2])]; if (!isset($this->borderStyle)) $this->borderStyle = $GLOBALS['TBE_STYLES']['borderschemes'][0]; } // Render the field: $theField = $parts[0]; if (!in_array($theField,$excludeElements)) { if ($TCA[$table]['columns'][$theField]) { $sFieldPal=''; if ($parts[2] && !isset($this->palettesRendered[$this->renderDepth][$table][$parts[2]])) { $sFieldPal=$this->getPaletteFields($table,$row,$parts[2]); $this->palettesRendered[$this->renderDepth][$table][$parts[2]] = 1; } $sField = $this->getSingleField($table,$theField,$row,$parts[1],0,$parts[3],$parts[2]); if ($sField) { $sField.= $sFieldPal; } $out_array[$out_sheet][$out_pointer].= $sField; } elseif ($theField=='--div--') { if ($cc>0) { $out_array[$out_sheet][$out_pointer].=$this->getDivider(); if ($this->enableTabMenu && $TCA[$table]['ctrl']['dividers2tabs']) { $this->wrapBorder($out_array[$out_sheet],$out_pointer); // Remove last tab entry from the dynNestedStack: $out_sheet++; // Remove the previous sheet from stack (if any): $this->popFromDynNestedStack('tab', $tabIdentStringMD5.'-'.($out_sheet)); // Remember on which sheet we're currently working: $this->pushToDynNestedStack('tab', $tabIdentStringMD5.'-'.($out_sheet+1)); $out_array[$out_sheet] = array(); $out_array_meta[$out_sheet]['title'] = $this->sL($parts[1]); } } else { // Setting alternative title for "General" tab if "--div--" is the very first element. $out_array_meta[$out_sheet]['title'] = $this->sL($parts[1]); // Only add the first tab to the dynNestedStack if there are more tabs: if (strpos($itemList, '--div--', strlen($fieldInfo))) { $this->pushToDynNestedStack('tab', $tabIdentStringMD5.'-1'); } } } elseif($theField=='--palette--') { if ($parts[2] && !isset($this->palettesRendered[$this->renderDepth][$table][$parts[2]])) { // render a 'header' if not collapsed if ($TCA[$table]['palettes'][$parts[2]]['canNotCollapse'] AND $parts[1]) { $out_array[$out_sheet][$out_pointer].=$this->getPaletteFields($table,$row,$parts[2],$this->sL($parts[1])); } else { $out_array[$out_sheet][$out_pointer].=$this->getPaletteFields($table,$row,$parts[2],'','',$this->sL($parts[1])); } $this->palettesRendered[$this->renderDepth][$table][$parts[2]] = 1; } } } $cc++; } } } } // Hook: getMainFields_postProcess (requested by Thomas Hempel for use with the "dynaflex" extension) foreach ($this->hookObjectsMainFields as $hookObj) { if (method_exists($hookObj,'getMainFields_postProcess')) { $hookObj->getMainFields_postProcess($table,$row,$this); } } // Wrapping a border around it all: $this->wrapBorder($out_array[$out_sheet],$out_pointer); // Resetting styles: $this->resetSchemes(); // Rendering Main palettes, if any $mParr = t3lib_div::trimExplode(',',$TCA[$table]['ctrl']['mainpalette']); $i = 0; if (count($mParr)) { foreach ($mParr as $mP) { if (!isset($this->palettesRendered[$this->renderDepth][$table][$mP])) { $temp_palettesCollapsed=$this->palettesCollapsed; $this->palettesCollapsed=0; $label = ($i==0?$this->getLL('l_generalOptions'):$this->getLL('l_generalOptions_more')); $out_array[$out_sheet][$out_pointer].=$this->getPaletteFields($table,$row,$mP,$label); $this->palettesCollapsed=$temp_palettesCollapsed; $this->palettesRendered[$this->renderDepth][$table][$mP] = 1; } $this->wrapBorder($out_array[$out_sheet],$out_pointer); $i++; if ($this->renderDepth) { $this->renderDepth--; } } } // Return the imploded $out_array: if ($out_sheet>0) { // There were --div-- dividers around... // Create parts array for the tab menu: $parts = array(); foreach ($out_array as $idx => $sheetContent) { $resstr = implode('', $sheetContent); if ($resstr) { $parts[$idx] = array( 'label' => $out_array_meta[$idx]['title'], 'content' => ''. $resstr. '
' ); } } if (count($parts) > 1) { // Unset the current level of tab menus: $this->popFromDynNestedStack('tab', $tabIdentStringMD5.'-'.($out_sheet+1)); $output = $this->getDynTabMenu($parts, $tabIdentString); } else { // If there is only one tab/part there is no need to wrap it into the dynTab code $output = isset($parts[0]) ? trim($parts[0]['content']) : ''; } $output = ' '.$output.' '; } else { // Only one, so just implode: $output = implode('',$out_array[$out_sheet]); } return $output; } /** * Will return the TCEform elements for a pre-defined list of fields. * 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. * Used for displaying forms for the frontend edit icons for instance. * * @param string The table name * @param array The record array. * @param string Commalist of fields from the table. These will be shown in the specified order in a form. * @return string TCEform elements in a string. */ function getListedFields($table,$row,$list) { global $TCA; t3lib_div::loadTCA($table); if ($this->edit_showFieldHelp || $this->doLoadTableDescr($table)) { $GLOBALS['LANG']->loadSingleTableDescription($table); } $out = ''; $types_fieldConfig = t3lib_BEfunc::getTCAtypes($table,$row,1); $editFieldList=array_unique(t3lib_div::trimExplode(',',$list,1)); foreach($editFieldList as $theFieldC) { list($theField,$palFields) = split('\[|\]',$theFieldC); $theField = trim($theField); $palFields = trim($palFields); if ($TCA[$table]['columns'][$theField]) { $parts = t3lib_div::trimExplode(';',$types_fieldConfig[$theField]['origString']); $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. $out.= $sField; } elseif($theField=='--div--') { $out.= $this->getDivider(); } if ($palFields) { $out.= $this->getPaletteFields($table,$row,'','',implode(',',t3lib_div::trimExplode('|',$palFields,1))); } } return $out; } /** * Creates a palette (collection of secondary options). * * @param string The table name * @param array The row array * @param string The palette number/pointer * @param string Header string for the palette (used when in-form). If not set, no header item is made. * @param string Optional alternative list of fields for the palette * @param string Optional Link text for activating a palette (when palettes does not have another form element to belong to). * @return string HTML code. */ function getPaletteFields($table,$row,$palette,$header='',$itemList='',$collapsedHeader='') { global $TCA; if (!$this->doPrintPalette) return ''; $out=''; $palParts = array(); t3lib_div::loadTCA($table); // Getting excludeElements, if any. if (!is_array($this->excludeElements)) { $this->excludeElements = $this->getExcludeElements($table,$row,$this->getRTypeNum($table,$row)); } // Render the palette TCEform elements. if ($TCA[$table] && (is_array($TCA[$table]['palettes'][$palette]) || $itemList)) { $itemList = $itemList?$itemList:$TCA[$table]['palettes'][$palette]['showitem']; if ($itemList) { $fields = t3lib_div::trimExplode(',',$itemList,1); reset($fields); while(list(,$fieldInfo)=each($fields)) { $parts = t3lib_div::trimExplode(';',$fieldInfo); $theField = $parts[0]; if (!in_array($theField,$this->excludeElements) && $TCA[$table]['columns'][$theField]) { $this->palFieldArr[$palette][] = $theField; $part = $this->getSingleField($table,$theField,$row,$parts[1],1,'',$parts[2]); if (is_array($part)) { $palParts[] = $part; } } } } } // Put palette together if there are fields in it: if (count($palParts)) { if ($header) { $out.= $this->intoTemplate(array( 'HEADER' => htmlspecialchars($header) ), $this->palFieldTemplateHeader ); } $collapsed = $this->isPalettesCollapsed($table,$palette); $out.= $this->intoTemplate(array( 'PALETTE' => $this->wrapPaletteField($this->printPalette($palParts), $table, $row ,$palette, $collapsed) ), $this->palFieldTemplate ); } return $out; } /** * Returns the form HTML code for a database table field. * * @param string The table name * @param string The field name * @param array The record to edit from the database table. * @param string Alternative field name label to show. * @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). * @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. * @param integer The palette pointer. * @return mixed String (normal) or array (palettes) */ function getSingleField($table,$field,$row,$altName='',$palette=0,$extra='',$pal=0) { global $TCA,$BE_USER; // Hook: getSingleField_preProcess foreach ($this->hookObjectsSingleField as $hookObj) { if (method_exists($hookObj,'getSingleField_preProcess')) { $hookObj->getSingleField_preProcess($table, $field, $row, $altName, $palette, $extra, $pal, $this); } } $out = ''; $PA = array(); $PA['altName'] = $altName; $PA['palette'] = $palette; $PA['extra'] = $extra; $PA['pal'] = $pal; // Make sure to load full $TCA array for the table: t3lib_div::loadTCA($table); // Get the TCA configuration for the current field: $PA['fieldConf'] = $TCA[$table]['columns'][$field]; $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 $skipThisField = $this->inline->skipField($table, $field, $row, $PA['fieldConf']['config']); // Now, check if this field is configured and editable (according to excludefields + other configuration) if ( is_array($PA['fieldConf']) && !$skipThisField && (!$PA['fieldConf']['exclude'] || $BE_USER->check('non_exclude_fields',$table.':'.$field)) && $PA['fieldConf']['config']['form_type']!='passthrough' && ($this->RTEenabled || !$PA['fieldConf']['config']['showIfRTE']) && (!$PA['fieldConf']['displayCond'] || $this->isDisplayCondition($PA['fieldConf']['displayCond'],$row)) && (!$TCA[$table]['ctrl']['languageField'] || $PA['fieldConf']['l10n_display'] || strcmp($PA['fieldConf']['l10n_mode'],'exclude') || $row[$TCA[$table]['ctrl']['languageField']]<=0) && (!$TCA[$table]['ctrl']['languageField'] || !$this->localizationMode || $this->localizationMode===$PA['fieldConf']['l10n_cat']) ) { // Fetching the TSconfig for the current table/field. This includes the $row which means that $PA['fieldTSConfig'] = $this->setTSconfig($table,$row,$field); // If the field is NOT disabled from TSconfig (which it could have been) then render it if (!$PA['fieldTSConfig']['disabled']) { // Override fieldConf by fieldTSconfig: $PA['fieldConf']['config'] = $this->overrideFieldConf($PA['fieldConf']['config'], $PA['fieldTSConfig']); // Init variables: $PA['itemFormElName']=$this->prependFormFieldNames.'['.$table.']['.$row['uid'].']['.$field.']'; // Form field name $PA['itemFormElName_file']=$this->prependFormFieldNames_file.'['.$table.']['.$row['uid'].']['.$field.']'; // Form field name, in case of file uploads $PA['itemFormElValue']=$row[$field]; // The value to show in the form field. $PA['itemFormElID']=$this->prependFormFieldNames.'_'.$table.'_'.$row['uid'].'_'.$field; // set field to read-only if configured for translated records to show default language content as readonly if ($PA['fieldConf']['l10n_display'] AND t3lib_div::inList($PA['fieldConf']['l10n_display'], 'defaultAsReadonly') AND $row[$TCA[$table]['ctrl']['languageField']]) { $PA['fieldConf']['config']['readOnly'] = true; $PA['itemFormElValue'] = $this->defaultLanguageData[$table.':'.$row['uid']][$field]; } // 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" if ( ($TCA[$table]['ctrl']['type'] && !strcmp($field,$TCA[$table]['ctrl']['type'])) || ($TCA[$table]['ctrl']['requestUpdate'] && t3lib_div::inList($TCA[$table]['ctrl']['requestUpdate'],$field))) { if($GLOBALS['BE_USER']->jsConfirmation(1)) { $alertMsgOnChange = 'if (confirm(TBE_EDITOR.labels.onChangeAlert) && TBE_EDITOR.checkSubmit(-1)){ TBE_EDITOR.submitForm() };'; } else { $alertMsgOnChange = 'if (TBE_EDITOR.checkSubmit(-1)){ TBE_EDITOR.submitForm() };'; } } else { $alertMsgOnChange = ''; } // Render as a hidden field? if (in_array($field,$this->hiddenFieldListArr)) { $this->hiddenFieldAccum[]=''; } else { // Render as a normal field: // 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. if (!$PA['palette']) { if ($PA['pal'] && $this->isPalettesCollapsed($table,$PA['pal'])) { list($thePalIcon,$palJSfunc) = $this->wrapOpenPalette('backPath,'gfx/options.gif','width="18" height="16"').' border="0" title="'.htmlspecialchars($this->getLL('l_moreOptions')).'" alt="" />',$table,$row,$PA['pal'],1); } else { $thePalIcon = ''; $palJSfunc = ''; } } // onFocus attribute to add to the field: $PA['onFocus'] = ($palJSfunc && !$BE_USER->uc['dontShowPalettesOnFocusInAB']) ? ' onfocus="'.htmlspecialchars($palJSfunc).'"' : ''; // Find item $item=''; $PA['label'] = $PA['altName'] ? $PA['altName'] : $PA['fieldConf']['label']; $PA['label'] = $this->sL($PA['label']); // JavaScript code for event handlers: $PA['fieldChangeFunc']=array(); $PA['fieldChangeFunc']['TBE_EDITOR_fieldChanged'] = "TBE_EDITOR.fieldChanged('".$table."','".$row['uid']."','".$field."','".$PA['itemFormElName']."');"; $PA['fieldChangeFunc']['alert']=$alertMsgOnChange; // if this is the child of an inline type and it is the field creating the label if ($this->inline->isInlineChildAndLabelField($table, $field)) { $PA['fieldChangeFunc']['inline'] = "inline.handleChangedField('".$PA['itemFormElName']."','".$this->inline->inlineNames['object']."[$table][".$row['uid']."]');"; } // Based on the type of the item, call a render function: $item = $this->getSingleField_SW($table,$field,$row,$PA); // Add language + diff if ($PA['fieldConf']['l10n_display'] && (t3lib_div::inList($PA['fieldConf']['l10n_display'], 'hideDiff') || t3lib_div::inList($PA['fieldConf']['l10n_display'], 'defaultAsReadonly'))) { $renderLanguageDiff = false; } else { $renderLanguageDiff = true; } if ($renderLanguageDiff) { $item = $this->renderDefaultLanguageContent($table,$field,$row,$item); $item = $this->renderDefaultLanguageDiff($table,$field,$row,$item); } // 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 $PA['label'] = t3lib_div::deHSCentities(htmlspecialchars($PA['label'])); if (t3lib_div::testInt($row['uid']) && $PA['fieldTSConfig']['linkTitleToSelf'] && !t3lib_div::_GP('columnsOnly')) { $lTTS_url = $this->backPath.'alt_doc.php?edit['.$table.']['.$row['uid'].']=edit&columnsOnly='.$field.'&returnUrl='.rawurlencode($this->thisReturnUrl()); $PA['label'] = ''.$PA['label'].''; } // Create output value: if ($PA['fieldConf']['config']['form_type']=='user' && $PA['fieldConf']['config']['noTableWrapping']) { $out = $item; } elseif ($PA['palette']) { // Array: $out=array( 'NAME'=>$PA['label'], 'ID'=>$row['uid'], 'FIELD'=>$field, 'TABLE'=>$table, 'ITEM'=>$item, 'HELP_ICON' => $this->helpTextIcon($table,$field,1) ); $out = $this->addUserTemplateMarkers($out,$table,$field,$row,$PA); } else { // String: $out=array( 'NAME'=>$PA['label'], 'ITEM'=>$item, 'TABLE'=>$table, 'ID'=>$row['uid'], 'HELP_ICON'=>$this->helpTextIcon($table,$field), 'HELP_TEXT'=>$this->helpText($table,$field), 'PAL_LINK_ICON'=>$thePalIcon, 'FIELD'=>$field ); $out = $this->addUserTemplateMarkers($out,$table,$field,$row,$PA); // String: $out=$this->intoTemplate($out); } } } else $this->commentMessages[]=$this->prependFormFieldNames.'['.$table.']['.$row['uid'].']['.$field.']: Disabled by TSconfig'; } // Hook: getSingleField_postProcess foreach ($this->hookObjectsSingleField as $hookObj) { if (method_exists($hookObj,'getSingleField_postProcess')) { $hookObj->getSingleField_postProcess($table, $field, $row, $out, $PA, $this); } } // Return value (string or array) return $out; } /** * Rendering a single item for the form * * @param string Table name of record * @param string Fieldname to render * @param array The record * @param array parameters array containing a lot of stuff. Value by Reference! * @return string Returns the item as HTML code to insert * @access private * @see getSingleField(), getSingleField_typeFlex_draw() */ function getSingleField_SW($table,$field,$row,&$PA) { $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 switch($PA['fieldConf']['config']['form_type']) { case 'input': $item = $this->getSingleField_typeInput($table,$field,$row,$PA); break; case 'text': $item = $this->getSingleField_typeText($table,$field,$row,$PA); break; case 'check': $item = $this->getSingleField_typeCheck($table,$field,$row,$PA); break; case 'radio': $item = $this->getSingleField_typeRadio($table,$field,$row,$PA); break; case 'select': $item = $this->getSingleField_typeSelect($table,$field,$row,$PA); break; case 'group': $item = $this->getSingleField_typeGroup($table,$field,$row,$PA); break; case 'inline': $item = $this->inline->getSingleField_typeInline($table,$field,$row,$PA); break; case 'none': $item = $this->getSingleField_typeNone($table,$field,$row,$PA); break; case 'user': $item = $this->getSingleField_typeUser($table,$field,$row,$PA); break; case 'flex': $item = $this->getSingleField_typeFlex($table,$field,$row,$PA); break; default: $item = $this->getSingleField_typeUnknown($table,$field,$row,$PA); break; } return $item; } /********************************************************** * * Rendering of each TCEform field type * ************************************************************/ /** * Generation of TCEform elements of the type "input" * This will render a single-line input form field, possibly with various control/validation features * * @param string The table name of the record * @param string The field name which this element is supposed to edit * @param array The record data array where the value(s) for the field can be found * @param array An array with additional configuration options. * @return string The HTML code for the TCEform field */ function getSingleField_typeInput($table,$field,$row,&$PA) { // typo3FormFieldSet(theField, evallist, is_in, checkbox, checkboxValue) // typo3FormFieldGet(theField, evallist, is_in, checkbox, checkboxValue, checkbox_off) $config = $PA['fieldConf']['config']; # $specConf = $this->getSpecConfForField($table,$row,$field); $specConf = $this->getSpecConfFromString($PA['extra'], $PA['fieldConf']['defaultExtras']); $size = t3lib_div::intInRange($config['size']?$config['size']:30,5,$this->maxInputWidth); $evalList = t3lib_div::trimExplode(',',$config['eval'],1); if($this->renderReadonly || $config['readOnly']) { $itemFormElValue = $PA['itemFormElValue']; if (in_array('date',$evalList)) { $config['format'] = 'date'; } elseif (in_array('date',$evalList)) { $config['format'] = 'date'; } elseif (in_array('datetime',$evalList)) { $config['format'] = 'datetime'; } elseif (in_array('time',$evalList)) { $config['format'] = 'time'; } if (in_array('password',$evalList)) { $itemFormElValue = $itemFormElValue ? '*********' : ''; } return $this->getSingleField_typeNone_render($config, $itemFormElValue); } foreach ($evalList as $func) { switch ($func) { case 'required': $this->requiredFields[$table.'_'.$row['uid'].'_'.$field]=$PA['itemFormElName']; break; default: if (substr($func, 0, 3) == 'tx_') { // Pair hook to the one in t3lib_TCEmain::checkValue_input_Eval() $evalObj = t3lib_div::getUserObj($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tce']['formevals'][$func].':&'.$func); if (is_object($evalObj) && method_exists($evalObj, 'deevaluateFieldValue')) { $_params = array( 'value' => $PA['itemFormElValue'] ); $PA['itemFormElValue'] = $evalObj->deevaluateFieldValue($_params); } } break; } } $paramsList = "'".$PA['itemFormElName']."','".implode(',',$evalList)."','".trim($config['is_in'])."',".(isset($config['checkbox'])?1:0).",'".$config['checkbox']."'"; if (isset($config['checkbox'])) { // Setting default "click-checkbox" values for eval types "date" and "datetime": $thisMidnight = mktime(0,0,0); $checkSetValue = in_array('date',$evalList) ? $thisMidnight : ''; $checkSetValue = in_array('datetime',$evalList) ? time() : $checkSetValue; $cOnClick = 'typo3form.fieldGet('.$paramsList.',1,\''.$checkSetValue.'\');'.implode('',$PA['fieldChangeFunc']); $item.='insertDefStyle('check').' name="'.$PA['itemFormElName'].'_cb" onclick="'.htmlspecialchars($cOnClick).'" />'; } $PA['fieldChangeFunc'] = array_merge(array('typo3form.fieldGet'=>'typo3form.fieldGet('.$paramsList.');'), $PA['fieldChangeFunc']); $mLgd = ($config['max']?$config['max']:256); $iOnChange = implode('',$PA['fieldChangeFunc']); $item.='formWidth($size).' maxlength="'.$mLgd.'" onchange="'.htmlspecialchars($iOnChange).'"'.$PA['onFocus'].' />'; // This is the EDITABLE form field. $item.=''; // This is the ACTUAL form field - values from the EDITABLE field must be transferred to this field which is the one that is written to the database. $this->extJSCODE.='typo3form.fieldSet('.$paramsList.');'; // going through all custom evaluations configured for this field foreach ($evalList as $evalData) { if (substr($evalData, 0, 3) == 'tx_') { $evalObj = t3lib_div::getUserObj($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tce']['formevals'][$evalData].':&'.$evalData); if(is_object($evalObj) && method_exists($evalObj, 'returnFieldJS')) { $this->extJSCODE .= "\n\nfunction ".$evalData."(value) {\n".$evalObj->returnFieldJS()."\n}\n"; } } } // Creating an alternative item without the JavaScript handlers. $altItem = ''; $altItem.= ''; // Wrap a wizard around the item? $item= $this->renderWizards(array($item,$altItem),$config['wizards'],$table,$row,$field,$PA,$PA['itemFormElName'].'_hr',$specConf); return $item; } /** * Generation of TCEform elements of the type "text" * This will render a '; $item = $this->renderWizards(array($item,$altItem),$config['wizards'],$table,$row,$field,$PA,$PA['itemFormElName'],$specConf,$RTEwouldHaveBeenLoaded); } } // Return field HTML: return $item; } /** * Generation of TCEform elements of the type "check" * This will render a check-box OR an array of checkboxes * * @param string The table name of the record * @param string The field name which this element is supposed to edit * @param array The record data array where the value(s) for the field can be found * @param array An array with additional configuration options. * @return string The HTML code for the TCEform field */ function getSingleField_typeCheck($table,$field,$row,&$PA) { $config = $PA['fieldConf']['config']; $disabled = ''; if($this->renderReadonly || $config['readOnly']) { $disabled = ' disabled="disabled"'; } // Traversing the array of items: $selItems = $this->initItemArray($PA['fieldConf']); if ($config['itemsProcFunc']) $selItems = $this->procItems($selItems,$PA['fieldTSConfig']['itemsProcFunc.'],$config,$table,$row,$field); if (!count($selItems)) { $selItems[]=array('',''); } $thisValue = intval($PA['itemFormElValue']); $cols = intval($config['cols']); if ($cols > 1) { $item.= ''; for ($c=0;$ccheckBoxParams($PA['itemFormElName'],$thisValue,$c,count($selItems),implode('',$PA['fieldChangeFunc'])); $cBName = $PA['itemFormElName'].'_'.$c; $cBID = $PA['itemFormElID'].'_'.$c; $item.= ''; if(($c%$cols)+1==$cols) {$item.='';} } if ($c%$cols) { $rest=$cols-($c%$cols); for ($c=0;$c<$rest;$c++) { $item.= ''; } if ($c>0) { $item.= ''; } } $item.= '
'. 'insertDefStyle('check').' value="1" name="'.$cBName.'"'.$cBP.$disabled.' id="'.$cBID.'" />'. $this->wrapLabels(' '). '
'; } else { for ($c=0;$ccheckBoxParams($PA['itemFormElName'],$thisValue,$c,count($selItems),implode('',$PA['fieldChangeFunc'])); $cBName = $PA['itemFormElName'].'_'.$c; $cBID = $PA['itemFormElID'].'_'.$c; $item.= ($c>0?'
':''). 'insertDefStyle('check').' value="1" name="'.$cBName.'"'.$cBP.$PA['onFocus'].$disabled.' id="'.$cBID.'" />'. htmlspecialchars($p[0]); } } if (!$disabled) { $item.= ''; } return $item; } /** * Generation of TCEform elements of the type "radio" * This will render a series of radio buttons. * * @param string The table name of the record * @param string The field name which this element is supposed to edit * @param array The record data array where the value(s) for the field can be found * @param array An array with additional configuration options. * @return string The HTML code for the TCEform field */ function getSingleField_typeRadio($table,$field,$row,&$PA) { $config = $PA['fieldConf']['config']; $disabled = ''; if($this->renderReadonly || $config['readOnly']) { $disabled = ' disabled="disabled"'; } // Get items for the array: $selItems = $this->initItemArray($PA['fieldConf']); if ($config['itemsProcFunc']) $selItems = $this->procItems($selItems,$PA['fieldTSConfig']['itemsProcFunc.'],$config,$table,$row,$field); // Traverse the items, making the form elements: for ($c=0;$cinsertDefStyle('radio').' name="'.$PA['itemFormElName'].'" value="'.htmlspecialchars($p[1]).'" onclick="'.htmlspecialchars($rOnClick).'"'.$rChecked.$PA['onFocus'].$disabled.' id="'.$rID.'" />
'; } return $item; } /** * Generation of TCEform elements of the type "select" * This will render a selector box element, or possibly a special construction with two selector boxes. That depends on configuration. * * @param string The table name of the record * @param string The field name which this element is supposed to edit * @param array The record data array where the value(s) for the field can be found * @param array An array with additional configuration options. * @return string The HTML code for the TCEform field */ function getSingleField_typeSelect($table,$field,$row,&$PA) { global $TCA; // Field configuration from TCA: $config = $PA['fieldConf']['config']; $disabled = ''; if($this->renderReadonly || $config['readOnly']) { $disabled = ' disabled="disabled"'; } // "Extra" configuration; Returns configuration for the field based on settings found in the "types" fieldlist. See http://typo3.org/documentation/document-library/doc_core_api/Wizards_Configuratio/. $specConf = $this->getSpecConfFromString($PA['extra'], $PA['fieldConf']['defaultExtras']); // Getting the selector box items from the system $selItems = $this->addSelectOptionsToItemArray($this->initItemArray($PA['fieldConf']),$PA['fieldConf'],$this->setTSconfig($table,$row),$field); $selItems = $this->addItems($selItems,$PA['fieldTSConfig']['addItems.']); if ($config['itemsProcFunc']) $selItems = $this->procItems($selItems,$PA['fieldTSConfig']['itemsProcFunc.'],$config,$table,$row,$field); // Possibly remove some items: $removeItems = t3lib_div::trimExplode(',',$PA['fieldTSConfig']['removeItems'],1); foreach($selItems as $tk => $p) { // Checking languages and authMode: $languageDeny = $TCA[$table]['ctrl']['languageField'] && !strcmp($TCA[$table]['ctrl']['languageField'], $field) && !$GLOBALS['BE_USER']->checkLanguageAccess($p[1]); $authModeDeny = $config['form_type']=='select' && $config['authMode'] && !$GLOBALS['BE_USER']->checkAuthMode($table,$field,$p[1],$config['authMode']); if (in_array($p[1],$removeItems) || $languageDeny || $authModeDeny) { unset($selItems[$tk]); } elseif (isset($PA['fieldTSConfig']['altLabels.'][$p[1]])) { $selItems[$tk][0]=$this->sL($PA['fieldTSConfig']['altLabels.'][$p[1]]); } // Removing doktypes with no access: if ($table.'.'.$field == 'pages.doktype') { if (!($GLOBALS['BE_USER']->isAdmin() || t3lib_div::inList($GLOBALS['BE_USER']->groupData['pagetypes_select'],$p[1]))) { unset($selItems[$tk]); } } } // Creating the label for the "No Matching Value" entry. $nMV_label = isset($PA['fieldTSConfig']['noMatchingValue_label']) ? $this->sL($PA['fieldTSConfig']['noMatchingValue_label']) : '[ '.$this->getLL('l_noMatchingValue').' ]'; // Prepare some values: $maxitems = intval($config['maxitems']); // If a SINGLE selector box... if ($maxitems<=1) { $item = $this->getSingleField_typeSelect_single($table,$field,$row,$PA,$config,$selItems,$nMV_label); } elseif (!strcmp($config['renderMode'],'checkbox')) { // Checkbox renderMode $item = $this->getSingleField_typeSelect_checkbox($table,$field,$row,$PA,$config,$selItems,$nMV_label); } elseif (!strcmp($config['renderMode'],'singlebox')) { // Single selector box renderMode $item = $this->getSingleField_typeSelect_singlebox($table,$field,$row,$PA,$config,$selItems,$nMV_label); } else { // Traditional multiple selector box: $item = $this->getSingleField_typeSelect_multiple($table,$field,$row,$PA,$config,$selItems,$nMV_label); } // Wizards: if (!$disabled) { $altItem = ''; $item = $this->renderWizards(array($item,$altItem),$config['wizards'],$table,$row,$field,$PA,$PA['itemFormElName'],$specConf); } return $item; } /** * Creates a single-selector box * (Render function for getSingleField_typeSelect()) * * @param string See getSingleField_typeSelect() * @param string See getSingleField_typeSelect() * @param array See getSingleField_typeSelect() * @param array See getSingleField_typeSelect() * @param array (Redundant) content of $PA['fieldConf']['config'] (for convenience) * @param array Items available for selection * @param string Label for no-matching-value * @return string The HTML code for the item * @see getSingleField_typeSelect() */ function getSingleField_typeSelect_single($table,$field,$row,&$PA,$config,$selItems,$nMV_label) { // check against inline uniqueness $inlineParent = $this->inline->getStructureLevel(-1); if(is_array($inlineParent) && $inlineParent['uid']) { if ($inlineParent['config']['foreign_table'] == $table && $inlineParent['config']['foreign_unique'] == $field) { $uniqueIds = $this->inline->inlineData['unique'][$this->inline->inlineNames['object'].'['.$table.']']['used']; $PA['fieldChangeFunc']['inlineUnique'] = "inline.updateUnique(this,'".$this->inline->inlineNames['object'].'['.$table."]','".$this->inline->inlineNames['form']."','".$row['uid']."');"; } // hide uid of parent record for symmetric relations if ($inlineParent['config']['foreign_table'] == $table && ($inlineParent['config']['foreign_field'] == $field || $inlineParent['config']['symmetric_field'] == $field)) { $uniqueIds[] = $inlineParent['uid']; } } // Initialization: $c = 0; $sI = 0; $noMatchingValue = 1; $opt = array(); $selicons = array(); $onlySelectedIconShown = 0; $size = intval($config['size']); $disabled = ''; if($this->renderReadonly || $config['readOnly']) { $disabled = ' disabled="disabled"'; $onlySelectedIconShown = 1; } // Icon configuration: if ($config['suppress_icons']=='IF_VALUE_FALSE') { $suppressIcons = !$PA['itemFormElValue'] ? 1 : 0; } elseif ($config['suppress_icons']=='ONLY_SELECTED') { $suppressIcons=0; $onlySelectedIconShown=1; } elseif ($config['suppress_icons']) { $suppressIcons = 1; } else $suppressIcons = 0; // Traverse the Array of selector box items: foreach($selItems as $p) { $sM = (!strcmp($PA['itemFormElValue'],$p[1])?' selected="selected"':''); if ($sM) { $sI = $c; $noMatchingValue = 0; } // Getting style attribute value (for icons): if ($config['iconsInOptionTags']) { $styleAttrValue = $this->optionTagStyle($p[2]); } // Compiling the '; } // If there is an icon for the selector box (rendered in table under)...: if ($p[2] && !$suppressIcons && (!$onlySelectedIconShown || $sM)) { list($selIconFile,$selIconInfo)=$this->getIcon($p[2]); $iOnClick = $this->elName($PA['itemFormElName']).'.selectedIndex='.$c.'; '.implode('',$PA['fieldChangeFunc']).$this->blur().'return false;'; $selicons[]=array( (!$onlySelectedIconShown ? '' : ''). ''.htmlspecialchars($p[0]).''. (!$onlySelectedIconShown ? '' : ''), $c,$sM); } $c++; } // No-matching-value: if ($PA['itemFormElValue'] && $noMatchingValue && !$PA['fieldTSConfig']['disableNoMatchingValueElement'] && !$config['disableNoMatchingValueElement']) { $nMV_label = @sprintf($nMV_label, $PA['itemFormElValue']); $opt[]= ''; } // Create item form fields: $sOnChange = 'if (this.options[this.selectedIndex].value==\'--div--\') {this.selectedIndex='.$sI.';} '.implode('',$PA['fieldChangeFunc']); if(!$disabled) { $item.= ''; // MUST be inserted before the selector - else is the value of the hiddenfield here mysteriously submitted... } $item.= ''; // Create icon table: if (count($selicons)) { $item.=''; $selicon_cols = intval($config['selicon_cols']); if (!$selicon_cols) $selicon_cols=count($selicons); $sR = ceil(count($selicons)/$selicon_cols); $selicons = array_pad($selicons,$sR*$selicon_cols,''); for($sa=0;$sa<$sR;$sa++) { $item.=''; for($sb=0;$sb<$selicon_cols;$sb++) { $sk=($sa*$selicon_cols+$sb); $imgN = 'selIcon_'.$table.'_'.$row['uid'].'_'.$field.'_'.$selicons[$sk][1]; $imgS = ($selicons[$sk][2]?$this->backPath.'gfx/content_selected.gif':'clear.gif'); $item.=''; $item.=''; } $item.=''; } $item.='
'.$selicons[$sk][0].'
'; } return $item; } /** * Creates a checkbox list (renderMode = "checkbox") * (Render function for getSingleField_typeSelect()) * * @param string See getSingleField_typeSelect() * @param string See getSingleField_typeSelect() * @param array See getSingleField_typeSelect() * @param array See getSingleField_typeSelect() * @param array (Redundant) content of $PA['fieldConf']['config'] (for convenience) * @param array Items available for selection * @param string Label for no-matching-value * @return string The HTML code for the item * @see getSingleField_typeSelect() */ function getSingleField_typeSelect_checkbox($table,$field,$row,&$PA,$config,$selItems,$nMV_label) { // Get values in an array (and make unique, which is fine because there can be no duplicates anyway): $itemArray = array_flip($this->extractValuesOnlyFromValueLabelList($PA['itemFormElValue'])); $disabled = ''; if($this->renderReadonly || $config['readOnly']) { $disabled = ' disabled="disabled"'; } // Traverse the Array of selector box items: $tRows = array(); $c=0; if (!$disabled) { $sOnChange = implode('',$PA['fieldChangeFunc']); $setAll = array(); // Used to accumulate the JS needed to restore the original selection. foreach($selItems as $p) { // Non-selectable element: if (!strcmp($p[1],'--div--')) { if (count($setAll)) { $tRows[] = ' '. ''. htmlspecialchars($this->getLL('l_setAllCheckboxes')). ' '; $setAll = array(); } $tRows[] = ' '.htmlspecialchars($p[0]).' '; } else { // Selected or not by default: $sM = ''; if (isset($itemArray[$p[1]])) { $sM = ' checked="checked"'; unset($itemArray[$p[1]]); } // Icon: $selIconFile = ''; if ($p[2]) { list($selIconFile,$selIconInfo) = $this->getIcon($p[2]); } // Compile row: $onClickCell = $this->elName($PA['itemFormElName'].'['.$c.']').'.checked=!'.$this->elName($PA['itemFormElName'].'['.$c.']').'.checked;'; $onClick = 'this.attributes.getNamedItem("class").nodeValue = '.$this->elName($PA['itemFormElName'].'['.$c.']').'.checked ? "c-selectedItem" : "";'; $setAll[] = $this->elName($PA['itemFormElName'].'['.$c.']').'.checked=1;'; $tRows[] = ' insertDefStyle('check').' name="'.htmlspecialchars($PA['itemFormElName'].'['.$c.']').'" value="'.htmlspecialchars($p[1]).'"'.$sM.' onclick="'.htmlspecialchars($sOnChange).'"'.$PA['onFocus'].' /> '. ($selIconFile ? '' : ''). t3lib_div::deHSCentities(htmlspecialchars($p[0])). (strcmp($p[3],'') ? '

'.nl2br(trim(htmlspecialchars($p[3]))).'

' : ''). ' '; $c++; } } // Remaining checkboxes will get their set-all link: if (count($setAll)) { $tRows[] = ' '. ''. htmlspecialchars($this->getLL('l_setAllCheckboxes')). ' '; } } // Remaining values (invalid): if (count($itemArray) && !$PA['fieldTSConfig']['disableNoMatchingValueElement'] && !$config['disableNoMatchingValueElement']) { foreach($itemArray as $theNoMatchValue => $temp) { // Compile tag: array_unshift($tRows,' insertDefStyle('check').' name="'.htmlspecialchars($PA['itemFormElName'].'['.$c.']').'" value="'.htmlspecialchars($theNoMatchValue).'" checked="checked" onclick="'.htmlspecialchars($sOnChange).'"'.$PA['onFocus'].$disabled.' /> '. t3lib_div::deHSCentities(htmlspecialchars(@sprintf($nMV_label, $theNoMatchValue))). ' '); $c++; } } // Add an empty hidden field which will send a blank value if all items are unselected. $item.=''; // Implode rows in table: $item.= ' '. implode('',$tRows).'
'; return $item; } /** * Creates a selectorbox list (renderMode = "singlebox") * (Render function for getSingleField_typeSelect()) * * @param string See getSingleField_typeSelect() * @param string See getSingleField_typeSelect() * @param array See getSingleField_typeSelect() * @param array See getSingleField_typeSelect() * @param array (Redundant) content of $PA['fieldConf']['config'] (for convenience) * @param array Items available for selection * @param string Label for no-matching-value * @return string The HTML code for the item * @see getSingleField_typeSelect() */ function getSingleField_typeSelect_singlebox($table,$field,$row,&$PA,$config,$selItems,$nMV_label) { // Get values in an array (and make unique, which is fine because there can be no duplicates anyway): $itemArray = array_flip($this->extractValuesOnlyFromValueLabelList($PA['itemFormElValue'])); $disabled = ''; if($this->renderReadonly || $config['readOnly']) { $disabled = ' disabled="disabled"'; } // Traverse the Array of selector box items: $opt = array(); $restoreCmd = array(); // Used to accumulate the JS needed to restore the original selection. $c = 0; foreach($selItems as $p) { // Selected or not by default: $sM = ''; if (isset($itemArray[$p[1]])) { $sM = ' selected="selected"'; $restoreCmd[] = $this->elName($PA['itemFormElName'].'[]').'.options['.$c.'].selected=1;'; unset($itemArray[$p[1]]); } // Non-selectable element: $nonSel = ''; if (!strcmp($p[1],'--div--')) { $nonSel = ' onclick="this.selected=0;" class="c-divider"'; } // Icon style for option tag: if ($config['iconsInOptionTags']) { $styleAttrValue = $this->optionTagStyle($p[2]); } // Compile '; $c++; } // Remaining values: if (count($itemArray) && !$PA['fieldTSConfig']['disableNoMatchingValueElement'] && !$config['disableNoMatchingValueElement']) { foreach($itemArray as $theNoMatchValue => $temp) { // Compile '); } } // Compile selector box: $sOnChange = implode('',$PA['fieldChangeFunc']); $selector_itemListStyle = isset($config['itemListStyle']) ? ' style="'.htmlspecialchars($config['itemListStyle']).'"' : ' style="'.$this->defaultMultipleSelectorStyle.'"'; $size = intval($config['size']); $size = $config['autoSizeMax'] ? t3lib_div::intInRange(count($selItems)+1,t3lib_div::intInRange($size,1),$config['autoSizeMax']) : $size; $selectBox = ''; // Add an empty hidden field which will send a blank value if all items are unselected. if (!$disabled) { $item.=''; } // Put it all into a table: $item.= '
'.$selectBox.'
'. htmlspecialchars($this->getLL('l_holdDownCTRL')). '
'. 'backPath,'gfx/history.gif','width="13" height="12"').' title="'.htmlspecialchars($this->getLL('l_revertSelection')).'" alt="" />'. '
'; return $item; } /** * Creates a multiple-selector box (two boxes, side-by-side) * (Render function for getSingleField_typeSelect()) * * @param string See getSingleField_typeSelect() * @param string See getSingleField_typeSelect() * @param array See getSingleField_typeSelect() * @param array See getSingleField_typeSelect() * @param array (Redundant) content of $PA['fieldConf']['config'] (for convenience) * @param array Items available for selection * @param string Label for no-matching-value * @return string The HTML code for the item * @see getSingleField_typeSelect() */ function getSingleField_typeSelect_multiple($table,$field,$row,&$PA,$config,$selItems,$nMV_label) { $disabled = ''; if($this->renderReadonly || $config['readOnly']) { $disabled = ' disabled="disabled"'; } // Setting this hidden field (as a flag that JavaScript can read out) if (!$disabled) { $item.= ''; } // Set max and min items: $maxitems = t3lib_div::intInRange($config['maxitems'],0); if (!$maxitems) $maxitems=100000; $minitems = t3lib_div::intInRange($config['minitems'],0); // Register the required number of elements: $this->requiredElements[$PA['itemFormElName']] = array($minitems,$maxitems,'imgName'=>$table.'_'.$row['uid'].'_'.$field); // Get "removeItems": $removeItems = t3lib_div::trimExplode(',',$PA['fieldTSConfig']['removeItems'],1); // Perform modification of the selected items array: $itemArray = t3lib_div::trimExplode(',',$PA['itemFormElValue'],1); foreach($itemArray as $tk => $tv) { $tvP = explode('|',$tv,2); $evalValue = rawurldecode($tvP[0]); $isRemoved = in_array($evalValue,$removeItems) || ($config['form_type']=='select' && $config['authMode'] && !$GLOBALS['BE_USER']->checkAuthMode($table,$field,$evalValue,$config['authMode'])); if ($isRemoved && !$PA['fieldTSConfig']['disableNoMatchingValueElement'] && !$config['disableNoMatchingValueElement']) { $tvP[1] = rawurlencode(@sprintf($nMV_label, $evalValue)); } elseif (isset($PA['fieldTSConfig']['altLabels.'][$evalValue])) { $tvP[1] = rawurlencode($this->sL($PA['fieldTSConfig']['altLabels.'][$evalValue])); } $itemArray[$tk] = implode('|',$tvP); } $itemsToSelect = ''; if(!$disabled) { // Create option tags: $opt = array(); $styleAttrValue = ''; foreach($selItems as $p) { if ($config['iconsInOptionTags']) { $styleAttrValue = $this->optionTagStyle($p[2]); } $opt[]= ''; } // Put together the selector box: $selector_itemListStyle = isset($config['itemListStyle']) ? ' style="'.htmlspecialchars($config['itemListStyle']).'"' : ' style="'.$this->defaultMultipleSelectorStyle.'"'; $size = intval($config['size']); $size = $config['autoSizeMax'] ? t3lib_div::intInRange(count($itemArray)+1,t3lib_div::intInRange($size,1),$config['autoSizeMax']) : $size; if ($config['exclusiveKeys']) { $sOnChange = 'setFormValueFromBrowseWin(\''.$PA['itemFormElName'].'\',this.options[this.selectedIndex].value,this.options[this.selectedIndex].text,\''.$config['exclusiveKeys'].'\'); '; } else { $sOnChange = 'setFormValueFromBrowseWin(\''.$PA['itemFormElName'].'\',this.options[this.selectedIndex].value,this.options[this.selectedIndex].text); '; } $sOnChange .= implode('',$PA['fieldChangeFunc']); $itemsToSelect = ' '; } // Pass to "dbFileIcons" function: $params = array( 'size' => $size, 'autoSizeMax' => t3lib_div::intInRange($config['autoSizeMax'],0), 'style' => isset($config['selectedListStyle']) ? ' style="'.htmlspecialchars($config['selectedListStyle']).'"' : ' style="'.$this->defaultMultipleSelectorStyle.'"', 'dontShowMoveIcons' => ($maxitems<=1), 'maxitems' => $maxitems, 'info' => '', 'headers' => array( 'selector' => $this->getLL('l_selected').':
', 'items' => $this->getLL('l_items').':
' ), 'noBrowser' => 1, 'thumbnails' => $itemsToSelect, 'readOnly' => $disabled ); $item.= $this->dbFileIcons($PA['itemFormElName'],'','',$itemArray,'',$params,$PA['onFocus']); return $item; } /** * Generation of TCEform elements of the type "group" * This will render a selectorbox into which elements from either the file system or database can be inserted. Relations. * * @param string The table name of the record * @param string The field name which this element is supposed to edit * @param array The record data array where the value(s) for the field can be found * @param array An array with additional configuration options. * @return string The HTML code for the TCEform field */ function getSingleField_typeGroup($table,$field,$row,&$PA) { // Init: $config = $PA['fieldConf']['config']; $internal_type = $config['internal_type']; $show_thumbs = $config['show_thumbs']; $size = intval($config['size']); $maxitems = t3lib_div::intInRange($config['maxitems'],0); if (!$maxitems) $maxitems=100000; $minitems = t3lib_div::intInRange($config['minitems'],0); $allowed = $config['allowed']; $disallowed = $config['disallowed']; $disabled = ''; if($this->renderReadonly || $config['readOnly']) { $disabled = ' disabled="disabled"'; } $item.= ''; $this->requiredElements[$PA['itemFormElName']] = array($minitems,$maxitems,'imgName'=>$table.'_'.$row['uid'].'_'.$field); $info=''; // "Extra" configuration; Returns configuration for the field based on settings found in the "types" fieldlist. See http://typo3.org/documentation/document-library/doc_core_api/Wizards_Configuratio/. $specConf = $this->getSpecConfFromString($PA['extra'], $PA['fieldConf']['defaultExtras']); // Acting according to either "file" or "db" type: switch((string)$config['internal_type']) { case 'file': // If the element is of the internal type "file": // Creating string showing allowed types: $tempFT = t3lib_div::trimExplode(',',$allowed,1); if (!count($tempFT)) {$info.='*';} foreach($tempFT as $ext) { if ($ext) { $info.=strtoupper($ext).' '; } } // Creating string, showing disallowed types: $tempFT_dis = t3lib_div::trimExplode(',',$disallowed,1); if (count($tempFT_dis)) {$info.='
';} foreach($tempFT_dis as $ext) { if ($ext) { $info.='-'.strtoupper($ext).' '; } } // Making the array of file items: $itemArray = t3lib_div::trimExplode(',',$PA['itemFormElValue'],1); // Showing thumbnails: $thumbsnail = ''; if ($show_thumbs) { $imgs = array(); foreach($itemArray as $imgRead) { $imgP = explode('|',$imgRead); $imgPath = rawurldecode($imgP[0]); $rowCopy = array(); $rowCopy[$field] = $imgPath; // Icon + clickmenu: $absFilePath = t3lib_div::getFileAbsFileName($config['uploadfolder'].'/'.$imgPath); $fI = pathinfo($imgPath); $fileIcon = t3lib_BEfunc::getFileIcon(strtolower($fI['extension'])); $fileIcon = 'backPath,'gfx/fileicons/'.$fileIcon,'width="18" height="16"').' class="absmiddle" title="'.htmlspecialchars($fI['basename'].($absFilePath && @is_file($absFilePath) ? ' ('.t3lib_div::formatSize(filesize($absFilePath)).'bytes)' : ' - FILE NOT FOUND!')).'" alt="" />'; $imgs[] = ''.t3lib_BEfunc::thumbCode($rowCopy,$table,$field,$this->backPath,'thumbs.php',$config['uploadfolder'],0,' align="middle"'). ($absFilePath ? $this->getClickMenu($fileIcon, $absFilePath) : $fileIcon). $imgPath. ''; } $thumbsnail = implode('
',$imgs); } // Creating the element: $params = array( 'size' => $size, 'dontShowMoveIcons' => ($maxitems<=1), 'autoSizeMax' => t3lib_div::intInRange($config['autoSizeMax'],0), 'maxitems' => $maxitems, 'style' => isset($config['selectedListStyle']) ? ' style="'.htmlspecialchars($config['selectedListStyle']).'"' : ' style="'.$this->defaultMultipleSelectorStyle.'"', 'info' => $info, 'thumbnails' => $thumbsnail, 'readOnly' => $disabled ); $item.= $this->dbFileIcons($PA['itemFormElName'],'file',implode(',',$tempFT),$itemArray,'',$params,$PA['onFocus']); if(!$disabled) { // Adding the upload field: if ($this->edit_docModuleUpload) $item.='formWidth().' size="60" />'; } break; case 'db': // If the element is of the internal type "db": // Creating string showing allowed types: $tempFT = t3lib_div::trimExplode(',',$allowed,1); if (!strcmp(trim($tempFT[0]),'*')) { $info.='    '. htmlspecialchars($this->getLL('l_allTables')). '
'; } else { while(list(,$theT)=each($tempFT)) { if ($theT) { $info.='    '. t3lib_iconWorks::getIconImage($theT,array(),$this->backPath,'align="top"'). htmlspecialchars($this->sL($GLOBALS['TCA'][$theT]['ctrl']['title'])). '
'; } } } $perms_clause = $GLOBALS['BE_USER']->getPagePermsClause(1); $itemArray = array(); $imgs = array(); // Thumbnails: $temp_itemArray = t3lib_div::trimExplode(',',$PA['itemFormElValue'],1); foreach($temp_itemArray as $dbRead) { $recordParts = explode('|',$dbRead); list($this_table,$this_uid) = t3lib_BEfunc::splitTable_Uid($recordParts[0]); $itemArray[] = array('table'=>$this_table, 'id'=>$this_uid); if (!$disabled && $show_thumbs) { $rr = t3lib_BEfunc::getRecordWSOL($this_table,$this_uid); $imgs[] = ''. $this->getClickMenu(t3lib_iconWorks::getIconImage($this_table,$rr,$this->backPath,'align="top" title="'.htmlspecialchars(t3lib_BEfunc::getRecordPath($rr['pid'],$perms_clause,15)).' [UID: '.$rr['uid'].']"'),$this_table, $this_uid). ' '. t3lib_BEfunc::getRecordTitle($this_table,$rr,TRUE).' ['.$rr['uid'].']'. ''; } } $thumbsnail=''; if (!$disabled && $show_thumbs) { $thumbsnail = implode('
',$imgs); } // Creating the element: $params = array( 'size' => $size, 'dontShowMoveIcons' => ($maxitems<=1), 'autoSizeMax' => t3lib_div::intInRange($config['autoSizeMax'],0), 'maxitems' => $maxitems, 'style' => isset($config['selectedListStyle']) ? ' style="'.htmlspecialchars($config['selectedListStyle']).'"' : ' style="'.$this->defaultMultipleSelectorStyle.'"', 'info' => $info, 'thumbnails' => $thumbsnail, 'readOnly' => $disabled ); $item.= $this->dbFileIcons($PA['itemFormElName'],'db',implode(',',$tempFT),$itemArray,'',$params,$PA['onFocus'],$table,$field,$row['uid']); break; } // Wizards: $altItem = ''; if (!$disabled) { $item = $this->renderWizards(array($item,$altItem),$config['wizards'],$table,$row,$field,$PA,$PA['itemFormElName'],$specConf); } return $item; } /** * Generation of TCEform elements of the type "none" * This will render a non-editable display of the content of the field. * * @param string The table name of the record * @param string The field name which this element is supposed to edit * @param array The record data array where the value(s) for the field can be found * @param array An array with additional configuration options. * @return string The HTML code for the TCEform field */ function getSingleField_typeNone($table,$field,$row,&$PA) { // Init: $config = $PA['fieldConf']['config']; $itemValue = $PA['itemFormElValue']; return $this->getSingleField_typeNone_render($config,$itemValue); } /** * HTML rendering of a value which is not editable. * * @param array Configuration for the display * @param string The value to display * @return string The HTML code for the display * @see getSingleField_typeNone(); */ function getSingleField_typeNone_render($config,$itemValue) { // is colorScheme[0] the right value? $divStyle = 'border:solid 1px '.t3lib_div::modifyHTMLColorAll($this->colorScheme[0],-30).';'.$this->defStyle.$this->formElStyle('none').' background-color: '.$this->colorScheme[0].'; padding-left:1px;color:#555;'; if ($config['format']) { $itemValue = $this->formatValue($config, $itemValue); } $rows = intval($config['rows']); if ($rows > 1) { if(!$config['pass_content']) { $itemValue = nl2br(htmlspecialchars($itemValue)); } // like textarea $cols = t3lib_div::intInRange($config['cols'] ? $config['cols'] : 30, 5, $this->maxTextareaWidth); if (!$config['fixedRows']) { $origRows = $rows = t3lib_div::intInRange($rows, 1, 20); if (strlen($itemValue)>$this->charsPerRow*2) { $cols = $this->maxTextareaWidth; $rows = t3lib_div::intInRange(round(strlen($itemValue)/$this->charsPerRow),count(explode(chr(10),$itemValue)),20); if ($rows<$origRows) $rows=$origRows; } } if ($this->docLarge) $cols = round($cols*$this->form_largeComp); $width = ceil($cols*$this->form_rowsToStylewidth); // hardcoded: 12 is the height of the font $height=$rows*12; $item='
'. $itemValue. '
'; } else { if(!$config['pass_content']) { $itemValue = htmlspecialchars($itemValue); } $cols = $config['cols']?$config['cols']:($config['size']?$config['size']:$this->maxInputWidth); if ($this->docLarge) $cols = round($cols*$this->form_largeComp); $width = ceil($cols*$this->form_rowsToStylewidth); // overflow:auto crashes mozilla here. Title tag is usefull when text is longer than the div box (overflow:hidden). $item = '
'. ''.(strcmp($itemValue,'')?$itemValue:' ').''. '
'; } return $item; } /** * Handler for Flex Forms * * @param string The table name of the record * @param string The field name which this element is supposed to edit * @param array The record data array where the value(s) for the field can be found * @param array An array with additional configuration options. * @return string The HTML code for the TCEform field */ function getSingleField_typeFlex($table,$field,$row,&$PA) { // Data Structure: $dataStructArray = t3lib_BEfunc::getFlexFormDS($PA['fieldConf']['config'],$row,$table); // Get data structure: if (is_array($dataStructArray)) { // Get data: $xmlData = $PA['itemFormElValue']; $xmlHeaderAttributes = t3lib_div::xmlGetHeaderAttribs($xmlData); $storeInCharset = strtolower($xmlHeaderAttributes['encoding']); if ($storeInCharset) { $currentCharset=$GLOBALS['LANG']->charSet; $xmlData = $GLOBALS['LANG']->csConvObj->conv($xmlData,$storeInCharset,$currentCharset,1); } $editData=t3lib_div::xml2array($xmlData); if (!is_array($editData)) { // Must be XML parsing error... $editData=array(); } elseif (!isset($editData['meta']) || !is_array($editData['meta'])) { $editData['meta'] = array(); } // Find the data structure if sheets are found: $sheet = $editData['meta']['currentSheetId'] ? $editData['meta']['currentSheetId'] : 'sDEF'; // Sheet to display // Create sheet menu: // if (is_array($dataStructArray['sheets'])) { // #$item.=$this->getSingleField_typeFlex_sheetMenu($dataStructArray['sheets'], $PA['itemFormElName'].'[meta][currentSheetId]', $sheet).'
'; // } // Create language menu: $langChildren = $dataStructArray['meta']['langChildren'] ? 1 : 0; $langDisabled = $dataStructArray['meta']['langDisable'] ? 1 : 0; $editData['meta']['currentLangId']=array(); $languages = $this->getAvailableLanguages(); foreach($languages as $lInfo) { if ($GLOBALS['BE_USER']->checkLanguageAccess($lInfo['uid'])) { $editData['meta']['currentLangId'][] = $lInfo['ISOcode']; } } if (!is_array($editData['meta']['currentLangId']) || !count($editData['meta']['currentLangId'])) { $editData['meta']['currentLangId']=array('DEF'); } $editData['meta']['currentLangId'] = array_unique($editData['meta']['currentLangId']); // if (!$langDisabled && count($languages) > 1) { // $item.=$this->getSingleField_typeFlex_langMenu($languages, $PA['itemFormElName'].'[meta][currentLangId]', $editData['meta']['currentLangId']).'
'; // } $PA['_noEditDEF'] = FALSE; if ($langChildren || $langDisabled) { $rotateLang = array('DEF'); } else { if (!in_array('DEF',$editData['meta']['currentLangId'])) { array_unshift($editData['meta']['currentLangId'],'DEF'); $PA['_noEditDEF'] = TRUE; } $rotateLang = $editData['meta']['currentLangId']; } // Tabs sheets if (is_array($dataStructArray['sheets'])) { $tabsToTraverse = array_keys($dataStructArray['sheets']); } else { $tabsToTraverse = array($sheet); } foreach ($rotateLang as $lKey) { if (!$langChildren && !$langDisabled) { $item.= ''.$this->getLanguageIcon($table,$row,'v'.$lKey).$lKey.':'; } $tabParts = array(); foreach ($tabsToTraverse as $sheet) { $sheetCfg = $dataStructArray['sheets'][$sheet]; list ($dataStruct, $sheet) = t3lib_div::resolveSheetDefInDS($dataStructArray,$sheet); // Render sheet: if (is_array($dataStruct['ROOT']) && is_array($dataStruct['ROOT']['el'])) { $cmdData = t3lib_div::_GP('flexFormsCmdData'); $lang = 'l'.$lKey; // Default language, other options are "lUK" or whatever country code (independant of system!!!) $PA['_valLang'] = $langChildren && !$langDisabled ? $editData['meta']['currentLangId'] : 'DEF'; // Default language, other options are "lUK" or whatever country code (independant of system!!!) $PA['_lang'] = $lang; // Render flexform: $tRows = $this->getSingleField_typeFlex_draw( $dataStruct['ROOT']['el'], $editData['data'][$sheet][$lang], $cmdData['data'][$sheet][$lang], $table, $field, $row, $PA, '[data]['.$sheet.']['.$lang.']' ); $sheetContent= ''.implode('',$tRows).'
'; # $item = '
'.$item.'
'; //visibility:hidden; } else $sheetContent='Data Structure ERROR: No ROOT element found for sheet "'.$sheet.'".'; // Add to tab: $tabParts[] = array( 'label' => ($sheetCfg['ROOT']['TCEforms']['sheetTitle'] ? $this->sL($sheetCfg['ROOT']['TCEforms']['sheetTitle']) : $sheet), 'description' => ($sheetCfg['ROOT']['TCEforms']['sheetDescription'] ? $this->sL($sheetCfg['ROOT']['TCEforms']['sheetDescription']) : ''), 'linkTitle' => ($sheetCfg['ROOT']['TCEforms']['sheetShortDescr'] ? $this->sL($sheetCfg['ROOT']['TCEforms']['sheetShortDescr']) : ''), 'content' => $sheetContent ); } if (is_array($dataStructArray['sheets'])) { $item.= $this->getDynTabMenu($tabParts,'TCEFORMS:flexform:'.$PA['itemFormElName'].$PA['_lang']); } else { $item.= $sheetContent; } } } else $item='Data Structure ERROR: '.$dataStructArray; return $item; } /** * Creates the language menu for FlexForms: * * @param [type] $languages: ... * @param [type] $elName: ... * @param [type] $selectedLanguage: ... * @param [type] $multi: ... * @return string HTML for menu */ function getSingleField_typeFlex_langMenu($languages,$elName,$selectedLanguage,$multi=1) { $opt=array(); foreach($languages as $lArr) { $opt[]=''; } $output = ''; return $output; } /** * Creates the menu for selection of the sheets: * * @param array Sheet array for which to render the menu * @param string Form element name of the field containing the sheet pointer * @param string Current sheet key * @return string HTML for menu */ function getSingleField_typeFlex_sheetMenu($sArr,$elName,$sheetKey) { $tCells =array(); $pct = round(100/count($sArr)); foreach($sArr as $sKey => $sheetCfg) { if ($GLOBALS['BE_USER']->jsConfirmation(1)) { $onClick = 'if (confirm(TBE_EDITOR.labels.onChangeAlert) && TBE_EDITOR.checkSubmit(-1)){'.$this->elName($elName).".value='".$sKey."'; TBE_EDITOR.submitForm()};"; } else { $onClick = 'if(TBE_EDITOR.checkSubmit(-1)){ '.$this->elName($elName).".value='".$sKey."'; TBE_EDITOR.submitForm();}"; } $tCells[]=''. ($sheetCfg['ROOT']['TCEforms']['sheetTitle'] ? $this->sL($sheetCfg['ROOT']['TCEforms']['sheetTitle']) : $sKey). ''; } return ''.implode('',$tCells).'
'; } /** * [Describe function...] * * @param [type] $dataStruct: ... * @param [type] $editData: ... * @param [type] $cmdData: ... * @param [type] $table: ... * @param [type] $field: ... * @param [type] $row: ... * @param [type] $PA: ... * @param [type] $formPrefix: ... * @param [type] $level: ... * @param [type] $tRows: ... * @return [type] ... */ function getSingleField_typeFlex_draw($dataStruct,$editData,$cmdData,$table,$field,$row,&$PA,$formPrefix='',$level=0,$tRows=array()) { // Data Structure array must be ... and array of course... if (is_array($dataStruct)) { foreach($dataStruct as $key => $value) { if (is_array($value)) { // The value of each entry must be an array. // ******************** // Making the row: // ******************** $rowCells=array(); // Icon: $rowCells['title'] = ''.htmlspecialchars(t3lib_div::fixed_lgd_cs($this->sL($value['tx_templavoila']['title']),30)).'';; $rowCells['formEl']=''; if ($value['type']=='array') { if ($value['section']) { // Render "NEW [container]" selectorbox: if (is_array($value['el'])) { $opt=array(); $opt[]=''; foreach($value['el'] as $kk => $vv) { $opt[]=''; } $rowCells['formEl']=$this->getLL('l_new_section') . ' '; $rowCells['formEl'].=$this->getLL('l_count') . ' '; } // Put row together $tRows[]=' '.$rowCells['title'].' '.$rowCells['formEl'].' '; $cc=0; if (is_array($editData[$key]['el'])) { foreach ($editData[$key]['el'] as $k3 => $v3) { $cc=$k3; $theType = key($v3); $theDat = $v3[$theType]; $newSectionEl = $value['el'][$theType]; if (is_array($newSectionEl)) { $tRows = $this->getSingleField_typeFlex_draw( array($theType => $newSectionEl), array($theType => $theDat), $cmdData[$key]['el'][$cc], $table, $field, $row, $PA, $formPrefix.'['.$key.'][el]['.$cc.']', $level+1, $tRows ); } } } // New form? if ($cmdData[$key]['value']) { $newSectionEl = $value['el'][$cmdData[$key]['value']]; if (is_array($newSectionEl)) { $newElCount = max(1, intval($cmdData[$key]['count'])); for ($newElNum = 0; $newElNum < $newElCount; $newElNum++) { $tRows = $this->getSingleField_typeFlex_draw( array($cmdData[$key]['value'] => $newSectionEl), array(), array(), $table, $field, $row, $PA, $formPrefix.'['.$key.'][el]['.($cc+1+$newElNum).']', $level+1, $tRows ); } } } } else { $idTagPrefix = uniqid('id',true); // ID attributes are used for the move and delete checkboxes for referencing to them in the label tag (