78 $this->iconFactory = GeneralUtility::makeInstance(IconFactory::class);
79 $this->inlineStackProcessor = GeneralUtility::makeInstance(InlineStackProcessor::class);
92 $this->inlineData =
$data[
'inlineData'];
97 $record =
$data[
'databaseRow'];
98 $inlineConfig =
$data[
'inlineParentConfig'];
99 $foreignTable = $inlineConfig[
'foreign_table'];
107 $this->inlineData[
'map'][$formPrefix] = $domObjectId;
112 if (!empty($inlineConfig[
'foreign_selector'])) {
113 $foreign_selector = $inlineConfig[
'foreign_selector'];
114 $valueToNormalize = $record[$foreign_selector];
115 if (is_array($record[$foreign_selector])) {
117 $valueToNormalize = implode(
',', $record[$foreign_selector]);
119 $record[$foreign_selector] = $this->
normalizeUid($valueToNormalize);
123 $appendFormFieldNames =
'[' . $foreignTable .
'][' . $record[
'uid'] .
']';
124 $objectId = $domObjectId .
'-' . $foreignTable .
'-' . $record[
'uid'];
127 $combinationHtml =
'';
128 $isNewRecord =
$data[
'command'] ===
'new';
130 if (isset(
$data[
'processedTca'][
'ctrl'][
'enablecolumns'][
'disabled'])) {
131 $hiddenField =
$data[
'processedTca'][
'ctrl'][
'enablecolumns'][
'disabled'];
133 if (!
$data[
'isInlineDefaultLanguageRecordInLocalizedParentContext']) {
134 if ($isNewRecord ||
$data[
'isInlineChildExpanded']) {
136 $combinationHtml =
'';
137 if (isset(
$data[
'combinationChild'])) {
139 $combinationHtml = $combinationChild[
'html'];
143 $html = $childArray[
'html'];
147 $html =
'<!--notloaded-->';
151 $html .=
'<input type="hidden" name="data' . htmlspecialchars($appendFormFieldNames)
152 .
'[pid]" value="' . htmlspecialchars($record[
'pid']) .
'"/>';
154 $ucFieldName =
'uc[inlineView]'
155 .
'[' .
$data[
'inlineTopMostParentTableName'] .
']'
156 .
'[' .
$data[
'inlineTopMostParentUid'] .
']'
157 . $appendFormFieldNames;
158 $html .=
'<input type="hidden" name="' . htmlspecialchars($ucFieldName)
159 .
'" value="' . (int)
$data[
'isInlineChildExpanded'] .
'" />';
162 $html .=
'<input type="hidden" name="cmd' . htmlspecialchars($appendFormFieldNames)
163 .
'[delete]" value="1" disabled="disabled" />';
164 if (!
$data[
'isInlineChildExpanded'] && !empty($hiddenField)) {
165 $checked = !empty($record[$hiddenField]) ?
' checked="checked"' :
'';
166 $html .=
'<input type="checkbox" data-formengine-input-name="data'
167 . htmlspecialchars($appendFormFieldNames)
168 .
'[' . htmlspecialchars($hiddenField) .
']" value="1"' . $checked .
' />';
169 $html .=
'<input type="input" name="data' . htmlspecialchars($appendFormFieldNames)
170 .
'[' . htmlspecialchars($hiddenField) .
']" value="' . htmlspecialchars($record[$hiddenField]) .
'" />';
174 $class =
$data[
'isInlineChildExpanded'] ?
'panel-visible' :
'panel-collapsed';
176 $hiddenFieldHtml = implode(LF, $resultArray[
'additionalHiddenFields'] ?? []);
178 if ($inlineConfig[
'renderFieldsOnly']) {
180 $html = $html . $combinationHtml;
183 if (
$data[
'isInlineDefaultLanguageRecordInLocalizedParentContext']) {
184 $class .=
' t3-form-field-container-inline-placeHolder';
186 if (!empty($hiddenField) && isset($record[$hiddenField]) && (
int)$record[$hiddenField]) {
187 $class .=
' t3-form-field-container-inline-hidden';
189 $class .= ($isNewRecord ?
' inlineIsNewRecord' :
'');
190 $tableUniqueOriginalValue =
'';
191 if (isset(
$data[
'inlineData'][
'unique'][$domObjectId .
'-' . $foreignTable][
'used'][$record[
'uid']])) {
192 $uniqueValueValues =
$data[
'inlineData'][
'unique'][$domObjectId .
'-' . $foreignTable][
'used'][$record[
'uid']];
194 $tableUniqueOriginalValue = ($uniqueValueValues[
'table'] ?? $foreignTable) .
'_' . ($uniqueValueValues[
'uid'] ?? $uniqueValueValues);
197 <div class="panel panel-default panel-condensed ' . trim($class) .
'" id="' . htmlspecialchars($objectId) .
'_div" data-table-unique-original-value="' . htmlspecialchars($tableUniqueOriginalValue) .
'">
198 <div class="panel-heading" data-toggle="formengine-inline" id="' . htmlspecialchars($objectId) .
'_header" data-expandSingle="' . ($inlineConfig[
'appearance'][
'expandSingle'] ? 1 : 0) .
'">
199 <div class="form-irre-header">
200 <div class="form-irre-header-cell form-irre-header-icon">
201 <span class="caret"></span>
206 <div class="panel-collapse" id="' . htmlspecialchars($objectId) .
'_fields">' . $html . $hiddenFieldHtml . $combinationHtml .
'</div>
210 $resultArray[
'html'] = $html;
222 $domObjectId = $this->inlineStackProcessor->getCurrentStructureDomObjectIdPrefix(
$data[
'inlineFirstPid']);
223 $data[
'tabAndInlineStack'][] = [
225 $domObjectId .
'-' .
$data[
'tableName'] .
'-' .
$data[
'databaseRow'][
'uid'],
229 $data[
'renderType'] =
'fullRecordContainer';
230 return $this->nodeFactory->create(
$data)->render();
246 $childData =
$data[
'combinationChild'];
247 $parentConfig =
$data[
'inlineParentConfig'];
250 if (isset($parentConfig[
'readOnly']) && $parentConfig[
'readOnly']) {
251 foreach ($childData[
'processedTca'][
'columns'] as $columnName => $columnConfiguration) {
252 $childData[
'processedTca'][
'columns'][$columnName][
'config'][
'readOnly'] =
true;
259 if (!isset($parentConfig[
'appearance'][
'suppressCombinationWarning']) || empty($parentConfig[
'appearance'][
'suppressCombinationWarning'])) {
260 $combinationWarningMessage =
'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:warning.inline_use_combination';
261 if (!empty($parentConfig[
'appearance'][
'overwriteCombinationWarningMessage'])) {
262 $combinationWarningMessage = $parentConfig[
'appearance'][
'overwriteCombinationWarningMessage'];
268 $markup[] =
'<div class="alert alert-warning">';
269 $markup[] =
' <div class="media">';
270 $markup[] =
' <div class="media-left">';
271 $markup[] =
' <span class="fa-stack fa-lg">';
272 $markup[] =
' <i class="fa fa-circle fa-stack-2x"></i>';
273 $markup[] =
' <i class="fa fa-exclamation fa-stack-1x"></i>';
274 $markup[] =
' </span>';
275 $markup[] =
' </div>';
276 $markup[] =
' <div class="media-body">';
277 $markup[] =
' <div class="alert-message">' . htmlspecialchars($message) .
'</div>';
278 $markup[] =
' </div>';
279 $markup[] =
' </div>';
280 $markup[] =
'</div>';
281 $resultArray[
'html'] = implode(LF, $markup);
288 if ($childData[
'command'] ===
'new') {
289 $comboFormFieldName =
'data[' . $childData[
'tableName'] .
'][' . $childData[
'databaseRow'][
'uid'] .
'][pid]';
290 $resultArray[
'html'] .=
'<input type="hidden" name="' . htmlspecialchars($comboFormFieldName) .
'" value="' . htmlspecialchars($childData[
'databaseRow'][
'pid']) .
'" />';
293 if ($childData[
'command'] ===
'new' || $parentConfig[
'foreign_unique'] === $parentConfig[
'foreign_selector']) {
294 $parentFormFieldName =
'data' . $appendFormFieldNames .
'[' . $parentConfig[
'foreign_selector'] .
']';
295 $resultArray[
'html'] .=
'<input type="hidden" name="' . htmlspecialchars($parentFormFieldName) .
'" value="' . htmlspecialchars($childData[
'databaseRow'][
'uid']) .
'" />';
311 $inlineConfig =
$data[
'inlineParentConfig'];
312 $foreignTable = $inlineConfig[
'foreign_table'];
313 $rec =
$data[
'databaseRow'];
315 $domObjectId = $this->inlineStackProcessor->getCurrentStructureDomObjectIdPrefix(
$data[
'inlineFirstPid']);
316 $objectId = $domObjectId .
'-' . $foreignTable .
'-' . $rec[
'uid'];
318 $recordTitle =
$data[
'recordTitle'];
319 if (!empty($recordTitle)) {
321 if (empty(
$data[
'processedTca'][
'ctrl'][
'formattedLabel_userFunc'])) {
325 $recordTitle =
'<em>[' . htmlspecialchars($languageService->sL(
'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.no_title')) .
']</em>';
330 $iconImg =
'<span title="' . $altText .
'" id="' . htmlspecialchars($objectId) .
'_icon' .
'">' . $this->iconFactory->getIconForRecord($foreignTable, $rec,
Icon::SIZE_SMALL)->render() .
'</span>';
331 $label =
'<span id="' . $objectId .
'_label">' . $recordTitle .
'</span>';
336 if (
$GLOBALS[
'TYPO3_CONF_VARS'][
'GFX'][
'thumbnails'] && !empty($inlineConfig[
'appearance'][
'headerThumbnail'][
'field'])) {
337 $fieldValue = $rec[$inlineConfig[
'appearance'][
'headerThumbnail'][
'field']];
338 $fileUid = $fieldValue[0][
'uid'];
340 if (!empty($fileUid)) {
343 }
catch (\InvalidArgumentException $e) {
346 if ($fileObject && $fileObject->isMissing()) {
347 $thumbnail .=
'<span class="label label-danger">'
348 . htmlspecialchars(static::getLanguageService()->sL(
'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:warning.file_missing'))
349 .
'</span> ' . htmlspecialchars($fileObject->getName()) .
'<br />';
350 } elseif ($fileObject) {
351 $imageSetup = $inlineConfig[
'appearance'][
'headerThumbnail'];
352 unset($imageSetup[
'field']);
353 if (!empty($rec[
'crop'])) {
354 $imageSetup[
'crop'] = $rec[
'crop'];
356 $imageSetup = array_merge([
'width' =>
'45',
'height' =>
'45c'], $imageSetup);
358 if (
$GLOBALS[
'TYPO3_CONF_VARS'][
'GFX'][
'thumbnails']
359 && GeneralUtility::inList(
$GLOBALS[
'TYPO3_CONF_VARS'][
'GFX'][
'imagefile_ext'], $fileObject->getExtension())) {
362 if ($processedImage->getProperty(
'width')) {
363 $imageUrl = $processedImage->getPublicUrl(
true);
364 $thumbnail =
'<img src="' . $imageUrl .
'" ' .
365 'width="' . $processedImage->getProperty(
'width') .
'" ' .
366 'height="' . $processedImage->getProperty(
'height') .
'" ' .
367 'alt="' . htmlspecialchars($altText) .
'" ' .
368 'title="' . htmlspecialchars($altText) .
'">';
377 if (!empty($inlineConfig[
'appearance'][
'headerThumbnail'][
'field']) && $thumbnail) {
378 $mediaContainer =
'<div class="form-irre-header-cell form-irre-header-thumbnail" id="' . $objectId .
'_thumbnailcontainer">' . $thumbnail .
'</div>';
380 $mediaContainer =
'<div class="form-irre-header-cell form-irre-header-icon" id="' . $objectId .
'_iconcontainer">' . $iconImg .
'</div>';
382 $header = $mediaContainer .
'
383 <div class="form-irre-header-cell form-irre-header-body">' . $label .
'</div>
384 <div class="form-irre-header-cell form-irre-header-control t3js-formengine-irre-control">' . $ctrl .
'</div>';
399 $rec =
$data[
'databaseRow'];
400 $inlineConfig =
$data[
'inlineParentConfig'];
401 $foreignTable = $inlineConfig[
'foreign_table'];
417 $isNewItem = strpos($rec[
'uid'],
'NEW') === 0;
418 $isParentReadOnly = isset($inlineConfig[
'readOnly']) && $inlineConfig[
'readOnly'];
420 $tcaTableCtrl =
$GLOBALS[
'TCA'][$foreignTable][
'ctrl'];
421 $tcaTableCols =
$GLOBALS[
'TCA'][$foreignTable][
'columns'];
422 $isPagesTable = $foreignTable ===
'pages';
423 $isSysFileReferenceTable = $foreignTable ===
'sys_file_reference';
424 $enableManualSorting = $tcaTableCtrl[
'sortby'] || $inlineConfig[
'MM'] || !
$data[
'isOnSymmetricSide']
425 && $inlineConfig[
'foreign_sortby'] ||
$data[
'isOnSymmetricSide'] && $inlineConfig[
'symmetric_sortby'];
426 $nameObject = $this->inlineStackProcessor->getCurrentStructureDomObjectIdPrefix(
$data[
'inlineFirstPid']);
427 $nameObjectFt = $nameObject .
'-' . $foreignTable;
428 $nameObjectFtId = $nameObjectFt .
'-' . $rec[
'uid'];
431 $localCalcPerms =
false;
438 $enabledControls = $inlineConfig[
'appearance'][
'enabledControls'];
440 foreach ($this->hookObjects as $hookObj) {
442 $hookObj->renderForeignRecordHeaderControl_preProcess(
$data[
'inlineParentUid'], $foreignTable, $rec, $inlineConfig,
$data[
'isInlineDefaultLanguageRecordInLocalizedParentContext'], $enabledControls);
444 if (
$data[
'isInlineDefaultLanguageRecordInLocalizedParentContext']) {
445 $cells[
'localize'] =
'<span title="' . htmlspecialchars($languageService->sL(
'LLL:EXT:core/Resources/Private/Language/locallang_misc.xlf:localize.isLocalizable')) .
'">
446 ' . $this->iconFactory->getIcon(
'actions-edit-localize-status-low',
Icon::SIZE_SMALL)->render() .
'
451 if ($rec[
'table_local'] ===
'sys_file') {
452 $uid = $rec[
'uid_local'][0][
'uid'];
456 $table = $foreignTable;
458 if ($enabledControls[
'info']) {
460 $cells[
'info'] =
'<span class="btn btn-default disabled">' . $this->iconFactory->getIcon(
'empty-empty',
Icon::SIZE_SMALL)->render() .
'</span>';
463 <a class="btn btn-default" href="#" onclick="' . htmlspecialchars(
'top.TYPO3.InfoWindow.showItem(' . GeneralUtility::quoteJSvalue($table) .
', ' . GeneralUtility::quoteJSvalue($uid) .
'); return false;') .
'" title="' . htmlspecialchars($languageService->sL(
'LLL:EXT:core/Resources/Private/Language/locallang_mod_web_list.xlf:showInfo')) .
'">
464 ' . $this->iconFactory->getIcon(
'actions-document-info',
Icon::SIZE_SMALL)->render() .
'
469 if (!$isParentReadOnly && !$tcaTableCtrl[
'readOnly'] && !
$data[
'isInlineDefaultLanguageRecordInLocalizedParentContext']) {
471 if ($enabledControls[
'new'] && ($enableManualSorting || $tcaTableCtrl[
'useColumnsForDefaultValues'])) {
473 $onClick =
'return inline.createNewRecord(' . GeneralUtility::quoteJSvalue($nameObjectFt) .
',' . GeneralUtility::quoteJSvalue($rec[
'uid']) .
')';
475 if ($inlineConfig[
'inline'][
'inlineNewButtonStyle']) {
476 $style =
' style="' . $inlineConfig[
'inline'][
'inlineNewButtonStyle'] .
'"';
479 <a class="btn btn-default inlineNewButton ' . $this->inlineData[
'config'][$nameObject][
'md5'] .
'" href="#" onclick="' . htmlspecialchars($onClick) .
'" title="' . htmlspecialchars($languageService->sL(
'LLL:EXT:core/Resources/Private/Language/locallang_mod_web_list.xlf:new' . ($isPagesTable ?
'Page' :
'Record'))) .
'" ' . $style .
'>
480 ' . $this->iconFactory->getIcon(
'actions-' . ($isPagesTable ?
'page-new' :
'add'),
Icon::SIZE_SMALL)->render() .
'
485 if ($enabledControls[
'sort'] && $permsEdit && $enableManualSorting) {
487 $onClick =
'return inline.changeSorting(' . GeneralUtility::quoteJSvalue($nameObjectFtId) .
', \'1\')';
488 $icon =
'actions-move-up';
490 if ($inlineConfig[
'inline'][
'first'] == $rec[
'uid']) {
491 $class =
' disabled';
492 $icon =
'empty-empty';
494 $cells[
'sort.up'] =
'
495 <a class="btn btn-default sortingUp' . $class .
'" href="#" onclick="' . htmlspecialchars($onClick) .
'" title="' . htmlspecialchars($languageService->sL(
'LLL:EXT:core/Resources/Private/Language/locallang_mod_web_list.xlf:moveUp')) .
'">
499 $onClick =
'return inline.changeSorting(' . GeneralUtility::quoteJSvalue($nameObjectFtId) .
', \'-1\')';
500 $icon =
'actions-move-down';
502 if ($inlineConfig[
'inline'][
'last'] == $rec[
'uid']) {
503 $class =
' disabled';
504 $icon =
'empty-empty';
507 $cells[
'sort.down'] =
'
508 <a class="btn btn-default sortingDown' . $class .
'" href="#" onclick="' . htmlspecialchars($onClick) .
'" title="' . htmlspecialchars($languageService->sL(
'LLL:EXT:core/Resources/Private/Language/locallang_mod_web_list.xlf:moveDown')) .
'">
513 if (($rec[
'table_local'] ===
'sys_file') && !$isNewItem && $backendUser->check(
'tables_modify',
'sys_file_metadata')) {
514 $sys_language_uid = 0;
515 if (!empty($rec[
'sys_language_uid'])) {
516 $sys_language_uid = $rec[
'sys_language_uid'][0];
518 $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
519 ->getQueryBuilderForTable(
'sys_file_metadata');
520 $recordInDatabase = $queryBuilder
522 ->from(
'sys_file_metadata')
524 $queryBuilder->expr()->eq(
526 $queryBuilder->createNamedParameter($uid, \PDO::PARAM_INT)
528 $queryBuilder->expr()->eq(
530 $queryBuilder->createNamedParameter($sys_language_uid, \PDO::PARAM_INT)
536 if (!empty($recordInDatabase)) {
537 $uriBuilder = GeneralUtility::makeInstance(\
TYPO3\CMS\Backend\Routing\UriBuilder::class);
538 $url = (string)$uriBuilder->buildUriFromRoute(
'record_edit', [
539 'edit[sys_file_metadata][' . (
int)$recordInDatabase[
'uid'] .
']' =>
'edit',
540 'returnUrl' => $this->data[
'returnUrl']
542 $title = $languageService->sL(
'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:cm.editMetadata');
544 <a class="btn btn-default" href="' . htmlspecialchars($url) .
'" title="' . htmlspecialchars($title) .
'">
554 $title = htmlspecialchars($languageService->sL(
'LLL:EXT:core/Resources/Private/Language/locallang_mod_web_list.xlf:delete'));
555 $icon = $this->iconFactory->getIcon(
'actions-edit-delete',
Icon::SIZE_SMALL)->render();
556 $cells[
'delete'] =
'<a href="#" class="btn btn-default t3js-editform-delete-inline-record" data-objectid="' . htmlspecialchars($nameObjectFtId) .
'" title="' . $title .
'">' . $icon .
'</a>';
560 $hiddenField = $tcaTableCtrl[
'enablecolumns'][
'disabled'];
561 if ($enabledControls[
'hide'] && $permsEdit && $hiddenField && $tcaTableCols[$hiddenField] && (!$tcaTableCols[$hiddenField][
'exclude'] || $backendUser->check(
'non_exclude_fields', $foreignTable .
':' . $hiddenField))) {
562 $onClick =
'return inline.enableDisableRecord(' . GeneralUtility::quoteJSvalue($nameObjectFtId) .
',' .
563 GeneralUtility::quoteJSvalue($hiddenField) .
')';
564 $className =
't3js-' . $nameObjectFtId .
'_disabled';
565 if ($rec[$hiddenField]) {
566 $title = htmlspecialchars($languageService->sL(
'LLL:EXT:core/Resources/Private/Language/locallang_mod_web_list.xlf:unHide' . ($isPagesTable ?
'Page' :
'')));
568 <a class="btn btn-default hiddenHandle ' . $className .
'" href="#" onclick="
569 ' . htmlspecialchars($onClick) .
'"' .
'title="' . $title .
'">
570 ' . $this->iconFactory->getIcon(
'actions-edit-unhide',
Icon::SIZE_SMALL)->render() .
'
573 $title = htmlspecialchars($languageService->sL(
'LLL:EXT:core/Resources/Private/Language/locallang_mod_web_list.xlf:hide' . ($isPagesTable ?
'Page' :
'')));
575 <a class="btn btn-default hiddenHandle ' . $className .
'" href="#" onclick="
576 ' . htmlspecialchars($onClick) .
'"' .
'title="' . $title .
'">
577 ' . $this->iconFactory->getIcon(
'actions-edit-hide',
Icon::SIZE_SMALL)->render() .
'
582 if ($enabledControls[
'dragdrop'] && $permsEdit && $enableManualSorting && $inlineConfig[
'appearance'][
'useSortable']) {
583 $cells[
'dragdrop'] =
'
584 <span class="btn btn-default sortableHandle" data-id="' . htmlspecialchars($rec[
'uid']) .
'" title="' . htmlspecialchars($languageService->sL(
'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.move')) .
'">
585 ' . $this->iconFactory->getIcon(
'actions-move-move',
Icon::SIZE_SMALL)->render() .
'
588 } elseif (
$data[
'isInlineDefaultLanguageRecordInLocalizedParentContext'] && $isParentExisting) {
589 if ($enabledControls[
'localize'] &&
$data[
'isInlineDefaultLanguageRecordInLocalizedParentContext']) {
590 $onClick =
'inline.synchronizeLocalizeRecords(' . GeneralUtility::quoteJSvalue($nameObjectFt) .
', ' . GeneralUtility::quoteJSvalue($rec[
'uid']) .
');';
591 $cells[
'localize'] =
'
592 <a class="btn btn-default" href="#" onclick="' . htmlspecialchars($onClick) .
'" title="' . htmlspecialchars($languageService->sL(
'LLL:EXT:core/Resources/Private/Language/locallang_misc.xlf:localize')) .
'">
593 ' . $this->iconFactory->getIcon(
'actions-document-localize',
Icon::SIZE_SMALL)->render() .
'
600 <a class="btn btn-default" href="#" data-toggle="tooltip" data-title="' . htmlspecialchars($lockInfo[
'msg']) .
'">
601 ' .
'<span title="' . htmlspecialchars($lockInfo[
'msg']) .
'">' . $this->iconFactory->getIcon(
'warning-in-use',
Icon::SIZE_SMALL)->render() .
'</span>' .
'
605 foreach ($this->hookObjects as $hookObj) {
606 $hookObj->renderForeignRecordHeaderControl_postProcess(
$data[
'inlineParentUid'], $foreignTable, $rec, $inlineConfig,
$data[
'isInlineDefaultLanguageRecordInLocalizedParentContext'], $cells);
610 if (!empty($cells[
'edit']) || !empty($cells[
'hide']) || !empty($cells[
'delete'])) {
611 $out .=
'<div class="btn-group btn-group-sm" role="group">' . $cells[
'edit'] . $cells[
'hide'] . $cells[
'delete'] .
'</div>';
612 unset($cells[
'edit'], $cells[
'hide'], $cells[
'delete']);
614 if (!empty($cells[
'info']) || !empty($cells[
'new']) || !empty($cells[
'sort.up']) || !empty($cells[
'sort.down']) || !empty($cells[
'dragdrop'])) {
615 $out .=
'<div class="btn-group btn-group-sm" role="group">' . $cells[
'info'] . $cells[
'new'] . $cells[
'sort.up'] . $cells[
'sort.down'] . $cells[
'dragdrop'] .
'</div>';
616 unset($cells[
'info'], $cells[
'new'], $cells[
'sort.up'], $cells[
'sort.down'], $cells[
'dragdrop']);
618 if (!empty($cells[
'localize'])) {
619 $out .=
'<div class="btn-group btn-group-sm" role="group">' . $cells[
'localize'] .
'</div>';
620 unset($cells[
'localize']);
622 if (!empty($cells)) {
623 $out .=
' <div class="btn-group btn-group-sm" role="group">' . implode(
'', $cells) .
'</div>';
636 $parts = explode(
'|', $string);
649 $this->hookObjects = [];
650 foreach (
$GLOBALS[
'TYPO3_CONF_VARS'][
'SC_OPTIONS'][
't3lib/class.t3lib_tceforms_inline.php'][
'tceformsInlineHook'] ?? [] as $className) {
651 $processObject = GeneralUtility::makeInstance($className);
652 if (!$processObject instanceof InlineElementHookInterface) {
653 throw new \UnexpectedValueException($className .
' must implement interface ' . InlineElementHookInterface::class, 1202072000);
655 $this->hookObjects[] = $processObject;