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