[!!!][TASK] Remove tce_db options "prErr" and "uPT"
[Packages/TYPO3.CMS.git] / typo3 / sysext / backend / Classes / Clipboard / Clipboard.php
index 30848c5..a763d57 100644 (file)
@@ -16,15 +16,15 @@ namespace TYPO3\CMS\Backend\Clipboard;
 
 use TYPO3\CMS\Backend\Utility\BackendUtility;
 use TYPO3\CMS\Core\Database\ConnectionPool;
-use TYPO3\CMS\Core\Database\Query\QueryContextType;
+use TYPO3\CMS\Core\Database\Query\Restriction\DeletedRestriction;
 use TYPO3\CMS\Core\Imaging\Icon;
 use TYPO3\CMS\Core\Imaging\IconFactory;
-use TYPO3\CMS\Core\Imaging\IconProvider\SvgIconProvider;
 use TYPO3\CMS\Core\Resource\ResourceFactory;
 use TYPO3\CMS\Core\Type\Bitmask\JsConfirmation;
 use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
 use TYPO3\CMS\Core\Utility\MathUtility;
+use TYPO3\CMS\Fluid\View\StandaloneView;
 
 /**
  * TYPO3 clipboard for records and files
@@ -57,7 +57,7 @@ class Clipboard
      *
      * @var array
      */
-    public $clipData = array();
+    public $clipData = [];
 
     /**
      * @var int
@@ -87,11 +87,19 @@ class Clipboard
     protected $iconFactory;
 
     /**
+     * @var StandaloneView
+     */
+    protected $view;
+
+    /**
      * Construct
+     * @throws \TYPO3\CMS\Extbase\Mvc\Exception\InvalidExtensionNameException
+     * @throws \InvalidArgumentException
      */
     public function __construct()
     {
         $this->iconFactory = GeneralUtility::makeInstance(IconFactory::class);
+        $this->view = $this->getStandaloneView();
     }
 
     /*****************************************
@@ -101,8 +109,6 @@ class Clipboard
      ****************************************/
     /**
      * Initialize the clipboard from the be_user session
-     *
-     * @return void
      */
     public function initializeClipboard()
     {
@@ -114,9 +120,9 @@ class Clipboard
             $this->numberTabs = MathUtility::forceIntegerInRange($clNP, 0, 20);
         }
         // Resets/reinstates the clipboard pads
-        $this->clipData['normal'] = is_array($clipData['normal']) ? $clipData['normal'] : array();
+        $this->clipData['normal'] = is_array($clipData['normal']) ? $clipData['normal'] : [];
         for ($a = 1; $a <= $this->numberTabs; $a++) {
-            $this->clipData['tab_' . $a] = is_array($clipData['tab_' . $a]) ? $clipData['tab_' . $a] : array();
+            $this->clipData['tab_' . $a] = is_array($clipData['tab_' . $a]) ? $clipData['tab_' . $a] : [];
         }
         // Setting the current pad pointer ($this->current))
         $this->clipData['current'] = ($this->current = isset($this->clipData[$clipData['current']]) ? $clipData['current'] : 'normal');
@@ -126,8 +132,6 @@ class Clipboard
      * Call this method after initialization if you want to lock the clipboard to operate on the normal pad only.
      * Trying to switch pad through ->setCmd will not work.
      * This is used by the clickmenu since it only allows operation on single elements at a time (that is the "normal" pad)
