/** * Renders the sub elements of the given elementContentTree array. This function basically * renders the "new" and "paste" buttons for the parent element and then traverses through * the sub elements (if any exist). The sub element's (preview-) content will be rendered * by render_framework_singleSheet(). * * Calls render_framework_allSheets() and therefore generates a recursion. * * @param array $elementContentTreeArr: Content tree starting with the element which possibly has sub elements * @param string $languageKey: Language key for current display * @param string $sheet: Key of the sheet we want to render * @param integer $calcPerms: Defined the access rights for the enclosing parent * @return string HTML output (a table) of the sub elements and some "insert new" and "paste" buttons * @access protected * @see render_framework_allSheets(), render_framework_singleSheet() */ function render_framework_subElements($elementContentTreeArr, $languageKey, $sheet, $calcPerms = 0) { global $LANG; $beTemplate = ''; $flagRenderBeLayout = false; $canEditContent = $GLOBALS['BE_USER']->isPSet($calcPerms, 'pages', 'editcontent'); // Define l/v keys for current language: $langChildren = intval($elementContentTreeArr['ds_meta']['langChildren']); $langDisable = intval($elementContentTreeArr['ds_meta']['langDisable']); //if page DS and the checkbox is not set use always langDisable in inheritance mode if ($elementContentTreeArr['el']['table'] == 'pages' && $GLOBALS['BE_USER']->isAdmin()) { if ($langDisable != 1 && $this->MOD_SETTINGS['disablePageStructureInheritance'] != '1' && $langChildren == 1) { $langDisable = 1; } } $lKey = $langDisable ? 'lDEF' : ($langChildren ? 'lDEF' : 'l' . $languageKey); $vKey = $langDisable ? 'vDEF' : ($langChildren ? 'v' . $languageKey : 'vDEF'); if (!is_array($elementContentTreeArr['sub'][$sheet]) || !is_array($elementContentTreeArr['sub'][$sheet][$lKey])) { return ''; } $output = ''; $cells = array(); // get used TO if (isset($elementContentTreeArr['el']['TO']) && intval($elementContentTreeArr['el']['TO'])) { $toRecord = t3lib_BEfunc::getRecordWSOL('tx_templavoila_tmplobj', intval($elementContentTreeArr['el']['TO'])); } else { $toRecord = $this->apiObj->getContentTree_fetchPageTemplateObject($this->rootElementRecord); } try { $toRepo = t3lib_div::makeInstance('tx_templavoila_templateRepository'); /** @var $toRepo tx_templavoila_templateRepository */ $to = $toRepo->getTemplateByUid($toRecord['uid']); /** @var $to tx_templavoila_template */ $beTemplate = $to->getBeLayout(); } catch (InvalidArgumentException $e) { // might happen if uid was not what the Repo expected - that's ok here } if ($beTemplate === FALSE && isset($elementContentTreeArr['ds_meta']['beLayout'])) { $beTemplate = $elementContentTreeArr['ds_meta']['beLayout']; } // no layout, no special rendering $flagRenderBeLayout = $beTemplate ? TRUE : FALSE; // Traverse container fields: foreach ($elementContentTreeArr['sub'][$sheet][$lKey] as $fieldID => $fieldValuesContent) { try { $newValue = $to->getLocalDataprotValueByXpath('//' . $fieldID . '/tx_templavoila/preview'); $elementContentTreeArr['previewData']['sheets'][$sheet][$fieldID]['tx_templavoila']['preview'] = $newValue; } catch (UnexpectedValueException $e) { } if (is_array($fieldValuesContent[$vKey]) && ($elementContentTreeArr['previewData']['sheets'][$sheet][$fieldID]['isMapped'] || $elementContentTreeArr['previewData']['sheets'][$sheet][$fieldID]['type'] == 'no_map') && $elementContentTreeArr['previewData']['sheets'][$sheet][$fieldID]['tx_templavoila']['preview'] != 'disable') { $fieldContent = $fieldValuesContent[$vKey]; $cellContent = ''; // Create flexform pointer pointing to "before the first sub element": $subElementPointer = array('table' => $elementContentTreeArr['el']['table'], 'uid' => $elementContentTreeArr['el']['uid'], 'sheet' => $sheet, 'sLang' => $lKey, 'field' => $fieldID, 'vLang' => $vKey, 'position' => 0); if (isset($elementContentTreeArr['previewData']['sheets'][$sheet][$fieldID]['TCEforms']['config']['maxitems'])) { $maxCnt = $elementContentTreeArr['previewData']['sheets'][$sheet][$fieldID]['TCEforms']['config']['maxitems']; $maxItemsReached = is_array($fieldContent['el_list']) && count($fieldContent['el_list']) >= $maxCnt; } else { $maxItemsReached = FALSE; } if ($maxItemsReached) { $flashMessage = t3lib_div::makeInstance('t3lib_FlashMessage', '', sprintf($GLOBALS['LANG']->getLL('maximal_content_elements'), $maxCnt, $elementContentTreeArr['previewData']['sheets'][$sheet][$fieldID]['tx_templavoila']['title']), t3lib_FlashMessage::INFO); t3lib_FlashMessageQueue::addMessage($flashMessage); } $canCreateNew = $canEditContent && !$maxItemsReached; $canDragDrop = !$maxItemsReached && $canEditContent && $elementContentTreeArr['previewData']['sheets'][$sheet][$fieldID]['tx_templavoila']['enableDragDrop'] !== '0' && $this->modTSconfig['properties']['enableDragDrop'] !== '0'; if (!$this->translatorMode && $canCreateNew) { $cellContent .= $this->link_bottomControls($subElementPointer, $canCreateNew); } // Render the list of elements (and possibly call itself recursively if needed): if (is_array($fieldContent['el_list'])) { foreach ($fieldContent['el_list'] as $position => $subElementKey) { $subElementArr = $fieldContent['el'][$subElementKey]; if ((!$subElementArr['el']['isHidden'] || $this->MOD_SETTINGS['tt_content_showHidden'] !== '0') && $this->displayElement($subElementArr)) { // When "onlyLocalized" display mode is set and an alternative language gets displayed if ($this->MOD_SETTINGS['langDisplayMode'] == 'onlyLocalized' && $this->currentLanguageUid > 0) { // Default language element. Subsitute displayed element with localized element if ($subElementArr['el']['sys_language_uid'] == 0 && is_array($subElementArr['localizationInfo'][$this->currentLanguageUid]) && ($localizedUid = $subElementArr['localizationInfo'][$this->currentLanguageUid]['localization_uid'])) { $localizedRecord = t3lib_BEfunc::getRecordWSOL('tt_content', $localizedUid, '*'); $tree = $this->apiObj->getContentTree('tt_content', $localizedRecord); $subElementArr = $tree['tree']; } } $this->containedElements[$this->containedElementsPointer]++; // Modify the flexform pointer so it points to the position of the curren sub element: $subElementPointer['position'] = $position; if (!$this->translatorMode) { $cellContent .= '<div' . ($canDragDrop ? ' class="sortableItem tpm-element t3-page-ce inactive"' : ' class="tpm-element t3-page-ce inactive"') . ' id="' . $this->addSortableItem($this->apiObj->flexform_getStringFromPointer($subElementPointer), $canDragDrop) . '">'; } $cellContent .= $this->render_framework_allSheets($subElementArr, $languageKey, $subElementPointer, $elementContentTreeArr['ds_meta']); if (!$this->translatorMode && $canCreateNew) { $cellContent .= $this->link_bottomControls($subElementPointer, $canCreateNew); } if (!$this->translatorMode) { $cellContent .= '</div>'; } } else { // Modify the flexform pointer so it points to the position of the curren sub element: $subElementPointer['position'] = $position; $cellId = $this->addSortableItem($this->apiObj->flexform_getStringFromPointer($subElementPointer), $canDragDrop); $cellFragment = '<div' . ($canDragDrop ? ' class="sortableItem tpm-element"' : ' class="tpm-element"') . ' id="' . $cellId . '"></div>'; $cellContent .= $cellFragment; } } } $cellIdStr = ''; $tmpArr = $subElementPointer; unset($tmpArr['position']); $cellId = $this->addSortableItem($this->apiObj->flexform_getStringFromPointer($tmpArr), $canDragDrop); $cellIdStr = ' id="' . $cellId . '"'; if ($canDragDrop) { $this->sortableContainers[] = $cellId; } // Add cell content to registers: if ($flagRenderBeLayout == TRUE) { $beTemplateCell = '<table width="100%" class="beTemplateCell"> <tr> <td class="bgColor6 tpm-title-cell">' . $LANG->sL($fieldContent['meta']['title'], 1) . '</td> </tr> <tr> <td ' . $cellIdStr . ' class="tpm-content-cell">' . $cellContent . '</td> </tr> </table>'; $beTemplate = str_replace('###' . $fieldID . '###', $beTemplateCell, $beTemplate); } else { $width = round(100 / count($elementContentTreeArr['sub'][$sheet][$lKey])); $cells[] = array('id' => $cellId, 'idStr' => $cellIdStr, 'title' => $LANG->sL($fieldContent['meta']['title'], 1), 'width' => $width, 'content' => $cellContent); } } } if ($flagRenderBeLayout) { //replace lang markers $beTemplate = preg_replace_callback("/###(LLL:[\\w-\\/:]+?\\.xml\\:[\\w-\\.]+?)###/", create_function('$matches', 'return $GLOBALS["LANG"]->sL($matches[1], 1);'), $beTemplate); // removes not used markers $beTemplate = preg_replace("/###field_.*?###/", '', $beTemplate); return $beTemplate; } // Compile the content area for the current element if (count($cells)) { $hookObjectsArr = $this->hooks_prepareObjectsArray('renderFrameworkClass'); $alreadyRendered = FALSE; $output = ''; foreach ($hookObjectsArr as $hookObj) { if (method_exists($hookObj, 'composeSubelements')) { $hookObj->composeSubelements($cells, $elementContentTreeArr, $output, $alreadyRendered, $this); } } if (!$alreadyRendered) { $headerCells = $contentCells = array(); foreach ($cells as $cell) { $headerCells[] = vsprintf('<td width="%4$d%%" class="bgColor6 tpm-title-cell">%3$s</td>', $cell); $contentCells[] = vsprintf('<td %2$s width="%4$d%%" class="tpm-content-cell">%5$s</td>', $cell); } $output = ' <table border="0" cellpadding="2" cellspacing="2" width="100%" class="tpm-subelement-table"> <tr>' . (count($headerCells) ? implode('', $headerCells) : '<td> </td>') . '</tr> <tr>' . (count($contentCells) ? implode('', $contentCells) : '<td> </td>') . '</tr> </table> '; } } return $output; }
/** * Renders the sub elements of the given elementContentTree array. This function basically * renders the "new" and "paste" buttons for the parent element and then traverses through * the sub elements (if any exist). The sub element's (preview-) content will be rendered * by render_framework_singleSheet(). * * Calls render_framework_allSheets() and therefore generates a recursion. * * @param array $elementContentTreeArr: Content tree starting with the element which possibly has sub elements * @param string $languageKey: Language key for current display * @param string $sheet: Key of the sheet we want to render * @return string HTML output (a table) of the sub elements and some "insert new" and "paste" buttons * @access protected * @see render_framework_allSheets(), render_framework_singleSheet() */ function render_framework_subElements($elementContentTreeArr, $languageKey, $sheet) { global $LANG; $beTemplate = ''; $flagRenderBeLayout = false; // Define l/v keys for current language: $langChildren = intval($elementContentTreeArr['ds_meta']['langChildren']); $langDisable = intval($elementContentTreeArr['ds_meta']['langDisable']); $lKey = $langDisable ? 'lDEF' : ($langChildren ? 'lDEF' : 'l' . $languageKey); $vKey = $langDisable ? 'vDEF' : ($langChildren ? 'v' . $languageKey : 'vDEF'); if (!is_array($elementContentTreeArr['sub'][$sheet]) || !is_array($elementContentTreeArr['sub'][$sheet][$lKey])) { return ''; } $output = ''; $cells = array(); $headerCells = array(); // gets the layout $beTemplate = $elementContentTreeArr['ds_meta']['beLayout']; // no layout, no special rendering $flagRenderBeLayout = $beTemplate ? TRUE : FALSE; // Traverse container fields: foreach ($elementContentTreeArr['sub'][$sheet][$lKey] as $fieldID => $fieldValuesContent) { if ($elementContentTreeArr['previewData']['sheets'][$sheet][$fieldID]['isMapped'] && is_array($fieldValuesContent[$vKey])) { $fieldContent = $fieldValuesContent[$vKey]; $cellContent = ''; // Create flexform pointer pointing to "before the first sub element": $subElementPointer = array('table' => $elementContentTreeArr['el']['table'], 'uid' => $elementContentTreeArr['el']['uid'], 'sheet' => $sheet, 'sLang' => $lKey, 'field' => $fieldID, 'vLang' => $vKey, 'position' => 0); $canCreateNew = $GLOBALS['BE_USER']->isPSet($this->calcPerms, 'pages', 'new'); if (!$this->translatorMode && $canCreateNew) { // "New" and "Paste" icon: $newIcon = '<img' . t3lib_iconWorks::skinImg($this->doc->backPath, 'gfx/new_el.gif', '') . ' style="text-align: center; vertical-align: middle;" vspace="5" hspace="1" border="0" title="' . $LANG->getLL('createnewrecord') . '" alt="" />'; $cellContent .= $this->link_new($newIcon, $subElementPointer); $cellContent .= $this->clipboardObj->element_getPasteButtons($subElementPointer); } // Render the list of elements (and possibly call itself recursively if needed): if (is_array($fieldContent['el_list'])) { foreach ($fieldContent['el_list'] as $position => $subElementKey) { $subElementArr = $fieldContent['el'][$subElementKey]; if ((!$subElementArr['el']['isHidden'] || $this->MOD_SETTINGS['tt_content_showHidden']) && $this->displayElement($subElementArr)) { // When "onlyLocalized" display mode is set and an alternative language gets displayed if ($this->MOD_SETTINGS['langDisplayMode'] == 'onlyLocalized' && $this->currentLanguageUid > 0) { // Default language element. Subsitute displayed element with localized element if ($subElementArr['el']['sys_language_uid'] == 0 && is_array($subElementArr['localizationInfo'][$this->currentLanguageUid]) && ($localizedUid = $subElementArr['localizationInfo'][$this->currentLanguageUid]['localization_uid'])) { $localizedRecord = t3lib_BEfunc::getRecordWSOL('tt_content', $localizedUid, '*'); $tree = $this->apiObj->getContentTree('tt_content', $localizedRecord); $subElementArr = $tree['tree']; } } $this->containedElements[$this->containedElementsPointer]++; // Modify the flexform pointer so it points to the position of the curren sub element: $subElementPointer['position'] = $position; $cellContent .= $this->render_framework_allSheets($subElementArr, $languageKey, $subElementPointer, $elementContentTreeArr['ds_meta']); if (!$this->translatorMode && $canCreateNew) { // "New" and "Paste" icon: $newIcon = '<img' . t3lib_iconWorks::skinImg($this->doc->backPath, 'gfx/new_el.gif', '') . ' style="text-align: center; vertical-align: middle;" vspace="5" hspace="1" border="0" title="' . $LANG->getLL('createnewrecord') . '" alt="" />'; $cellContent .= $this->link_new($newIcon, $subElementPointer); $cellContent .= $this->clipboardObj->element_getPasteButtons($subElementPointer); } } } } // Add cell content to registers: if ($flagRenderBeLayout == TRUE) { $beTemplateCell = '<table width="100%" class="beTemplateCell"><tr><td valign="top" style="background-color: ' . $this->doc->bgColor4 . '; padding-top:0; padding-bottom:0;">' . $LANG->sL($fieldContent['meta']['title'], 1) . '</td></tr><tr><td valign="top" style="padding: 5px;">' . $cellContent . '</td></tr></table>'; $beTemplate = str_replace('###' . $fieldID . '###', $beTemplateCell, $beTemplate); } else { // Add cell content to registers: $headerCells[] = '<td valign="top" width="' . round(100 / count($elementContentTreeArr['sub'][$sheet][$lKey])) . '%" style="background-color: ' . $this->doc->bgColor4 . '; padding-top:0; padding-bottom:0;">' . $LANG->sL($fieldContent['meta']['title'], 1) . '</td>'; $cells[] = '<td valign="top" width="' . round(100 / count($elementContentTreeArr['sub'][$sheet][$lKey])) . '%" style="border: 1px dashed #000; padding: 5px 5px 5px 5px;">' . $cellContent . '</td>'; } } } if ($flagRenderBeLayout) { // removes not used markers $beTemplate = preg_replace("/###field_.*?###/", '', $beTemplate); return $beTemplate; } // Compile the content area for the current element (basically what was put together above): if (count($headerCells) || count($cells)) { $output = ' <table border="0" cellpadding="2" cellspacing="2" width="100%"> <tr>' . (count($headerCells) ? implode('', $headerCells) : '<td> </td>') . '</tr> <tr>' . (count($cells) ? implode('', $cells) : '<td> </td>') . '</tr> </table> '; } return $output; }