[!!!][TASK] Remove tce_db options "prErr" and "uPT"
[Packages/TYPO3.CMS.git] / typo3 / sysext / backend / Classes / Clipboard / Clipboard.php
index 234c7b0..a763d57 100644 (file)
@@ -15,13 +15,16 @@ namespace TYPO3\CMS\Backend\Clipboard;
  */
 
 use TYPO3\CMS\Backend\Utility\BackendUtility;
+use TYPO3\CMS\Core\Database\ConnectionPool;
+use TYPO3\CMS\Core\Database\Query\Restriction\DeletedRestriction;
 use TYPO3\CMS\Core\Imaging\Icon;
 use TYPO3\CMS\Core\Imaging\IconFactory;
 use TYPO3\CMS\Core\Resource\ResourceFactory;
 use TYPO3\CMS\Core\Type\Bitmask\JsConfirmation;
-use TYPO3\CMS\Core\Utility\GeneralUtility;
 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
@@ -54,7 +57,7 @@ class Clipboard
      *
      * @var array
      */
-    public $clipData = array();
+    public $clipData = [];
 
     /**
      * @var int
@@ -84,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();
     }
 
     /*****************************************
@@ -98,8 +109,6 @@ class Clipboard
      ****************************************/
     /**
      * Initialize the clipboard from the be_user session
-     *
-     * @return void
      */
     public function initializeClipboard()
     {
@@ -111,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');
@@ -123,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()
     {
@@ -142,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) {
@@ -170,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
@@ -184,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)
     {
@@ -193,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'
@@ -204,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()
     {
@@ -245,128 +248,116 @@ class Clipboard
      * Prints the clipboard
      *
      * @return string HTML output
+     * @throws \BadFunctionCallException
      */
     public function printClipboard()
     {
-        $out = array();
+        $languageService = $this->getLanguageService();
         $elementCount = count($this->elFromTable($this->fileMode ? '_FILE' : ''));
-        // Button/menu header:
-        $removeAllUrl = GeneralUtility::linkThisScript(array('CB' => array('removeAll' => $this->current)));
         // Copymode Selector menu
         $copymodeUrl = GeneralUtility::linkThisScript();
-        $moveLabel = htmlspecialchars($this->getLanguageService()->sL('LLL:EXT:lang/locallang_misc.xlf:moveElements'));
-        $copyLabel = htmlspecialchars($this->getLanguageService()->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);
 
-        // Selector menu + clear button
-        $optionArray = array();
-        // Import / Export link:
-        if ($elementCount && ExtensionManagementUtility::isLoaded('impexp')) {
-            $url = BackendUtility::getModuleUrl('xMOD_tximpexp', $this->exportClipElementParameters());
-            $optionArray[] = '<li><a href="#" onclick="' . htmlspecialchars(('window.location.href=' . GeneralUtility::quoteJSvalue($url) . ';')) . '">' . $this->clLabel('export', 'rm') . '</a></li>';
-        }
-        // Edit:
-        if (!$this->fileMode && $elementCount) {
-            $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>';
-        }
-
-        $deleteLink = '';
-        $menuSelector = '';
         if ($elementCount) {
-            // Delete:
-            $deleteLink = '<a class="btn btn-danger" href="' . htmlspecialchars($removeAllUrl) . '#clip_head" title="' . $this->getLanguageService()->sL('LLL:EXT:lang/locallang_core.xlf:buttons.clear', true) . '">' . $this->iconFactory->getIcon('actions-document-close', Icon::SIZE_SMALL)->render() . '</a>';
+            $removeAllUrl = GeneralUtility::linkThisScript(['CB' => ['removeAll' => $this->current]]);
+            $this->view->assign('removeAllUrl', $removeAllUrl);
+
+            // Selector menu + clear button
+            $optionArray = [];
+            // Import / Export link:
+            if (ExtensionManagementUtility::isLoaded('impexp')) {
+                $url = BackendUtility::getModuleUrl('xMOD_tximpexp', $this->exportClipElementParameters());
+                $optionArray[] = [
+                    'label' => $this->clLabel('export', 'rm'),
+                    'uri' => $url
+                ];
+            }
+            // Edit:
+            if (!$this->fileMode) {
+                $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:
+            $confirmationCheck = false;
             if ($this->getBackendUser()->jsConfirmation(JsConfirmation::DELETE)) {
-                $js = '
-                       if (confirm(' . GeneralUtility::quoteJSvalue(sprintf($this->getLanguageService()->sL('LLL:EXT:lang/locallang_core.xlf:mess.deleteClip'), $elementCount)) . ')){
-                               window.location.href=' . GeneralUtility::quoteJSvalue($this->deleteUrl(0, ($this->fileMode ? 1 : 0)) . '&redirect=') . '+top.rawurlencode(window.location.href);
-                       }
-                                       ';
-            } else {
-                $js = ' window.location.href=' . GeneralUtility::quoteJSvalue($this->deleteUrl(0, ($this->fileMode ? 1 : 0)) . '&redirect=') . '+top.rawurlencode(window.location.href); ';
+                $confirmationCheck = true;
             }
-            $optionArray[] = '<li><a href="#" onclick="' . htmlspecialchars($js) . '">' . $this->clLabel('delete', 'rm') . '</a></li>';
 
-            // 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>
-                       ';
-        }
+            $confirmationMessage = sprintf(
+                $languageService->sL('LLL:EXT:lang/Resources/Private/Language/locallang_core.xlf:mess.deleteClip'),
+                $elementCount
+            );
+            $title = $languageService
+                ->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/Resources/Private/Language/locallang_alt_doc.xlf:buttons.confirm.delete_elements.yes');
+            $btnCancelText = $languageService
+                ->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)
+                ]
+            ];
 
-        $out[] = '
-                       <tr>
-                               <td colspan="2" nowrap="nowrap" width="95%">' . $copymodeSelector . ' ' . $menuSelector . '</td>
-                               <td nowrap="nowrap" class="col-control">' . $deleteLink . '</td>
-                       </tr>';
+            // Clear clipboard
+            $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);
+        }
 
         // 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();
     }
 
     /**
@@ -376,42 +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);
-                    $bgColClass = $table == '_FILE' && $this->fileMode || $table != '_FILE' && !$this->fileMode ? 'bgColor4-20' : 'bgColor4';
                     // 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]);
@@ -421,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, $bgColClass, $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]);
@@ -474,58 +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']) {
-            $where = array();
-            $where[] = $tcaCtrl['transOrigPointerField'] . '=' . (int)$parentRec['uid'];
-            $where[] = $tcaCtrl['languageField'] . '<>0';
-            if (isset($tcaCtrl['delete']) && $tcaCtrl['delete']) {
-                $where[] = $tcaCtrl['delete'] . '=0';
-            }
+        if ($table !== 'pages' && BackendUtility::isTableLocalizable($table) && $table !== 'pages_language_overlay') {
+            $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable($table);
+            $queryBuilder->getRestrictions()
+                ->removeAll()
+                ->add(GeneralUtility::makeInstance(DeletedRestriction::class));
+
+            $queryBuilder
+                ->select('*')
+                ->from($table)
+                ->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']) {
-                $where[] = 't3ver_wsid=' . $parentRec['t3ver_wsid'];
+                $queryBuilder
+                    ->andWhere(
+                        $queryBuilder->expr()->eq(
+                            't3ver_wsid',
+                            $queryBuilder->createNamedParameter($parentRec['t3ver_wsid'], \PDO::PARAM_INT)
+                        )
+                    );
             }
-            $rows = $this->getDatabaseConnection()->exec_SELECTgetRows('*', $table, implode(' AND ', $where));
+            $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 '';
     }
 
     /**
@@ -542,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>';
                 }
             }
         }
@@ -566,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;
         }
@@ -585,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;
         }
@@ -609,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;
@@ -634,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);
     }
@@ -655,7 +652,7 @@ class Clipboard
      */
     public function editUrl()
     {
-        $parameters = array();
+        $parameters = [];
         // All records
         $elements = $this->elFromTable('');
         foreach ($elements as $tP => $value) {
@@ -675,7 +672,7 @@ class Clipboard
      */
     public function removeUrl($table, $uid)
     {
-        return GeneralUtility::linkThisScript(array('CB' => array('remove' => $table . '|' . $uid)));
+        return GeneralUtility::linkThisScript(['CB' => ['remove' => $table . '|' . $uid]]);
     }
 
     /**
@@ -686,24 +683,24 @@ class Clipboard
      * @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
+     * @return string the text for a confirm message
      */
-    public function confirmMsg($table, $rec, $type, $clElements, $columnLabel = '')
+    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 {
@@ -719,7 +716,12 @@ class Clipboard
             }
 
             // Message
-            $conf = 'confirm(' . GeneralUtility::quoteJSvalue(sprintf($msg, GeneralUtility::fixed_lgd_cs($selRecTitle, 30), GeneralUtility::fixed_lgd_cs($thisRecTitle, 30), GeneralUtility::fixed_lgd_cs($columnLabel, 30))) . ')';
+            $conf = sprintf(
+                $msg,
+                GeneralUtility::fixed_lgd_cs($selRecTitle, 30),
+                GeneralUtility::fixed_lgd_cs($thisRecTitle, 30),
+                GeneralUtility::fixed_lgd_cs($columnLabel, 30)
+            );
         } else {
             $conf = '';
         }
@@ -727,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
@@ -735,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));
     }
 
     /**
@@ -747,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'])) {
@@ -755,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;
                         }
@@ -781,7 +783,6 @@ class Clipboard
      * Removes element on clipboard
      *
      * @param string $el Key of element in ->clipData array
-     * @return void
      */
     public function removeElement($el)
     {
@@ -794,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()
     {
@@ -808,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;
@@ -854,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) {
@@ -885,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) : '';
     }
 
     /**
@@ -909,7 +907,7 @@ class Clipboard
             $selRec['_RECORD_TITLE'] = BackendUtility::getRecordTitle($table, $selRec);
             return $selRec;
         }
-        return array();
+        return [];
     }
 
     /**
@@ -955,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);
                 }
             }
@@ -993,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);
@@ -1019,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);
             }
         }
@@ -1042,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();
@@ -1052,7 +1050,7 @@ class Clipboard
     /**
      * Returns LanguageService
      *
-     * @return \TYPO3\CMS\Lang\LanguageService
+     * @return \TYPO3\CMS\Core\Localization\LanguageService
      */
     protected function getLanguageService()
     {
@@ -1070,12 +1068,23 @@ class Clipboard
     }
 
     /**
-     * Return DatabaseConnection
+     * returns a new standalone view, shorthand function
      *
-     * @return \TYPO3\CMS\Core\Database\DatabaseConnection
+     * @return StandaloneView
+     * @throws \InvalidArgumentException
+     * @throws \TYPO3\CMS\Extbase\Mvc\Exception\InvalidExtensionNameException
      */
-    protected function getDatabaseConnection()
+    protected function getStandaloneView()
     {
-        return $GLOBALS['TYPO3_DB'];
+        /** @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;
     }
 }