‪TYPO3CMS  ‪main
GridColumnItem.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
19 
20 use Psr\EventDispatcher\EventDispatcherInterface;
23 use TYPO3\CMS\Backend\Utility\BackendUtility;
27 use TYPO3\CMS\Core\Imaging\IconSize;
31 
45 {
49  protected ‪$record = [];
50 
54  protected ‪$column;
55 
59  protected ‪$translations = [];
60 
62  {
63  parent::__construct(‪$context);
64  $this->column = ‪$column;
65  $this->record = ‪$record;
66  }
67 
68  public function ‪isVersioned(): bool
69  {
70  return ($this->record['_ORIG_uid'] ?? 0) > 0 || (int)($this->record['t3ver_state'] ?? 0) !== 0;
71  }
72 
73  public function ‪getPreview(): string
74  {
75  $previewRenderer = GeneralUtility::makeInstance(StandardPreviewRendererResolver::class)
76  ->resolveRendererFor(
77  'tt_content',
78  $this->record,
79  $this->context->getPageId()
80  );
81  $previewHeader = $previewRenderer->renderPageModulePreviewHeader($this);
82 
83  // Dispatch event to allow listeners adding an alternative content type
84  // specific preview or to manipulate the content elements' record data.
85  $event = GeneralUtility::makeInstance(EventDispatcherInterface::class)->dispatch(
86  new ‪PageContentPreviewRenderingEvent('tt_content', $this->record, $this->context)
87  );
88 
89  // Update the modified record data
90  $this->record = $event->getRecord();
91 
92  // Get specific preview from listeners. In case non was added,
93  // fall back to the standard preview rendering workflow.
94  $previewContent = $event->getPreviewContent();
95  if ($previewContent === null) {
96  $previewContent = $previewRenderer->renderPageModulePreviewContent($this);
97  }
98 
99  return $previewRenderer->wrapPageModulePreview($previewHeader, $previewContent, $this);
100  }
101 
102  public function ‪getWrapperClassName(): string
103  {
104  $wrapperClassNames = [];
105  if ($this->‪isDisabled()) {
106  $wrapperClassNames[] = 't3-page-ce-hidden t3js-hidden-record';
107  }
108  if ($this->‪isInconsistentLanguage()) {
109  $wrapperClassNames[] = 't3-page-ce-warning';
110  }
111 
112  return implode(' ', $wrapperClassNames);
113  }
114 
115  public function ‪isDelible(): bool
116  {
117  $backendUser = $this->‪getBackendUser();
118  if (!$backendUser->doesUserHaveAccess($this->context->getPageRecord(), ‪Permission::CONTENT_EDIT)) {
119  return false;
120  }
121  return !(bool)($backendUser->getTSConfig()['options.']['disableDelete.']['tt_content'] ?? $backendUser->getTSConfig()['options.']['disableDelete'] ?? false);
122  }
123 
124  public function ‪getDeleteUrl(): string
125  {
126  return (string)GeneralUtility::makeInstance(UriBuilder::class)->buildUriFromRoute(
127  'tce_db',
128  [
129  'cmd' => [
130  'tt_content' => [
131  $this->record['uid'] => [
132  'delete' => 1,
133  ],
134  ],
135  ],
136  'redirect' => ‪$GLOBALS['TYPO3_REQUEST']->getAttribute('normalizedParams')->getRequestUri(),
137  ]
138  );
139  }
140 
141  public function ‪getDeleteMessage(): string
142  {
143  $recordInfo = $this->record['header'] ?? '';
144  if ($this->‪getBackendUser()->shallDisplayDebugInformation()) {
145  $recordInfo .= ' [tt:content:' . $this->record['uid'] . ']';
146  }
147 
148  $refCountMsg = BackendUtility::referenceCount(
149  'tt_content',
150  $this->record['uid'],
151  LF . $this->‪getLanguageService()->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.referencesToRecord'),
152  (string)$this->‪getReferenceCount($this->record['uid'])
153  ) . BackendUtility::translationCount(
154  'tt_content',
155  $this->record['uid'],
156  LF . $this->‪getLanguageService()->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.translationsOfRecord')
157  );
158 
159  return sprintf($this->‪getLanguageService()->sL('LLL:EXT:backend/Resources/Private/Language/locallang_layout.xlf:deleteWarning'), trim($recordInfo)) . $refCountMsg;
160  }
161 
162  public function ‪getFooterInfo(): string
163  {
164  ‪$record = $this->‪getRecord();
165  $previewRenderer = GeneralUtility::makeInstance(StandardPreviewRendererResolver::class)
166  ->resolveRendererFor(
167  'tt_content',
168  ‪$record,
169  $this->context->getPageId()
170  );
171  return $previewRenderer->renderPageModulePreviewFooter($this);
172  }
173 
174  public function ‪getContentTypeLabel(): string
175  {
176  $contentTypeLabels = $this->context->getContentTypeLabels();
177  $ctype = $this->record['CType'] ?? '';
178  return $contentTypeLabels[$ctype] ??
179  BackendUtility::getLabelFromItemListMerged((int)$this->record['pid'], 'tt_content', 'CType', $ctype);
180  }
181 
182  public function ‪getIcons(): string
183  {
184  $table = 'tt_content';
185  $row = ‪$this->record;
186  $icons = [];
187 
188  $icon = $this->iconFactory
189  ->getIconForRecord($table, $row, IconSize::SMALL)
190  ->setTitle(BackendUtility::getRecordIconAltText($row, $table))
191  ->render();
192  if ($this->‪getBackendUser()->recordEditAccessInternals($table, $row)) {
193  $icon = BackendUtility::wrapClickMenuOnIcon($icon, $table, $row['uid']);
194  }
195  $icons[] = $icon;
196 
197  if ($lockInfo = BackendUtility::isRecordLocked('tt_content', $row['uid'])) {
198  $icons[] = '<a href="#" title="' . htmlspecialchars($lockInfo['msg']) . '">'
199  . $this->iconFactory->getIcon('status-user-backend', IconSize::SMALL, 'overlay-edit')->render() . '</a>';
200  }
201  return implode(' ', $icons);
202  }
203 
204  public function ‪getSiteLanguage(): ‪SiteLanguage
205  {
206  return $this->context->getSiteLanguage((int)$this->‪getRecord()['sys_language_uid']);
207  }
208 
209  public function ‪getRecord(): array
210  {
212  }
213 
214  public function ‪setRecord(array ‪$record): void
215  {
216  $this->record = ‪$record;
217  }
218 
219  public function ‪getColumn(): ‪GridColumn
220  {
222  }
223 
224  public function ‪getTranslations(): array
225  {
227  }
228 
229  public function ‪addTranslation(int $languageId, ‪GridColumnItem $translation): ‪GridColumnItem
230  {
231  $this->translations[$languageId] = $translation;
232  return $this;
233  }
234 
235  public function ‪isDisabled(): bool
236  {
237  $table = 'tt_content';
238  $row = $this->‪getRecord();
239  $enableCols = ‪$GLOBALS['TCA'][$table]['ctrl']['enablecolumns'];
240  return $enableCols['disabled'] && $row[$enableCols['disabled']]
241  || $enableCols['starttime'] && $row[$enableCols['starttime']] > ‪$GLOBALS['EXEC_TIME']
242  || $enableCols['endtime'] && $row[$enableCols['endtime']] && $row[$enableCols['endtime']] < ‪$GLOBALS['EXEC_TIME'];
243  }
244 
245  public function ‪isEditable(): bool
246  {
247  $backendUser = $this->‪getBackendUser();
248  if ($backendUser->isAdmin()) {
249  return true;
250  }
251  $pageRecord = $this->context->getPageRecord();
252  return !(bool)($pageRecord['editlock'] ?? false)
253  && $backendUser->doesUserHaveAccess($pageRecord, ‪Permission::CONTENT_EDIT)
254  && $backendUser->recordEditAccessInternals('tt_content', $this->record);
255  }
256 
257  public function ‪isDragAndDropAllowed(): bool
258  {
259  $pageRecord = $this->context->getPageRecord();
260  return (int)$this->record['l18n_parent'] === 0 &&
261  (
262  $this->‪getBackendUser()->isAdmin()
263  || ((int)$this->record['editlock'] === 0 && (int)$pageRecord['editlock'] === 0)
264  && $this->‪getBackendUser()->doesUserHaveAccess($pageRecord, ‪Permission::CONTENT_EDIT)
265  && $this->‪getBackendUser()->checkAuthMode('tt_content', 'CType', $this->record['CType'])
266  )
267  ;
268  }
269 
270  public function ‪isInconsistentLanguage(): bool
271  {
272  $allowInconsistentLanguageHandling = (bool)(BackendUtility::getPagesTSconfig($this->‪getContext()->getPageId())['mod.']['web_layout.']['allowInconsistentLanguageHandling'] ?? false);
273  return !$allowInconsistentLanguageHandling
274  && $this->‪getSiteLanguage()->getLanguageId() !== 0
275  && $this->‪getContext()->getLanguageModeIdentifier() === 'mixed'
276  && (int)$this->record['l18n_parent'] === 0;
277  }
278 
279  public function ‪getNewContentAfterUrl(): string
280  {
281  $uriBuilder = GeneralUtility::makeInstance(UriBuilder::class);
282  $pageId = $this->context->getPageId();
283 
284  return (string)$uriBuilder->buildUriFromRoute('new_content_element_wizard', [
285  'id' => $pageId,
286  'sys_language_uid' => $this->context->getSiteLanguage()->getLanguageId(),
287  'colPos' => $this->column->getColumnNumber(),
288  'uid_pid' => -$this->record['uid'],
289  'returnUrl' => ‪$GLOBALS['TYPO3_REQUEST']->getAttribute('normalizedParams')->getRequestUri(),
290  ]);
291  }
292 
293  public function ‪getVisibilityToggleUrl(): string
294  {
295  $hiddenField = ‪$GLOBALS['TCA']['tt_content']['ctrl']['enablecolumns']['disabled'];
296  if ($this->record[$hiddenField]) {
297  $value = 0;
298  } else {
299  $value = 1;
300  }
301  return GeneralUtility::makeInstance(UriBuilder::class)->buildUriFromRoute(
302  'tce_db',
303  [
304  'data' => [
305  'tt_content' => [
306  (($this->record['_ORIG_uid'] ?? false) ?: ($this->record['uid'] ?? 0)) => [
307  $hiddenField => $value,
308  ],
309  ],
310  ],
311  'redirect' => ‪$GLOBALS['TYPO3_REQUEST']->getAttribute('normalizedParams')->getRequestUri(),
312  ]
313  ) . '#element-tt_content-' . $this->record['uid'];
314  }
315 
316  public function ‪getVisibilityToggleTitle(): string
317  {
318  $hiddenField = ‪$GLOBALS['TCA']['tt_content']['ctrl']['enablecolumns']['disabled'];
319  if ($this->record[$hiddenField]) {
320  return $this->‪getLanguageService()->sL('LLL:EXT:backend/Resources/Private/Language/locallang_layout.xlf:unHide');
321  }
322  return $this->‪getLanguageService()->sL('LLL:EXT:backend/Resources/Private/Language/locallang_layout.xlf:hide');
323  }
324 
325  public function ‪getVisibilityToggleIconName(): string
326  {
327  $hiddenField = ‪$GLOBALS['TCA']['tt_content']['ctrl']['enablecolumns']['disabled'];
328  return $this->record[$hiddenField] ? 'unhide' : 'hide';
329  }
330 
331  public function ‪isVisibilityToggling(): bool
332  {
333  $hiddenField = ‪$GLOBALS['TCA']['tt_content']['ctrl']['enablecolumns']['disabled'];
334  return $hiddenField && ‪$GLOBALS['TCA']['tt_content']['columns'][$hiddenField]
335  && (
336  !(‪$GLOBALS['TCA']['tt_content']['columns'][$hiddenField]['exclude'] ?? false)
337  || $this->‪getBackendUser()->check('non_exclude_fields', 'tt_content:' . $hiddenField)
338  )
339  ;
340  }
341 
342  public function ‪getEditUrl(): string
343  {
344  $urlParameters = [
345  'edit' => [
346  'tt_content' => [
347  $this->record['uid'] => 'edit',
348  ],
349  ],
350  'returnUrl' => ‪$GLOBALS['TYPO3_REQUEST']->getAttribute('normalizedParams')->getRequestUri() . '#element-tt_content-' . $this->record['uid'],
351  ];
352  $uriBuilder = GeneralUtility::makeInstance(UriBuilder::class);
353  return (string)$uriBuilder->buildUriFromRoute('record_edit', $urlParameters) . '#element-tt_content-' . $this->record['uid'];
354  }
355 
362  protected function ‪getReferenceCount(int ‪$uid): int
363  {
364  return GeneralUtility::makeInstance(ReferenceIndex::class)->getNumberOfReferencedRecords('tt_content', ‪$uid);
365  }
366 }
‪TYPO3\CMS\Backend\View\BackendLayout\Grid\GridColumnItem\isVersioned
‪isVersioned()
Definition: GridColumnItem.php:65
‪TYPO3\CMS\Backend\Preview\StandardPreviewRendererResolver
Definition: StandardPreviewRendererResolver.php:32
‪TYPO3\CMS\Backend\View\BackendLayout\Grid\GridColumnItem\getDeleteMessage
‪getDeleteMessage()
Definition: GridColumnItem.php:138
‪TYPO3\CMS\Backend\View\BackendLayout\Grid\AbstractGridObject\getContext
‪getContext()
Definition: AbstractGridObject.php:61
‪TYPO3\CMS\Backend\View\BackendLayout\Grid\AbstractGridObject
Definition: AbstractGridObject.php:41
‪TYPO3\CMS\Backend\View\BackendLayout\Grid\GridColumnItem\$record
‪mixed[] $record
Definition: GridColumnItem.php:48
‪TYPO3\CMS\Backend\View\BackendLayout\Grid\GridColumnItem\isVisibilityToggling
‪isVisibilityToggling()
Definition: GridColumnItem.php:328
‪TYPO3\CMS\Backend\View\BackendLayout\Grid\GridColumnItem\getEditUrl
‪getEditUrl()
Definition: GridColumnItem.php:339
‪TYPO3\CMS\Core\Database\ReferenceIndex
Definition: ReferenceIndex.php:40
‪TYPO3\CMS\Backend\View\BackendLayout\Grid\GridColumnItem\isDelible
‪isDelible()
Definition: GridColumnItem.php:112
‪TYPO3\CMS\Backend\View\BackendLayout\Grid\GridColumnItem\getIcons
‪getIcons()
Definition: GridColumnItem.php:179
‪TYPO3\CMS\Backend\View\BackendLayout\Grid\GridColumnItem\__construct
‪__construct(PageLayoutContext $context, GridColumn $column, array $record)
Definition: GridColumnItem.php:58
‪TYPO3\CMS\Backend\View\BackendLayout\Grid\GridColumnItem\getFooterInfo
‪getFooterInfo()
Definition: GridColumnItem.php:159
‪TYPO3\CMS\Backend\View\BackendLayout\Grid\GridColumnItem\setRecord
‪setRecord(array $record)
Definition: GridColumnItem.php:211
‪TYPO3\CMS\Backend\View\BackendLayout\Grid\AbstractGridObject\$context
‪PageLayoutContext $context
Definition: AbstractGridObject.php:44
‪TYPO3\CMS\Backend\View\BackendLayout\Grid\GridColumnItem\getWrapperClassName
‪getWrapperClassName()
Definition: GridColumnItem.php:99
‪TYPO3\CMS\Backend\View\BackendLayout\Grid\GridColumnItem\$translations
‪GridColumnItem[] $translations
Definition: GridColumnItem.php:56
‪TYPO3\CMS\Backend\View\BackendLayout\Grid\GridColumnItem\getNewContentAfterUrl
‪getNewContentAfterUrl()
Definition: GridColumnItem.php:276
‪TYPO3\CMS\Backend\View\BackendLayout\Grid\GridColumnItem\addTranslation
‪addTranslation(int $languageId, GridColumnItem $translation)
Definition: GridColumnItem.php:226
‪TYPO3\CMS\Core\Type\Bitmask\Permission
Definition: Permission.php:26
‪TYPO3\CMS\Core\Site\Entity\SiteLanguage
Definition: SiteLanguage.php:27
‪TYPO3\CMS\Backend\View\BackendLayout\Grid\GridColumnItem\getRecord
‪getRecord()
Definition: GridColumnItem.php:206
‪TYPO3\CMS\Backend\View\BackendLayout\Grid\GridColumnItem\getVisibilityToggleTitle
‪getVisibilityToggleTitle()
Definition: GridColumnItem.php:313
‪TYPO3\CMS\Backend\View\BackendLayout\Grid\GridColumnItem\getSiteLanguage
‪getSiteLanguage()
Definition: GridColumnItem.php:201
‪TYPO3\CMS\Backend\View\BackendLayout\Grid\GridColumnItem\getPreview
‪getPreview()
Definition: GridColumnItem.php:70
‪TYPO3\CMS\Backend\View\BackendLayout\Grid\GridColumnItem\getVisibilityToggleUrl
‪getVisibilityToggleUrl()
Definition: GridColumnItem.php:290
‪TYPO3\CMS\Backend\View\BackendLayout\Grid\AbstractGridObject\getBackendUser
‪getBackendUser()
Definition: AbstractGridObject.php:71
‪TYPO3\CMS\Backend\Routing\UriBuilder
Definition: UriBuilder.php:44
‪TYPO3\CMS\Backend\View\BackendLayout\Grid\GridColumnItem\getColumn
‪getColumn()
Definition: GridColumnItem.php:216
‪TYPO3\CMS\Backend\View\BackendLayout\Grid\GridColumnItem\getDeleteUrl
‪getDeleteUrl()
Definition: GridColumnItem.php:121
‪TYPO3\CMS\Backend\View\BackendLayout\Grid
Definition: AbstractGridObject.php:18
‪TYPO3\CMS\Backend\View\BackendLayout\Grid\GridColumn
Definition: GridColumn.php:44
‪TYPO3\CMS\Backend\View\BackendLayout\Grid\GridColumnItem\isEditable
‪isEditable()
Definition: GridColumnItem.php:242
‪TYPO3\CMS\Backend\View\BackendLayout\Grid\GridColumnItem\getContentTypeLabel
‪getContentTypeLabel()
Definition: GridColumnItem.php:171
‪TYPO3\CMS\Core\Type\Bitmask\Permission\CONTENT_EDIT
‪const CONTENT_EDIT
Definition: Permission.php:55
‪TYPO3\CMS\Webhooks\Message\$uid
‪identifier readonly int $uid
Definition: PageModificationMessage.php:35
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:25
‪TYPO3\CMS\Backend\View\PageLayoutContext
Definition: PageLayoutContext.php:43
‪TYPO3\CMS\Backend\View\BackendLayout\Grid\GridColumnItem\getTranslations
‪getTranslations()
Definition: GridColumnItem.php:221
‪TYPO3\CMS\Backend\View\BackendLayout\Grid\GridColumnItem\getVisibilityToggleIconName
‪getVisibilityToggleIconName()
Definition: GridColumnItem.php:322
‪TYPO3\CMS\Backend\View\BackendLayout\Grid\GridColumnItem\getReferenceCount
‪int getReferenceCount(int $uid)
Definition: GridColumnItem.php:359
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:51
‪TYPO3\CMS\Backend\View\BackendLayout\Grid\GridColumnItem
Definition: GridColumnItem.php:45
‪TYPO3\CMS\Backend\View\BackendLayout\Grid\GridColumnItem\isInconsistentLanguage
‪isInconsistentLanguage()
Definition: GridColumnItem.php:267
‪TYPO3\CMS\Backend\View\BackendLayout\Grid\GridColumnItem\isDragAndDropAllowed
‪isDragAndDropAllowed()
Definition: GridColumnItem.php:254
‪TYPO3\CMS\Backend\View\Event\PageContentPreviewRenderingEvent
Definition: PageContentPreviewRenderingEvent.php:27
‪TYPO3\CMS\Backend\View\BackendLayout\Grid\GridColumnItem\$column
‪GridColumn $column
Definition: GridColumnItem.php:52
‪TYPO3\CMS\Backend\View\BackendLayout\Grid\AbstractGridObject\getLanguageService
‪getLanguageService()
Definition: AbstractGridObject.php:66
‪TYPO3\CMS\Backend\View\BackendLayout\Grid\GridColumnItem\isDisabled
‪isDisabled()
Definition: GridColumnItem.php:232