-     *
-     * @return void
      */
     public function lockToNormal()
     {
@@ -145,13 +149,12 @@ class Clipboard
      * Selecting elements for 'copy' should be done by simultaneously setting setCopyMode.
      *
      * @param array $cmd Array of actions, see function description
-     * @return void
      */
     public function setCmd($cmd)
     {
         if (is_array($cmd['el'])) {
             foreach ($cmd['el'] as $k => $v) {
-                if ($this->current == 'normal') {
+                if ($this->current === 'normal') {
                     unset($this->clipData['normal']);
                 }
                 if ($v) {
@@ -173,7 +176,7 @@ class Clipboard
         }
         // Remove all on current pad (value = pad-ident)
         if ($cmd['removeAll']) {
-            $this->clipData[$cmd['removeAll']] = array();
+            $this->clipData[$cmd['removeAll']] = [];
             $this->changed = 1;
         }
         // Set copy mode of the tab
@@ -187,7 +190,6 @@ class Clipboard
      * Setting the current pad on clipboard
      *
      * @param string $padIdent Key in the array $this->clipData
-     * @return void
      */
     public function setCurrentPad($padIdent)
     {
@@ -196,7 +198,7 @@ class Clipboard
             if (isset($this->clipData[$padIdent])) {
                 $this->clipData['current'] = ($this->current = $padIdent);
             }
-            if ($this->current != 'normal' || !$this->isElements()) {
+            if ($this->current !== 'normal' || !$this->isElements()) {
                 $this->clipData[$this->current]['mode'] = '';
             }
             // Setting mode to default (move) if no items on it or if not 'normal'
@@ -207,8 +209,6 @@ class Clipboard
     /**
      * Call this after initialization and setCmd in order to save the clipboard to the user session.
      * The function will check if the internal flag ->changed has been set and if so, save the clipboard. Else not.
-     *
-     * @return void
      */
     public function endClipboard()
     {
@@ -248,45 +248,43 @@ class Clipboard
      * Prints the clipboard
      *
      * @return string HTML output
+     * @throws \BadFunctionCallException
      */
     public function printClipboard()
     {
         $languageService = $this->getLanguageService();
-        $out = array();
         $elementCount = count($this->elFromTable($this->fileMode ? '_FILE' : ''));
         // Copymode Selector menu
         $copymodeUrl = GeneralUtility::linkThisScript();
-        $moveLabel = htmlspecialchars($languageService->sL('LLL:EXT:lang/locallang_misc.xlf:moveElements'));
-        $copyLabel = htmlspecialchars($languageService->sL('LLL:EXT:lang/locallang_misc.xlf:copyElements'));
 
-        $copymodeSelector = '
-                       <div class="btn-group">
-                               <button class="btn btn-default dropdown-toggle" type="button" id="copymodeSelector" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">
-                                       ' . ($this->currentMode() === 'copy' ? $copyLabel : $moveLabel) . '
-                                       <span class="caret"></span>
-                               </button>
-                               <ul class="dropdown-menu" aria-labelledby="copymodeSelector">
-                                       <li><a href="#" onclick="document.getElementById(\'clipboard_form\').method=\'POST\'; document.getElementById(\'clipboard_form\').action=' . htmlspecialchars(GeneralUtility::quoteJSvalue($copymodeUrl . '&CB[setCopyMode]=')) . '; document.getElementById(\'clipboard_form\').submit(); return true;">' . $moveLabel . '</a></li>
-                                       <li><a href="#" onclick="document.getElementById(\'clipboard_form\').method=\'POST\'; document.getElementById(\'clipboard_form\').action=' . htmlspecialchars(GeneralUtility::quoteJSvalue($copymodeUrl . '&CB[setCopyMode]=1')) . '; document.getElementById(\'clipboard_form\').submit(); return true;">' . $copyLabel . '</a></li>
-                               </ul>
-                       </div>
-                       ';
+        $this->view->assign('actionCopyModeUrl', htmlspecialchars(GeneralUtility::quoteJSvalue($copymodeUrl . '&CB[setCopyMode]=')));
+        $this->view->assign('actionCopyModeUrl1', htmlspecialchars(GeneralUtility::quoteJSvalue($copymodeUrl . '&CB[setCopyMode]=1')));
+        $this->view->assign('currentMode', $this->currentMode());
+        $this->view->assign('elementCount', $elementCount);
 
-        $deleteLink = '';
-        $menuSelector = '';
         if ($elementCount) {
-            $removeAllUrl = GeneralUtility::linkThisScript(array('CB' => array('removeAll' => $this->current)));
+            $removeAllUrl = GeneralUtility::linkThisScript(['CB' => ['removeAll' => $this->current]]);
+            $this->view->assign('removeAllUrl', $removeAllUrl);
 
             // Selector menu + clear button
-            $optionArray = array();
+            $optionArray = [];
             // Import / Export link:
             if (ExtensionManagementUtility::isLoaded('impexp')) {
                 $url = BackendUtility::getModuleUrl('xMOD_tximpexp', $this->exportClipElementParameters());
-                $optionArray[] = '<li><a href="' . htmlspecialchars($url) . '">' . $this->clLabel('export', 'rm') . '</a></li>';
+                $optionArray[] = [
+                    'label' => $this->clLabel('export', 'rm'),
+                    'uri' => $url
+                ];
             }
             // Edit:
             if (!$this->fileMode) {
-                $optionArray[] = '<li><a href="#" onclick="' . htmlspecialchars(('window.location.href=' . GeneralUtility::quoteJSvalue($this->editUrl() . '&returnUrl=') . '+top.rawurlencode(window.location.href);')) . '">' . $this->clLabel('edit', 'rm') . '</a></li>';
+                $optionArray[] = [
+                    'label' => $this->clLabel('edit', 'rm'),
+                    'uri' => '#',
+                    'additionalAttributes' => [
+                        'onclick' => htmlspecialchars('window.location.href=' . GeneralUtility::quoteJSvalue($this->editUrl() . '&returnUrl=') . '+top.rawurlencode(window.location.href);'),
+                    ]
+                ];
             }
 
             // Delete referenced elements:
@@ -294,100 +292,72 @@ class Clipboard
             if ($this->getBackendUser()->jsConfirmation(JsConfirmation::DELETE)) {
                 $confirmationCheck = true;
             }
+
             $confirmationMessage = sprintf(
-                $languageService->sL('LLL:EXT:lang/locallang_core.xlf:mess.deleteClip'),
+                $languageService->sL('LLL:EXT:lang/Resources/Private/Language/locallang_core.xlf:mess.deleteClip'),
                 $elementCount
             );
             $title = $languageService
-                ->sL('LLL:EXT:lang/locallang_core.xlf:labels.clipboard.delete_elements');
+                ->sL('LLL:EXT:lang/Resources/Private/Language/locallang_core.xlf:labels.clipboard.delete_elements');
             $returnUrl = $this->deleteUrl(1, ($this->fileMode ? 1 : 0));
             $btnOkText = $languageService
-                ->sL('LLL:EXT:lang/locallang_alt_doc.xlf:buttons.confirm.delete_elements.yes');
+                ->sL('LLL:EXT:lang/Resources/Private/Language/locallang_alt_doc.xlf:buttons.confirm.delete_elements.yes');
             $btnCancelText = $languageService
-                ->sL('LLL:EXT:lang/locallang_alt_doc.xlf:buttons.confirm.delete_elements.no');
-            $optionArray[] = '<li><a'
-                . (($confirmationCheck) ? ' class="t3js-modal-trigger"' : '')
-                . ' href="' . htmlspecialchars($returnUrl) . '"'
-                . ' data-severity="warning"'
-                . ' data-button-close-text="' . htmlspecialchars($btnCancelText) . '"'
-                . ' data-button-ok-text="' . htmlspecialchars($btnOkText) . '"'
-                . ' data-content="' . htmlspecialchars($confirmationMessage) . '"'
-                . ' data-title="' . htmlspecialchars($title) . '">'
-                . htmlspecialchars($title) . '</a></li>';
+                ->sL('LLL:EXT:lang/Resources/Private/Language/locallang_alt_doc.xlf:buttons.confirm.delete_elements.no');
+            $optionArray[] = [
+                'label' => htmlspecialchars($title),
+                'uri' => $returnUrl,
+                'additionalAttributes' => [
+                    'class' => $confirmationCheck ? 't3js-modal-trigger' : '',
+                ],
+                'data' => [
+                    'severity' => 'warning',
+                    'button-close-text' => htmlspecialchars($btnCancelText),
+                    'button-ok-text' => htmlspecialchars($btnOkText),
+                    'content' => htmlspecialchars($confirmationMessage),
+                    'title' => htmlspecialchars($title)
+                ]
+            ];
 
             // Clear clipboard
-            $optionArray[] = '<li><a href="' . htmlspecialchars($removeAllUrl) . '#clip_head">' . htmlspecialchars($languageService->sL('LLL:EXT:lang/locallang_core.xlf:labels.clipboard.clear_clipboard')) . '</a></li>';
-            $deleteLink = '<a class="btn btn-danger" href="' . htmlspecialchars($removeAllUrl) . '#clip_head" title="' . htmlspecialchars($languageService->sL('LLL:EXT:lang/locallang_core.xlf:buttons.clear')) . '">' . $this->iconFactory->getIcon('actions-document-close', Icon::SIZE_SMALL)->render(SvgIconProvider::MARKUP_IDENTIFIER_INLINE) . '</a>';
-
-            // menuSelector
-            $menuSelector = '
-                       <div class="btn-group">
-                               <button class="btn btn-default dropdown-toggle" type="button" id="menuSelector" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">
-                                       ' . $this->clLabel('menu', 'rm') . '
-                                       <span class="caret"></span>
-                               </button>
-                               <ul class="dropdown-menu" aria-labelledby="menuSelector">
-                                       ' . implode('', $optionArray) . '
-                               </ul>
-                       </div>
-                       ';
+            $optionArray[] = [
+                'label' => $languageService->sL('LLL:EXT:lang/Resources/Private/Language/locallang_core.xlf:labels.clipboard.clear_clipboard', true),
+                'uri' => $removeAllUrl . '#clip_head'
+            ];
+            $this->view->assign('optionArray', $optionArray);
         }
 
-        $out[] = '
-                       <tr>
-                               <td colspan="2" nowrap="nowrap" width="95%">' . $copymodeSelector . ' ' . $menuSelector . '</td>
-                               <td nowrap="nowrap" class="col-control">' . $deleteLink . '</td>
-                       </tr>';
-
         // Print header and content for the NORMAL tab:
-        // check for current item so it can be wrapped in strong tag
-        $current = ($this->current == 'normal');
-        $out[] = '
-                       <tr>
-                               <td colspan="3"><a href="' . htmlspecialchars(GeneralUtility::linkThisScript(array('CB' => array('setP' => 'normal')))) . '#clip_head" title="' . $this->clLabel('normal-description') . '">'
-                    . '<span class="t3-icon fa ' . ($current ? 'fa-check-circle' : 'fa-circle-o') . '"></span>'
-                    . $this->padTitleWrap($this->clLabel('normal'), 'normal', $current)
-                    . '</a></td>
-                       </tr>';
-        if ($this->current == 'normal') {
-            $out = array_merge($out, $this->printContentFromTab('normal'));
+        $this->view->assign('current', $this->current);
+        $tabArray = [];
+        $tabArray['normal'] = [
+            'id' => 'normal',
+            'number' => 0,
+            'url' => GeneralUtility::linkThisScript(['CB' => ['setP' => 'normal']]),
+            'description' => 'normal-description',
+            'label' => 'labels.normal',
+            'padding' => $this->padTitle('normal')
+        ];
+        if ($this->current === 'normal') {
+            $tabArray['normal']['content'] = $this->getContentFromTab('normal');
         }
         // Print header and content for the NUMERIC tabs:
         for ($a = 1; $a <= $this->numberTabs; $a++) {
-            // check for current item so it can be wrapped in strong tag
-            $current = ($this->current == 'tab_' . $a);
-            $out[] = '
-                               <tr>
-                                       <td colspan="3"><a href="' . htmlspecialchars(GeneralUtility::linkThisScript(array('CB' => array('setP' => ('tab_' . $a))))) . '#clip_head" title="' . $this->clLabel('cliptabs-description') . '">'
-                        . '<span class="t3-icon fa ' . ($current ? 'fa-check-circle' : 'fa-circle-o') . '"></span>'
-                        . $this->padTitleWrap(sprintf($this->clLabel('cliptabs-name'), $a), ('tab_' . $a), $current)
-                        . '</a></td>
-                               </tr>';
-            if ($this->current == 'tab_' . $a) {
-                $out = array_merge($out, $this->printContentFromTab('tab_' . $a));
+            $tabArray['tab_' . $a] = [
+                'id' => 'tab_' . $a,
+                'number' => $a,
+                'url' => GeneralUtility::linkThisScript(['CB' => ['setP' => 'tab_' . $a]]),
+                'description' => 'cliptabs-description',
+                'label' => 'labels.cliptabs-name',
+                'padding' => $this->padTitle('tab_' . $a)
+            ];
+            if ($this->current === 'tab_' . $a) {
+                $tabArray['tab_' . $a]['content'] = $this->getContentFromTab('tab_' . $a);
             }
         }
-        // Wrap accumulated rows in a table:
-        $output = '<a name="clip_head"></a>
-
-                       <!--
-                               TYPO3 Clipboard:
-                       -->
-                       <div class="row">
-                               <div class="col-sm-12">
-                                       <div class="panel panel-default">
-                                               <div class="panel-heading">' . BackendUtility::wrapInHelp('xMOD_csh_corebe', 'list_clipboard', $this->clLabel('clipboard', 'buttons')) . '</div>
-                                               <table class="table">
-                                                       ' . implode('', $out) . '
-                                               </table>
-                                       </div>
-                               </div>
-                       </div>
-               ';
-        // Wrap in form tag:
-        $output = '<form action="" id="clipboard_form">' . $output . '</form>';
-        // Return the accumulated content:
-        return $output;
+        $this->view->assign('clipboardHeader', BackendUtility::wrapInHelp('xMOD_csh_corebe', 'list_clipboard', $this->clLabel('clipboard', 'buttons')));
+        $this->view->assign('tabArray', $tabArray);
+        return $this->view->render();
     }
 
     /**
@@ -397,41 +367,45 @@ class Clipboard
      * @param string $pad Pad reference
      * @return array Array with table rows for the clipboard.
      */
-    public function printContentFromTab($pad)
+    public function getContentFromTab($pad)
     {
-        $lines = array();
+        $lines = [];
         if (is_array($this->clipData[$pad]['el'])) {
             foreach ($this->clipData[$pad]['el'] as $k => $v) {
                 if ($v) {
                     list($table, $uid) = explode('|', $k);
                     // Rendering files/directories on the clipboard
-                    if ($table == '_FILE') {
+                    if ($table === '_FILE') {
                         $fileObject = ResourceFactory::getInstance()->retrieveFileOrFolderObject($v);
                         if ($fileObject) {
-                            $thumb = '';
+                            $thumb = [];
                             $folder = $fileObject instanceof \TYPO3\CMS\Core\Resource\Folder;
                             $size = $folder ? '' : '(' . GeneralUtility::formatSize($fileObject->getSize()) . 'bytes)';
-                            $icon = '<span title="' . htmlspecialchars($fileObject->getName() . ' ' . $size) . '">' . $this->iconFactory->getIconForResource($fileObject, Icon::SIZE_SMALL)->render() . '</span>';
-                            if (!$folder && GeneralUtility::inList($GLOBALS['TYPO3_CONF_VARS']['GFX']['imagefile_ext'], $fileObject->getExtension())) {
-                                $processedFile = $fileObject->process(\TYPO3\CMS\Core\Resource\ProcessedFile::CONTEXT_IMAGEPREVIEW, array());
-                                if ($processedFile) {
-                                    $thumbUrl = $processedFile->getPublicUrl(true);
-                                    $thumb = '<br /><img src="' . htmlspecialchars($thumbUrl) . '" ' .
-                                            'width="' . $processedFile->getProperty('width') . '" ' .
-                                            'height="' . $processedFile->getProperty('height') . '" ' .
-                                            'title="' . htmlspecialchars($fileObject->getName()) . '" alt="" />';
-                                }
+                            if (
+                                !$folder
+                                && GeneralUtility::inList(
+                                    $GLOBALS['TYPO3_CONF_VARS']['GFX']['imagefile_ext'],
+                                    $fileObject->getExtension()
+                                )
+                            ) {
+                                $thumb = [
+                                    'image' => $fileObject->process(\TYPO3\CMS\Core\Resource\ProcessedFile::CONTEXT_IMAGEPREVIEW, []),
+                                    'title' => htmlspecialchars($fileObject->getName())
+                                ];
                             }
-                            $lines[] = '
-                                                               <tr>
-                                                                       <td nowrap="nowrap" class="col-icon">' . $icon . '</td>
-                                                                       <td nowrap="nowrap" width="95%">' . $this->linkItemText(htmlspecialchars(GeneralUtility::fixed_lgd_cs($fileObject->getName(), $this->getBackendUser()->uc['titleLen'])), $fileObject->getName()) . ($pad == 'normal' ? ' <strong>(' . ($this->clipData['normal']['mode'] == 'copy' ? $this->clLabel('copy', 'cm') : $this->clLabel('cut', 'cm')) . ')</strong>' : '') . '&nbsp;' . $thumb . '</td>
-                                                                       <td nowrap="nowrap" class="col-control">
-                                                                               <div class="btn-group">
-                                                                                       <a class="btn btn-default" href="#" onclick="' . htmlspecialchars(('top.launchView(' . GeneralUtility::quoteJSvalue($table) . ', ' . GeneralUtility::quoteJSvalue($v) . '); return false;')) . '"title="' . $this->clLabel('info', 'cm') . '">' . $this->iconFactory->getIcon('actions-document-info', Icon::SIZE_SMALL)->render() . '</a>' . '<a class="btn btn-default" href="' . htmlspecialchars($this->removeUrl('_FILE', GeneralUtility::shortMD5($v))) . '#clip_head" title="' . $this->clLabel('removeItem') . '">' . $this->iconFactory->getIcon('actions-selection-delete', Icon::SIZE_SMALL)->render() . '</a>
-                                                                               </div>
-                                                                       </td>
-                                                               </tr>';
+                            $lines[] = [
+                                'icon' => '<span title="' . htmlspecialchars($fileObject->getName() . ' ' . $size) . '">' . $this->iconFactory->getIconForResource(
+                                    $fileObject,
+                                    Icon::SIZE_SMALL
+                                )->render() . '</span>',
+                                'title' => $this->linkItemText(htmlspecialchars(GeneralUtility::fixed_lgd_cs(
+                                    $fileObject->getName(),
+                                    $this->getBackendUser()->uc['titleLen']
+                                )), $fileObject->getName()),
+                                'thumb' => $thumb,
+                                'infoLink' => htmlspecialchars('top.launchView(' . GeneralUtility::quoteJSvalue($table) . ', ' . GeneralUtility::quoteJSvalue($v) . '); return false;'),
+                                'removeLink' => $this->removeUrl('_FILE', GeneralUtility::shortMD5($v))
+                            ];
                         } else {
                             // If the file did not exist (or is illegal) then it is removed from the clipboard immediately:
                             unset($this->clipData[$pad]['el'][$k]);
@@ -441,19 +415,23 @@ class Clipboard
                         // Rendering records:
                         $rec = BackendUtility::getRecordWSOL($table, $uid);
                         if (is_array($rec)) {
-                            $lines[] = '
-                                                               <tr>
-                                                                       <td nowrap="nowrap" class="col-icon">' . $this->linkItemText($this->iconFactory->getIconForRecord($table, $rec, Icon::SIZE_SMALL)->render(), $rec, $table) . '</td>
-                                                                       <td nowrap="nowrap" width="95%">' . $this->linkItemText(htmlspecialchars(GeneralUtility::fixed_lgd_cs(BackendUtility::getRecordTitle($table, $rec), $this->getBackendUser()->uc['titleLen'])), $rec, $table) . ($pad == 'normal' ? ' <strong>(' . ($this->clipData['normal']['mode'] == 'copy' ? $this->clLabel('copy', 'cm') : $this->clLabel('cut', 'cm')) . ')</strong>' : '') . '&nbsp;</td>
-                                                                       <td nowrap="nowrap" class="col-control">
-                                                                               <div class="btn-group">
-                                                                                       <a class="btn btn-default" href="#" onclick="' . htmlspecialchars(('top.launchView(' . GeneralUtility::quoteJSvalue($table) . ', \'' . (int)$uid . '\'); return false;')) . '" title="' . $this->clLabel('info', 'cm') . '">' . $this->iconFactory->getIcon('actions-document-info', Icon::SIZE_SMALL)->render() . '</a>' . '<a class="btn btn-default" href="' . htmlspecialchars($this->removeUrl($table, $uid)) . '#clip_head" title="' . $this->clLabel('removeItem') . '">' . $this->iconFactory->getIcon('actions-selection-delete', Icon::SIZE_SMALL)->render() . '</a>
-                                                                               </div>
-                                                                       </td>
-                                                               </tr>';
-                            $localizationData = $this->getLocalizations($table, $rec, '', $pad);
-                            if ($localizationData) {
-                                $lines[] = $localizationData;
+                            $lines[] = [
+                                'icon' => $this->linkItemText($this->iconFactory->getIconForRecord(
+                                    $table,
+                                    $rec,
+                                    Icon::SIZE_SMALL
+                                )->render(), $rec, $table),
+                                'title' => $this->linkItemText(htmlspecialchars(GeneralUtility::fixed_lgd_cs(BackendUtility::getRecordTitle(
+                                    $table,
+                                    $rec
+                                ), $this->getBackendUser()->uc['titleLen'])), $rec, $table),
+                                'infoLink' => htmlspecialchars('top.launchView(' . GeneralUtility::quoteJSvalue($table) . ', \'' . (int)$uid . '\'); return false;'),
+                                'removeLink' => $this->removeUrl($table, $uid)
+                            ];
+
+                            $localizationData = $this->getLocalizations($table, $rec, '', '');
+                            if (!empty($localizationData)) {
+                                $lines = array_merge($lines, $localizationData);
                             }
                         } else {
                             unset($this->clipData[$pad]['el'][$k]);
@@ -494,64 +472,63 @@ class Clipboard
      */
     public function getLocalizations($table, $parentRec, $bgColClass, $pad)
     {
-        $lines = array();
+        $lines = [];
         $tcaCtrl = $GLOBALS['TCA'][$table]['ctrl'];
-        if ($table != 'pages' && BackendUtility::isTableLocalizable($table) && !$tcaCtrl['transOrigPointerTable']) {
+        if ($table !== 'pages' && BackendUtility::isTableLocalizable($table) && $table !== 'pages_language_overlay') {
             $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable($table);
-            $queryBuilder->getQueryContext()->setContext(QueryContextType::UNRESTRICTED);
+            $queryBuilder->getRestrictions()
+                ->removeAll()
+                ->add(GeneralUtility::makeInstance(DeletedRestriction::class));
+
             $queryBuilder
                 ->select('*')
                 ->from($table)
-                ->where($queryBuilder->expr()->eq($tcaCtrl['transOrigPointerField'], (int)$parentRec['uid']))
-                ->andWhere($queryBuilder->expr()->neq($tcaCtrl['languageField'], 0));
-            if (isset($tcaCtrl['delete']) && $tcaCtrl['delete']) {
-                $queryBuilder->andWhere($queryBuilder->expr()->eq($tcaCtrl['delete'], 0));
-            }
+                ->where(
+                    $queryBuilder->expr()->eq(
+                        $tcaCtrl['transOrigPointerField'],
+                        $queryBuilder->createNamedParameter($parentRec['uid'], \PDO::PARAM_INT)
+                    ),
+                    $queryBuilder->expr()->neq(
+                        $tcaCtrl['languageField'],
+                        $queryBuilder->createNamedParameter(0, \PDO::PARAM_INT)
+                    )
+                );
+
             if (isset($tcaCtrl['versioningWS']) && $tcaCtrl['versioningWS']) {
-                $queryBuilder->andWhere($queryBuilder->expr()->eq('t3ver_wsid', $parentRec['t3ver_wsid']));
+                $queryBuilder
+                    ->andWhere(
+                        $queryBuilder->expr()->eq(
+                            't3ver_wsid',
+                            $queryBuilder->createNamedParameter($parentRec['t3ver_wsid'], \PDO::PARAM_INT)
+                        )
+                    );
             }
-            $rows = $queryBuilder
-                ->execute()
-                ->fetchAll();
+            $rows = $queryBuilder->execute()->fetchAll();
             if (is_array($rows)) {
-                $modeData = '';
-                if ($pad == 'normal') {
-                    $mode = $this->clipData['normal']['mode'] == 'copy' ? 'copy' : 'cut';
-                    $modeData = ' <strong>(' . $this->clLabel($mode, 'cm') . ')</strong>';
-                }
                 foreach ($rows as $rec) {
-                    $lines[] = '
-                                       <tr>
-                                               <td nowrap="nowrap" class="col-icon">' . $this->iconFactory->getIconForRecord($table, $rec, Icon::SIZE_SMALL)->render() . '</td>
-                                               <td nowrap="nowrap" width="95%">' . htmlspecialchars(GeneralUtility::fixed_lgd_cs(BackendUtility::getRecordTitle($table, $rec), $this->getBackendUser()->uc['titleLen'])) . $modeData . '</td>
-                                               <td nowrap="nowrap" class="col-control"></td>
-                                       </tr>';
+                    $lines[] = [
+                        'icon' => $this->iconFactory->getIconForRecord($table, $rec, Icon::SIZE_SMALL)->render(),
+                        'title' => htmlspecialchars(GeneralUtility::fixed_lgd_cs(BackendUtility::getRecordTitle($table, $rec), $this->getBackendUser()->uc['titleLen']))
+                    ];
                 }
             }
         }
-        return implode('', $lines);
+        return $lines;
     }
 
     /**
-     * Wraps title of pad in bold-tag and maybe the number of elements if any.
-     * Only applies bold-tag if the item is active
+     * Warps title with number of elements if any.
      *
-     * @param string  $str String (already htmlspecialchars()'ed)
      * @param string  $pad Pad reference
-     * @param bool $active is currently active
-     * @return string HTML output (htmlspecialchar'ed content inside of tags.)
+     * @return string padding
      */
-    public function padTitleWrap($str, $pad, $active)
+    public function padTitle($pad)
     {
         $el = count($this->elFromTable($this->fileMode ? '_FILE' : '', $pad));
         if ($el) {
-            $str .=  ' (' . ($pad == 'normal' ? ($this->clipData['normal']['mode'] == 'copy' ? $this->clLabel('copy', 'cm') : $this->clLabel('cut', 'cm')) : htmlspecialchars($el)) . ')';
-        }
-        if ($active === true) {
-            return '<strong>' . $str . '</strong>';
-        } else {
-            return '<span class="text-muted">' . $str . '</span>';
+            return ' (' . ($pad === 'normal' ? ($this->clipData['normal']['mode'] === 'copy' ? $this->clLabel('copy', 'cm') : $this->clLabel('cut', 'cm')) : htmlspecialchars($el)) . ')';
         }
+        return '';
     }
 
     /**
@@ -568,14 +545,14 @@ class Clipboard
             if ($this->fileMode) {
                 $str = '<span class="text-muted">' . $str . '</span>';
             } else {
-                $str = '<a href="' . htmlspecialchars(BackendUtility::getModuleUrl('web_list', array('id' => $rec['pid']))) . '">' . $str . '</a>';
+                $str = '<a href="' . htmlspecialchars(BackendUtility::getModuleUrl('web_list', ['id' => $rec['pid']])) . '">' . $str . '</a>';
             }
         } elseif (file_exists($rec)) {
             if (!$this->fileMode) {
                 $str = '<span class="text-muted">' . $str . '</span>';
             } else {
                 if (ExtensionManagementUtility::isLoaded('filelist')) {
-                    $str = '<a href="' . htmlspecialchars(BackendUtility::getModuleUrl('file_list', array('id' => dirname($rec)))) . '">' . $str . '</a>';
+                    $str = '<a href="' . htmlspecialchars(BackendUtility::getModuleUrl('file_list', ['id' => dirname($rec)])) . '">' . $str . '</a>';
                 }
             }
         }
@@ -592,9 +569,9 @@ class Clipboard
      * @param array $baseArray The base array of GET vars to be sent in addition. Notice that current GET vars WILL automatically be included.
      * @return string URL linking to the current script but with the CB array set to select the element with table/uid
      */
-    public function selUrlDB($table, $uid, $copy = 0, $deselect = 0, $baseArray = array())
+    public function selUrlDB($table, $uid, $copy = 0, $deselect = 0, $baseArray = [])
     {
-        $CB = array('el' => array(rawurlencode($table . '|' . $uid) => $deselect ? 0 : 1));
+        $CB = ['el' => [rawurlencode($table . '|' . $uid) => $deselect ? 0 : 1]];
         if ($copy) {
             $CB['setCopyMode'] = 1;
         }
@@ -611,9 +588,9 @@ class Clipboard
      * @param array $baseArray The base array of GET vars to be sent in addition. Notice that current GET vars WILL automatically be included.
      * @return string URL linking to the current script but with the CB array set to select the path
      */
-    public function selUrlFile($path, $copy = 0, $deselect = 0, $baseArray = array())
+    public function selUrlFile($path, $copy = 0, $deselect = 0, $baseArray = [])
     {
-        $CB = array('el' => array(rawurlencode('_FILE|' . GeneralUtility::shortMD5($path)) => $deselect ? '' : $path));
+        $CB = ['el' => [rawurlencode('_FILE|' . GeneralUtility::shortMD5($path)) => $deselect ? '' : $path]];
         if ($copy) {
             $CB['setCopyMode'] = 1;
         }
@@ -635,14 +612,11 @@ class Clipboard
     public function pasteUrl($table, $uid, $setRedirect = true, array $update = null)
     {
         $urlParameters = [
-            'vC' => $this->getBackendUser()->veriCode(),
-            'prErr' => 1,
-            'uPT' => 1,
             'CB[paste]' => $table . '|' . $uid,
             'CB[pad]' => $this->current
         ];
         if ($setRedirect) {
-            $urlParameters['redirect'] = GeneralUtility::linkThisScript(array('CB' => ''));
+            $urlParameters['redirect'] = GeneralUtility::linkThisScript(['CB' => '']);
         }
         if (is_array($update)) {
             $urlParameters['CB[update]'] = $update;
@@ -660,14 +634,11 @@ class Clipboard
     public function deleteUrl($setRedirect = 1, $file = 0)
     {
         $urlParameters = [
-            'vC' => $this->getBackendUser()->veriCode(),
-            'prErr' => 1,
-            'uPT' => 1,
             'CB[delete]' => 1,
             'CB[pad]' => $this->current
         ];
         if ($setRedirect) {
-            $urlParameters['redirect'] = GeneralUtility::linkThisScript(array('CB' => ''));
+            $urlParameters['redirect'] = GeneralUtility::linkThisScript(['CB' => '']);
         }
         return BackendUtility::getModuleUrl($file ? 'tce_file' : 'tce_db', $urlParameters);
     }
@@ -681,7 +652,7 @@ class Clipboard
      */
     public function editUrl()
     {
-        $parameters = array();
+        $parameters = [];
         // All records
         $elements = $this->elFromTable('');
         foreach ($elements as $tP => $value) {
@@ -701,28 +672,7 @@ class Clipboard
      */
     public function removeUrl($table, $uid)
     {
-        return GeneralUtility::linkThisScript(array('CB' => array('remove' => $table . '|' . $uid)));
-    }
-
-    /**
-     * Returns confirm JavaScript message
-     *
-     * @param string $table Table name
-     * @param mixed $rec For records its an array, for files its a string (path)
-     * @param string $type Type-code
-     * @param array $clElements Array of selected elements
-     * @param string $columnLabel Name of the content column
-     * @return string JavaScript "confirm" message
-     * @deprecated since TYPO3 v8, will be removed in TYPO3 v9
-     */
-    public function confirmMsg($table, $rec, $type, $clElements, $columnLabel = '')
-    {
-        GeneralUtility::logDeprecatedFunction();
-        $message = $this->confirmMsgText($table, $rec, $type, $clElements, $columnLabel);
-        if (!empty($message)) {
-            $message = 'confirm(' . GeneralUtility::quoteJSvalue($message) . ');';
-        }
-        return $message;
+        return GeneralUtility::linkThisScript(['CB' => ['remove' => $table . '|' . $uid]]);
     }
 
     /**
@@ -738,19 +688,19 @@ class Clipboard
     public function confirmMsgText($table, $rec, $type, $clElements, $columnLabel = '')
     {
         if ($this->getBackendUser()->jsConfirmation(JsConfirmation::COPY_MOVE_PASTE)) {
-            $labelKey = 'LLL:EXT:lang/locallang_core.xlf:mess.' . ($this->currentMode() == 'copy' ? 'copy' : 'move') . ($this->current == 'normal' ? '' : 'cb') . '_' . $type;
+            $labelKey = 'LLL:EXT:lang/Resources/Private/Language/locallang_core.xlf:mess.' . ($this->currentMode() === 'copy' ? 'copy' : 'move') . ($this->current === 'normal' ? '' : 'cb') . '_' . $type;
             $msg = $this->getLanguageService()->sL($labelKey . ($columnLabel ? '_colPos': ''));
-            if ($table == '_FILE') {
+            if ($table === '_FILE') {
                 $thisRecTitle = basename($rec);
-                if ($this->current == 'normal') {
+                if ($this->current === 'normal') {
                     $selItem = reset($clElements);
                     $selRecTitle = basename($selItem);
                 } else {
                     $selRecTitle = count($clElements);
                 }
             } else {
-                $thisRecTitle = $table == 'pages' && !is_array($rec) ? $GLOBALS['TYPO3_CONF_VARS']['SYS']['sitename'] : BackendUtility::getRecordTitle($table, $rec);
-                if ($this->current == 'normal') {
+                $thisRecTitle = $table === 'pages' && !is_array($rec) ? $GLOBALS['TYPO3_CONF_VARS']['SYS']['sitename'] : BackendUtility::getRecordTitle($table, $rec);
+                if ($this->current === 'normal') {
                     $selItem = $this->getSelectedRecord();
                     $selRecTitle = $selItem['_RECORD_TITLE'];
                 } else {
@@ -779,7 +729,7 @@ class Clipboard
     }
 
     /**
-     * Clipboard label - getting from "EXT:lang/locallang_core.xlf:"
+     * Clipboard label - getting from "EXT:lang/Resources/Private/Language/locallang_core.xlf:"
      *
      * @param string $key Label Key
      * @param string $Akey Alternative key to "labels
@@ -787,7 +737,7 @@ class Clipboard
      */
     public function clLabel($key, $Akey = 'labels')
     {
-        return htmlspecialchars($this->getLanguageService()->sL('LLL:EXT:lang/locallang_core.xlf:' . $Akey . '.' . $key));
+        return htmlspecialchars($this->getLanguageService()->sL('LLL:EXT:lang/Resources/Private/Language/locallang_core.xlf:' . $Akey . '.' . $key));
     }
 
     /**
@@ -799,7 +749,7 @@ class Clipboard
     {
         // Init
         $pad = $this->current;
-        $params = array();
+        $params = [];
         $params['tx_impexp']['action'] = 'export';
         // Traverse items:
         if (is_array($this->clipData[$pad]['el'])) {
@@ -807,7 +757,7 @@ class Clipboard
                 if ($v) {
                     list($table, $uid) = explode('|', $k);
                     // Rendering files/directories on the clipboard
-                    if ($table == '_FILE') {
+                    if ($table === '_FILE') {
                         if (file_exists($v) && GeneralUtility::isAllowedAbsPath($v)) {
                             $params['tx_impexp'][is_dir($v) ? 'dir' : 'file'][] = $v;
                         }
@@ -833,7 +783,6 @@ class Clipboard
      * Removes element on clipboard
      *
      * @param string $el Key of element in ->clipData array
-     * @return void
      */
     public function removeElement($el)
     {
@@ -846,7 +795,6 @@ class Clipboard
      * Use ->endClipboard normally (as it checks if changes has been done so saving is necessary)
      *
      * @access private
-     * @return void
      */
     public function saveClipboard()
     {
@@ -860,21 +808,19 @@ class Clipboard
      */
     public function currentMode()
     {
-        return $this->clipData[$this->current]['mode'] == 'copy' ? 'copy' : 'cut';
+        return $this->clipData[$this->current]['mode'] === 'copy' ? 'copy' : 'cut';
     }
 
     /**
      * This traverses the elements on the current clipboard pane
      * and unsets elements which does not exist anymore or are disabled.
-     *
-     * @return void
      */
     public function cleanCurrent()
     {
         if (is_array($this->clipData[$this->current]['el'])) {
             foreach ($this->clipData[$this->current]['el'] as $k => $v) {
                 list($table, $uid) = explode('|', $k);
-                if ($table != '_FILE') {
+                if ($table !== '_FILE') {
                     if (!$v || !is_array(BackendUtility::getRecord($table, $uid, 'uid'))) {
                         unset($this->clipData[$this->current]['el'][$k]);
                         $this->changed = 1;
@@ -906,14 +852,14 @@ class Clipboard
     public function elFromTable($matchTable = '', $pad = '')
     {
         $pad = $pad ? $pad : $this->current;
-        $list = array();
+        $list = [];
         if (is_array($this->clipData[$pad]['el'])) {
             foreach ($this->clipData[$pad]['el'] as $k => $v) {
                 if ($v) {
                     list($table, $uid) = explode('|', $k);
-                    if ($table != '_FILE') {
+                    if ($table !== '_FILE') {
                         if ((!$matchTable || (string)$table == (string)$matchTable) && $GLOBALS['TCA'][$table]) {
-                            $list[$k] = $pad == 'normal' ? $v : $uid;
+                            $list[$k] = $pad === 'normal' ? $v : $uid;
                         }
                     } else {
                         if ((string)$table == (string)$matchTable) {
@@ -937,7 +883,7 @@ class Clipboard
     public function isSelected($table, $uid)
     {
         $k = $table . '|' . $uid;
-        return $this->clipData[$this->current]['el'][$k] ? ($this->current == 'normal' ? $this->currentMode() : 1) : '';
+        return $this->clipData[$this->current]['el'][$k] ? ($this->current === 'normal' ? $this->currentMode() : 1) : '';
     }
 
     /**
@@ -961,7 +907,7 @@ class Clipboard
             $selRec['_RECORD_TITLE'] = BackendUtility::getRecordTitle($table, $selRec);
             return $selRec;
         }
-        return array();
+        return [];
     }
 
     /**
@@ -1007,23 +953,23 @@ class Clipboard
             $elements = $this->elFromTable($pTable);
             // So the order is preserved.
             $elements = array_reverse($elements);
-            $mode = $this->currentMode() == 'copy' ? 'copy' : 'move';
+            $mode = $this->currentMode() === 'copy' ? 'copy' : 'move';
             // Traverse elements and make CMD array
             foreach ($elements as $tP => $value) {
                 list($table, $uid) = explode('|', $tP);
                 if (!is_array($CMD[$table])) {
-                    $CMD[$table] = array();
+                    $CMD[$table] = [];
                 }
                 if (is_array($update)) {
-                    $CMD[$table][$uid][$mode] = array(
+                    $CMD[$table][$uid][$mode] = [
                         'action' => 'paste',
                         'target' => $pUid,
                         'update' => $update,
-                    );
+                    ];
                 } else {
                     $CMD[$table][$uid][$mode] = $pUid;
                 }
-                if ($mode == 'move') {
+                if ($mode === 'move') {
                     $this->removeElement($tP);
                 }
             }
@@ -1045,7 +991,7 @@ class Clipboard
         foreach ($elements as $tP => $value) {
             list($table, $uid) = explode('|', $tP);
             if (!is_array($CMD[$table])) {
-                $CMD[$table] = array();
+                $CMD[$table] = [];
             }
             $CMD[$table][$uid]['delete'] = 1;
             $this->removeElement($tP);
@@ -1071,11 +1017,11 @@ class Clipboard
     {
         list($pTable, $pUid) = explode('|', $ref);
         $elements = $this->elFromTable('_FILE');
-        $mode = $this->currentMode() == 'copy' ? 'copy' : 'move';
+        $mode = $this->currentMode() === 'copy' ? 'copy' : 'move';
         // Traverse elements and make CMD array
         foreach ($elements as $tP => $path) {
-            $FILE[$mode][] = array('data' => $path, 'target' => $pUid);
-            if ($mode == 'move') {
+            $FILE[$mode][] = ['data' => $path, 'target' => $pUid];
+            if ($mode === 'move') {
                 $this->removeElement($tP);
             }
         }
@@ -1094,7 +1040,7 @@ class Clipboard
         $elements = $this->elFromTable('_FILE');
         // Traverse elements and make CMD array
         foreach ($elements as $tP => $path) {
-            $FILE['delete'][] = array('data' => $path);
+            $FILE['delete'][] = ['data' => $path];
             $this->removeElement($tP);
         }
         $this->endClipboard();
@@ -1104,7 +1050,7 @@ class Clipboard
     /**
      * Returns LanguageService
      *
-     * @return \TYPO3\CMS\Lang\LanguageService
+     * @return \TYPO3\CMS\Core\Localization\LanguageService
      */
     protected function getLanguageService()
     {
@@ -1121,4 +1067,24 @@ class Clipboard
         return $GLOBALS['BE_USER'];
     }
 
+    /**
+     * returns a new standalone view, shorthand function
+     *
+     * @return StandaloneView
+     * @throws \InvalidArgumentException
+     * @throws \TYPO3\CMS\Extbase\Mvc\Exception\InvalidExtensionNameException
+     */
+    protected function getStandaloneView()
+    {
+        /** @var StandaloneView $view */
+        $view = GeneralUtility::makeInstance(StandaloneView::class);
+        $view->setLayoutRootPaths([GeneralUtility::getFileAbsFileName('EXT:backend/Resources/Private/Layouts')]);
+        $view->setPartialRootPaths([GeneralUtility::getFileAbsFileName('EXT:backend/Resources/Private/Partials')]);
+        $view->setTemplateRootPaths([GeneralUtility::getFileAbsFileName('EXT:backend/Resources/Private/Templates')]);
+
+        $view->setTemplatePathAndFilename(GeneralUtility::getFileAbsFileName('EXT:backend/Resources/Private/Templates/Clipboard/Main.html'));
+
+        $view->getRequest()->setControllerExtensionName('Backend');
+        return $view;
+    }
 }