[FOLLOWUP][TASK] Make TYPO3 Core PSR-2 standard compliant
[Packages/TYPO3.CMS.git] / typo3 / sysext / backend / Classes / RecordList / AbstractRecordList.php
index 5e96cac..a67c5f2 100644 (file)
@@ -33,347 +33,354 @@ use TYPO3\CMS\Lang\LanguageService;
  * @see typo3/db_list.php
  * @see typo3/sysext/filelist/mod1/index.php
  */
-abstract class AbstractRecordList {
-
-       /**
-        * @var int
-        */
-       protected $id = 0;
-
-       /**
-        * default Max items shown
-        *
-        * @var int
-        */
-       public $iLimit = 10;
-
-       /**
-        * OBSOLETE - NOT USED ANYMORE. leftMargin
-        *
-        * @var int
-        */
-       public $leftMargin = 0;
-
-       /**
-        * @var int
-        */
-       public $showIcon = 1;
-
-       /**
-        * @var int
-        */
-       public $no_noWrap = 0;
-
-       /**
-        * If set this is <td> CSS-classname for odd columns in addElement. Used with db_layout / pages section
-        *
-        * @var string
-        */
-       public $oddColumnsCssClass = '';
-
-       /**
-        * Decides the columns shown. Filled with values that refers to the keys of the data-array. $this->fieldArray[0] is the title column.
-        *
-        * @var array
-        */
-       public $fieldArray = array();
-
-       /**
-        * Keys are fieldnames and values are td-parameters to add in addElement(), please use $addElement_tdCSSClass for CSS-classes;
-        *
-        * @var array
-        */
-       public $addElement_tdParams = array();
-
-       /**
-        * Keys are fieldnames and values are td-css-classes to add in addElement();
-        *
-        * @var array
-        */
-       public $addElement_tdCssClass = array();
-
-       /**
-        * Not used in this class - but maybe extension classes...
-        * Max length of strings
-        *
-        * @var int
-        */
-       public $fixedL = 30;
-
-       /**
-        * Script URL
-        *
-        * @var string
-        */
-       public $thisScript = '';
-
-       /**
-        * Set to zero, if you don't want a left-margin with addElement function
-        *
-        * @var int
-        */
-       public $setLMargin = 1;
-
-       /**
-        * Counter increased for each element. Used to index elements for the JavaScript-code that transfers to the clipboard
-        *
-        * @var int
-        */
-       public $counter = 0;
-
-       /**
-        * This could be set to the total number of items. Used by the fwd_rew_navigation...
-        *
-        * @var string
-        */
-       public $totalItems = '';
-
-       /**
-        * Internal (used in this class.)
-        *
-        * @var int
-        */
-       public $firstElementNumber = 0;
-
-       /**
-        * @var int
-        */
-       public $eCounter = 0;
-
-       /**
-        * String with accumulated HTML content
-        *
-        * @var string
-        */
-       public $HTMLcode = '';
-
-       /**
-        * Contains page translation languages
-        *
-        * @var array
-        */
-       public $pageOverlays = array();
-
-       /**
-        * Contains sys language icons and titles
-        *
-        * @var array
-        */
-       public $languageIconTitles = array();
-
-       /**
-        * @var TranslationConfigurationProvider
-        */
-       public $translateTools;
-
-       /**
-        * Constructor
-        */
-       public function __construct() {
-               if (isset($GLOBALS['BE_USER']->uc['titleLen']) && $GLOBALS['BE_USER']->uc['titleLen'] > 0) {
-                       $this->fixedL = $GLOBALS['BE_USER']->uc['titleLen'];
-               }
-               $this->getTranslateTools();
-               $this->determineScriptUrl();
-       }
-
-       /**
-        * Sets the script url depending on being a module or script request
-        */
-       protected function determineScriptUrl() {
-               if ($routePath = GeneralUtility::_GP('route')) {
-                       $router = GeneralUtility::makeInstance(Router::class);
-                       $route = $router->match($routePath);
-                       $uriBuilder = GeneralUtility::makeInstance(UriBuilder::class);
-                       $this->thisScript = (string)$uriBuilder->buildUriFromRoute($route->getOption('_identifier'));
-               } elseif ($moduleName = GeneralUtility::_GP('M')) {
-                       $this->thisScript = BackendUtility::getModuleUrl($moduleName);
-               } else {
-                       $this->thisScript = GeneralUtility::getIndpEnv('SCRIPT_NAME');
-               }
-       }
-
-       /**
-        * @return string
-        */
-       protected function getThisScript() {
-               return strpos($this->thisScript, '?') === FALSE ? $this->thisScript . '?' : $this->thisScript . '&';
-       }
-
-       /**
-        * Returns a table-row with the content from the fields in the input data array.
-        * OBS: $this->fieldArray MUST be set! (represents the list of fields to display)
-        *
-        * @param int $h Is an integer >=0 and denotes how tall an element is. Set to '0' makes a halv line, -1 = full line, set to 1 makes a 'join' and above makes 'line'
-        * @param string $icon Is the <img>+<a> of the record. If not supplied the first 'join'-icon will be a 'line' instead
-        * @param array $data Is the dataarray, record with the fields. Notice: These fields are (currently) NOT htmlspecialchar'ed before being wrapped in <td>-tags
-        * @param string $rowParams Is insert in the <tr>-tags. Must carry a ' ' as first character
-        * @param string $_ OBSOLETE - NOT USED ANYMORE. $lMargin is the leftMargin (int)
-        * @param string $_2 OBSOLETE - NOT USED ANYMORE. Is the HTML <img>-tag for an alternative 'gfx/ol/line.gif'-icon (used in the top)
-        * @param string $colType Defines the tag being used for the columns. Default is td.
-        * @return string HTML content for the table row
-        */
-       public function addElement($h, $icon, $data, $rowParams = '', $_ = '', $_2 = '', $colType = 'td') {
-               $colType = ($colType === 'th') ? 'th' : 'td';
-               $noWrap = $this->no_noWrap ? '' : ' nowrap="nowrap"';
-               // Start up:
-               $parent = isset($data['parent']) ? (int)$data['parent'] : 0;
-               $out = '
+abstract class AbstractRecordList
+{
+    /**
+     * @var int
+     */
+    protected $id = 0;
+
+    /**
+     * default Max items shown
+     *
+     * @var int
+     */
+    public $iLimit = 10;
+
+    /**
+     * OBSOLETE - NOT USED ANYMORE. leftMargin
+     *
+     * @var int
+     */
+    public $leftMargin = 0;
+
+    /**
+     * @var int
+     */
+    public $showIcon = 1;
+
+    /**
+     * @var int
+     */
+    public $no_noWrap = 0;
+
+    /**
+     * If set this is <td> CSS-classname for odd columns in addElement. Used with db_layout / pages section
+     *
+     * @var string
+     */
+    public $oddColumnsCssClass = '';
+
+    /**
+     * Decides the columns shown. Filled with values that refers to the keys of the data-array. $this->fieldArray[0] is the title column.
+     *
+     * @var array
+     */
+    public $fieldArray = array();
+
+    /**
+     * Keys are fieldnames and values are td-parameters to add in addElement(), please use $addElement_tdCSSClass for CSS-classes;
+     *
+     * @var array
+     */
+    public $addElement_tdParams = array();
+
+    /**
+     * Keys are fieldnames and values are td-css-classes to add in addElement();
+     *
+     * @var array
+     */
+    public $addElement_tdCssClass = array();
+
+    /**
+     * Not used in this class - but maybe extension classes...
+     * Max length of strings
+     *
+     * @var int
+     */
+    public $fixedL = 30;
+
+    /**
+     * Script URL
+     *
+     * @var string
+     */
+    public $thisScript = '';
+
+    /**
+     * Set to zero, if you don't want a left-margin with addElement function
+     *
+     * @var int
+     */
+    public $setLMargin = 1;
+
+    /**
+     * Counter increased for each element. Used to index elements for the JavaScript-code that transfers to the clipboard
+     *
+     * @var int
+     */
+    public $counter = 0;
+
+    /**
+     * This could be set to the total number of items. Used by the fwd_rew_navigation...
+     *
+     * @var string
+     */
+    public $totalItems = '';
+
+    /**
+     * Internal (used in this class.)
+     *
+     * @var int
+     */
+    public $firstElementNumber = 0;
+
+    /**
+     * @var int
+     */
+    public $eCounter = 0;
+
+    /**
+     * String with accumulated HTML content
+     *
+     * @var string
+     */
+    public $HTMLcode = '';
+
+    /**
+     * Contains page translation languages
+     *
+     * @var array
+     */
+    public $pageOverlays = array();
+
+    /**
+     * Contains sys language icons and titles
+     *
+     * @var array
+     */
+    public $languageIconTitles = array();
+
+    /**
+     * @var TranslationConfigurationProvider
+     */
+    public $translateTools;
+
+    /**
+     * Constructor
+     */
+    public function __construct()
+    {
+        if (isset($GLOBALS['BE_USER']->uc['titleLen']) && $GLOBALS['BE_USER']->uc['titleLen'] > 0) {
+            $this->fixedL = $GLOBALS['BE_USER']->uc['titleLen'];
+        }
+        $this->getTranslateTools();
+        $this->determineScriptUrl();
+    }
+
+    /**
+     * Sets the script url depending on being a module or script request
+     */
+    protected function determineScriptUrl()
+    {
+        if ($routePath = GeneralUtility::_GP('route')) {
+            $router = GeneralUtility::makeInstance(Router::class);
+            $route = $router->match($routePath);
+            $uriBuilder = GeneralUtility::makeInstance(UriBuilder::class);
+            $this->thisScript = (string)$uriBuilder->buildUriFromRoute($route->getOption('_identifier'));
+        } elseif ($moduleName = GeneralUtility::_GP('M')) {
+            $this->thisScript = BackendUtility::getModuleUrl($moduleName);
+        } else {
+            $this->thisScript = GeneralUtility::getIndpEnv('SCRIPT_NAME');
+        }
+    }
+
+    /**
+     * @return string
+     */
+    protected function getThisScript()
+    {
+        return strpos($this->thisScript, '?') === false ? $this->thisScript . '?' : $this->thisScript . '&';
+    }
+
+    /**
+     * Returns a table-row with the content from the fields in the input data array.
+     * OBS: $this->fieldArray MUST be set! (represents the list of fields to display)
+     *
+     * @param int $h Is an integer >=0 and denotes how tall an element is. Set to '0' makes a halv line, -1 = full line, set to 1 makes a 'join' and above makes 'line'
+     * @param string $icon Is the <img>+<a> of the record. If not supplied the first 'join'-icon will be a 'line' instead
+     * @param array $data Is the dataarray, record with the fields. Notice: These fields are (currently) NOT htmlspecialchar'ed before being wrapped in <td>-tags
+     * @param string $rowParams Is insert in the <tr>-tags. Must carry a ' ' as first character
+     * @param string $_ OBSOLETE - NOT USED ANYMORE. $lMargin is the leftMargin (int)
+     * @param string $_2 OBSOLETE - NOT USED ANYMORE. Is the HTML <img>-tag for an alternative 'gfx/ol/line.gif'-icon (used in the top)
+     * @param string $colType Defines the tag being used for the columns. Default is td.
+     * @return string HTML content for the table row
+     */
+    public function addElement($h, $icon, $data, $rowParams = '', $_ = '', $_2 = '', $colType = 'td')
+    {
+        $colType = ($colType === 'th') ? 'th' : 'td';
+        $noWrap = $this->no_noWrap ? '' : ' nowrap="nowrap"';
+        // Start up:
+        $parent = isset($data['parent']) ? (int)$data['parent'] : 0;
+        $out = '
                <!-- Element, begin: -->
                <tr ' . $rowParams . ' data-uid="' . (int)$data['uid'] . '" data-l10nparent="' . $parent . '">';
-               // Show icon and lines
-               if ($this->showIcon) {
-                       $out .= '
+        // Show icon and lines
+        if ($this->showIcon) {
+            $out .= '
                        <' . $colType . ' nowrap="nowrap" class="col-icon">';
-                       if (!$h) {
-                               $out .= '&nbsp;';
-                       } else {
-                               for ($a = 0; $a < $h; $a++) {
-                                       if (!$a) {
-                                               if ($icon) {
-                                                       $out .= $icon;
-                                               }
-                                       } else {
-
-                                       }
-                               }
-                       }
-                       $out .= '</' . $colType . '>
+            if (!$h) {
+                $out .= '&nbsp;';
+            } else {
+                for ($a = 0; $a < $h; $a++) {
+                    if (!$a) {
+                        if ($icon) {
+                            $out .= $icon;
+                        }
+                    } else {
+                    }
+                }
+            }
+            $out .= '</' . $colType . '>
                        ';
-               }
-               // Init rendering.
-               $colsp = '';
-               $lastKey = '';
-               $c = 0;
-               $ccount = 0;
-               // __label is used as the label key to circumvent problems with uid used as label (see #67756)
-               // as it was introduced later on, check if it really exists before using it
-               $fields = $this->fieldArray;
-               if ($colType === 'td' && array_key_exists('__label', $data)) {
-                       $fields[0] = '__label';
-               }
-               // Traverse field array which contains the data to present:
-               foreach ($fields as $vKey) {
-                       if (isset($data[$vKey])) {
-                               if ($lastKey) {
-                                       $cssClass = $this->addElement_tdCssClass[$lastKey];
-                                       if ($this->oddColumnsCssClass && $ccount % 2 == 0) {
-                                               $cssClass = implode(' ', array($this->addElement_tdCssClass[$lastKey], $this->oddColumnsCssClass));
-                                       }
-                                       $out .= '
-                                               <' . $colType . $noWrap . ' class="' . $cssClass . '"' . $colsp . $this->addElement_tdParams[$lastKey] . '>' . $data[$lastKey] . '</' . $colType .'>';
-                               }
-                               $lastKey = $vKey;
-                               $c = 1;
-                               $ccount++;
-                       } else {
-                               if (!$lastKey) {
-                                       $lastKey = $vKey;
-                               }
-                               $c++;
-                       }
-                       if ($c > 1) {
-                               $colsp = ' colspan="' . $c . '"';
-                       } else {
-                               $colsp = '';
-                       }
-               }
-               if ($lastKey) {
-                       $cssClass = $this->addElement_tdCssClass[$lastKey];
-                       if ($this->oddColumnsCssClass) {
-                               $cssClass = implode(' ', array($this->addElement_tdCssClass[$lastKey], $this->oddColumnsCssClass));
-                       }
-                       $out .= '
+        }
+        // Init rendering.
+        $colsp = '';
+        $lastKey = '';
+        $c = 0;
+        $ccount = 0;
+        // __label is used as the label key to circumvent problems with uid used as label (see #67756)
+        // as it was introduced later on, check if it really exists before using it
+        $fields = $this->fieldArray;
+        if ($colType === 'td' && array_key_exists('__label', $data)) {
+            $fields[0] = '__label';
+        }
+        // Traverse field array which contains the data to present:
+        foreach ($fields as $vKey) {
+            if (isset($data[$vKey])) {
+                if ($lastKey) {
+                    $cssClass = $this->addElement_tdCssClass[$lastKey];
+                    if ($this->oddColumnsCssClass && $ccount % 2 == 0) {
+                        $cssClass = implode(' ', array($this->addElement_tdCssClass[$lastKey], $this->oddColumnsCssClass));
+                    }
+                    $out .= '
+                                               <' . $colType . $noWrap . ' class="' . $cssClass . '"' . $colsp . $this->addElement_tdParams[$lastKey] . '>' . $data[$lastKey] . '</' . $colType . '>';
+                }
+                $lastKey = $vKey;
+                $c = 1;
+                $ccount++;
+            } else {
+                if (!$lastKey) {
+                    $lastKey = $vKey;
+                }
+                $c++;
+            }
+            if ($c > 1) {
+                $colsp = ' colspan="' . $c . '"';
+            } else {
+                $colsp = '';
+            }
+        }
+        if ($lastKey) {
+            $cssClass = $this->addElement_tdCssClass[$lastKey];
+            if ($this->oddColumnsCssClass) {
+                $cssClass = implode(' ', array($this->addElement_tdCssClass[$lastKey], $this->oddColumnsCssClass));
+            }
+            $out .= '
                                <' . $colType . $noWrap . ' class="' . $cssClass . '"' . $colsp . $this->addElement_tdParams[$lastKey] . '>' . $data[$lastKey] . '</' . $colType . '>';
-               }
-               // End row
-               $out .= '
+        }
+        // End row
+        $out .= '
                </tr>';
-               // Return row.
-               return $out;
-       }
-
-       /**
-        * Dummy function, used to write the top of a table listing.
-        *
-        * @return void
-        */
-       public function writeTop() {
-
-       }
-
-       /**
-        * Creates a forward/reverse button based on the status of ->eCounter, ->firstElementNumber, ->iLimit
-        *
-        * @param string $table Table name
-        * @return array array([boolean], [HTML]) where [boolean] is 1 for reverse element, [HTML] is the table-row code for the element
-        */
-       public function fwd_rwd_nav($table = '') {
-               $code = '';
-               if ($this->eCounter >= $this->firstElementNumber && $this->eCounter < $this->firstElementNumber + $this->iLimit) {
-                       if ($this->firstElementNumber && $this->eCounter == $this->firstElementNumber) {
-                               //      Reverse
-                               $theData = array();
-                               $titleCol = $this->fieldArray[0];
-                               $theData[$titleCol] = $this->fwd_rwd_HTML('fwd', $this->eCounter, $table);
-                               $code = $this->addElement(1, '', $theData, 'class="fwd_rwd_nav"');
-                       }
-                       return array(1, $code);
-               } else {
-                       if ($this->eCounter == $this->firstElementNumber + $this->iLimit) {
-                               //      Forward
-                               $theData = array();
-                               $titleCol = $this->fieldArray[0];
-                               $theData[$titleCol] = $this->fwd_rwd_HTML('rwd', $this->eCounter, $table);
-                               $code = $this->addElement(1, '', $theData, 'class="fwd_rwd_nav"');
-                       }
-                       return array(0, $code);
-               }
-       }
-
-       /**
-        * Creates the button with link to either forward or reverse
-        *
-        * @param string $type Type: "fwd" or "rwd
-        * @param int $pointer Pointer
-        * @param string $table Table name
-        * @return string
-        * @access private
-        */
-       public function fwd_rwd_HTML($type, $pointer, $table = '') {
-               $content = '';
-               $tParam = $table ? '&table=' . rawurlencode($table) : '';
-               $iconFactory = GeneralUtility::makeInstance(IconFactory::class);
-               switch ($type) {
-                       case 'fwd':
-                               $href = $this->listURL() . '&pointer=' . ($pointer - $this->iLimit) . $tParam;
-                               $content = '<a href="' . htmlspecialchars($href) . '">' . $iconFactory->getIcon('actions-move-up', Icon::SIZE_SMALL)->render() . '</a> <i>[1 - ' . $pointer . ']</i>';
-                               break;
-                       case 'rwd':
-                               $href = $this->listURL() . '&pointer=' . $pointer . $tParam;
-                               $content = '<a href="' . htmlspecialchars($href) . '">' . $iconFactory->getIcon('actions-move-down', Icon::SIZE_SMALL)->render() . '</a> <i>[' . ($pointer + 1) . ' - ' . $this->totalItems . ']</i>';
-                               break;
-               }
-               return $content;
-       }
-
-       /**
-        * Creates the URL to this script, including all relevant GPvars
-        *
-        * @param string $altId Alternative id value. Enter blank string for the current id ($this->id)
-        * @return string URL
-        */
-       public function listURL($altId = '') {
-               return $this->getThisScript() . 'id=' . ($altId !== '' ? $altId : $this->id);
-       }
-
-       /**
-        * Returning JavaScript for ClipBoard functionality.
-        *
-        * @return string
-        */
-       public function CBfunctions() {
-               return '
+        // Return row.
+        return $out;
+    }
+
+    /**
+     * Dummy function, used to write the top of a table listing.
+     *
+     * @return void
+     */
+    public function writeTop()
+    {
+    }
+
+    /**
+     * Creates a forward/reverse button based on the status of ->eCounter, ->firstElementNumber, ->iLimit
+     *
+     * @param string $table Table name
+     * @return array array([boolean], [HTML]) where [boolean] is 1 for reverse element, [HTML] is the table-row code for the element
+     */
+    public function fwd_rwd_nav($table = '')
+    {
+        $code = '';
+        if ($this->eCounter >= $this->firstElementNumber && $this->eCounter < $this->firstElementNumber + $this->iLimit) {
+            if ($this->firstElementNumber && $this->eCounter == $this->firstElementNumber) {
+                //     Reverse
+                $theData = array();
+                $titleCol = $this->fieldArray[0];
+                $theData[$titleCol] = $this->fwd_rwd_HTML('fwd', $this->eCounter, $table);
+                $code = $this->addElement(1, '', $theData, 'class="fwd_rwd_nav"');
+            }
+            return array(1, $code);
+        } else {
+            if ($this->eCounter == $this->firstElementNumber + $this->iLimit) {
+                //     Forward
+                $theData = array();
+                $titleCol = $this->fieldArray[0];
+                $theData[$titleCol] = $this->fwd_rwd_HTML('rwd', $this->eCounter, $table);
+                $code = $this->addElement(1, '', $theData, 'class="fwd_rwd_nav"');
+            }
+            return array(0, $code);
+        }
+    }
+
+    /**
+     * Creates the button with link to either forward or reverse
+     *
+     * @param string $type Type: "fwd" or "rwd
+     * @param int $pointer Pointer
+     * @param string $table Table name
+     * @return string
+     * @access private
+     */
+    public function fwd_rwd_HTML($type, $pointer, $table = '')
+    {
+        $content = '';
+        $tParam = $table ? '&table=' . rawurlencode($table) : '';
+        $iconFactory = GeneralUtility::makeInstance(IconFactory::class);
+        switch ($type) {
+            case 'fwd':
+                $href = $this->listURL() . '&pointer=' . ($pointer - $this->iLimit) . $tParam;
+                $content = '<a href="' . htmlspecialchars($href) . '">' . $iconFactory->getIcon('actions-move-up', Icon::SIZE_SMALL)->render() . '</a> <i>[1 - ' . $pointer . ']</i>';
+                break;
+            case 'rwd':
+                $href = $this->listURL() . '&pointer=' . $pointer . $tParam;
+                $content = '<a href="' . htmlspecialchars($href) . '">' . $iconFactory->getIcon('actions-move-down', Icon::SIZE_SMALL)->render() . '</a> <i>[' . ($pointer + 1) . ' - ' . $this->totalItems . ']</i>';
+                break;
+        }
+        return $content;
+    }
+
+    /**
+     * Creates the URL to this script, including all relevant GPvars
+     *
+     * @param string $altId Alternative id value. Enter blank string for the current id ($this->id)
+     * @return string URL
+     */
+    public function listURL($altId = '')
+    {
+        return $this->getThisScript() . 'id=' . ($altId !== '' ? $altId : $this->id);
+    }
+
+    /**
+     * Returning JavaScript for ClipBoard functionality.
+     *
+     * @return string
+     */
+    public function CBfunctions()
+    {
+        return '
                // checkOffCB()
        function checkOffCB(listOfCBnames, link) {      //
                var checkBoxes, flag, i;
@@ -403,91 +410,96 @@ abstract class AbstractRecordList {
        }
 
                ';
-       }
-
-       /**
-        * Initializes page languages and icons
-        *
-        * @return void
-        */
-       public function initializeLanguages() {
-               // Look up page overlays:
-               $this->pageOverlays = $this->getDatabaseConnection()->exec_SELECTgetRows('*', 'pages_language_overlay', 'pid=' . (int)$this->id . BackendUtility::deleteClause('pages_language_overlay') . BackendUtility::versioningPlaceholderClause('pages_language_overlay'), '', '', '', 'sys_language_uid');
-               $this->languageIconTitles = $this->getTranslateTools()->getSystemLanguages($this->id);
-       }
-
-       /**
-        * Return the icon for the language
-        *
-        * @param int $sys_language_uid Sys language uid
-        * @param bool $addAsAdditionalText If set to true, only the flag is returned
-        * @return string Language icon
-        */
-       public function languageFlag($sys_language_uid, $addAsAdditionalText = TRUE) {
-               $out = '';
-               $title = htmlspecialchars($this->languageIconTitles[$sys_language_uid]['title']);
-               if ($this->languageIconTitles[$sys_language_uid]['flagIcon']) {
-                       $iconFactory = GeneralUtility::makeInstance(IconFactory::class);
-                       $out .= '<span title="' . $title . '">' . $iconFactory->getIcon($this->languageIconTitles[$sys_language_uid]['flagIcon'], Icon::SIZE_SMALL)->render() . '</span>';
-                       if (!$addAsAdditionalText) {
-                               return $out;
-                       }
-                       $out .= '&nbsp;';
-               }
-               $out .= $title;
-               return $out;
-       }
-
-       /**
-        * Gets an instance of TranslationConfigurationProvider
-        *
-        * @return TranslationConfigurationProvider
-        */
-       protected function getTranslateTools() {
-               if (!isset($this->translateTools)) {
-                       $this->translateTools = GeneralUtility::makeInstance(TranslationConfigurationProvider::class);
-               }
-               return $this->translateTools;
-       }
-
-       /**
-        * Generates HTML code for a Reference tooltip out of
-        * sys_refindex records you hand over
-        *
-        * @param int $references number of records from sys_refindex table
-        * @param string $launchViewParameter JavaScript String, which will be passed as parameters to top.launchView
-        * @return string
-        */
-       protected function generateReferenceToolTip($references, $launchViewParameter = '') {
-               if (!$references) {
-                       $htmlCode = '-';
-               } else {
-                       $htmlCode = '<a href="#"';
-                       if ($launchViewParameter !== '') {
-                               $htmlCode .= ' onclick="' . htmlspecialchars(('top.launchView(' . $launchViewParameter . '); return false;')) . '"';
-                       }
-                       $htmlCode .= ' title="' . htmlspecialchars($this->getLanguageService()->sl('LLL:EXT:backend/Resources/Private/Language/locallang.xlf:show_references') . ' (' .  $references . ')') . '">';
-                       $htmlCode .= $references;
-                       $htmlCode .= '</a>';
-               }
-               return $htmlCode;
-       }
-
-       /**
-        * Returns the language service
-        * @return LanguageService
-        */
-       protected function getLanguageService() {
-               return $GLOBALS['LANG'];
-       }
-
-       /**
-        * Returns the database connection
-        *
-        * @return DatabaseConnection
-        */
-       protected function getDatabaseConnection() {
-               return $GLOBALS['TYPO3_DB'];
-       }
-
+    }
+
+    /**
+     * Initializes page languages and icons
+     *
+     * @return void
+     */
+    public function initializeLanguages()
+    {
+        // Look up page overlays:
+        $this->pageOverlays = $this->getDatabaseConnection()->exec_SELECTgetRows('*', 'pages_language_overlay', 'pid=' . (int)$this->id . BackendUtility::deleteClause('pages_language_overlay') . BackendUtility::versioningPlaceholderClause('pages_language_overlay'), '', '', '', 'sys_language_uid');
+        $this->languageIconTitles = $this->getTranslateTools()->getSystemLanguages($this->id);
+    }
+
+    /**
+     * Return the icon for the language
+     *
+     * @param int $sys_language_uid Sys language uid
+     * @param bool $addAsAdditionalText If set to true, only the flag is returned
+     * @return string Language icon
+     */
+    public function languageFlag($sys_language_uid, $addAsAdditionalText = true)
+    {
+        $out = '';
+        $title = htmlspecialchars($this->languageIconTitles[$sys_language_uid]['title']);
+        if ($this->languageIconTitles[$sys_language_uid]['flagIcon']) {
+            $iconFactory = GeneralUtility::makeInstance(IconFactory::class);
+            $out .= '<span title="' . $title . '">' . $iconFactory->getIcon($this->languageIconTitles[$sys_language_uid]['flagIcon'], Icon::SIZE_SMALL)->render() . '</span>';
+            if (!$addAsAdditionalText) {
+                return $out;
+            }
+            $out .= '&nbsp;';
+        }
+        $out .= $title;
+        return $out;
+    }
+
+    /**
+     * Gets an instance of TranslationConfigurationProvider
+     *
+     * @return TranslationConfigurationProvider
+     */
+    protected function getTranslateTools()
+    {
+        if (!isset($this->translateTools)) {
+            $this->translateTools = GeneralUtility::makeInstance(TranslationConfigurationProvider::class);
+        }
+        return $this->translateTools;
+    }
+
+    /**
+     * Generates HTML code for a Reference tooltip out of
+     * sys_refindex records you hand over
+     *
+     * @param int $references number of records from sys_refindex table
+     * @param string $launchViewParameter JavaScript String, which will be passed as parameters to top.launchView
+     * @return string
+     */
+    protected function generateReferenceToolTip($references, $launchViewParameter = '')
+    {
+        if (!$references) {
+            $htmlCode = '-';
+        } else {
+            $htmlCode = '<a href="#"';
+            if ($launchViewParameter !== '') {
+                $htmlCode .= ' onclick="' . htmlspecialchars(('top.launchView(' . $launchViewParameter . '); return false;')) . '"';
+            }
+            $htmlCode .= ' title="' . htmlspecialchars($this->getLanguageService()->sl('LLL:EXT:backend/Resources/Private/Language/locallang.xlf:show_references') . ' (' .  $references . ')') . '">';
+            $htmlCode .= $references;
+            $htmlCode .= '</a>';
+        }
+        return $htmlCode;
+    }
+
+    /**
+     * Returns the language service
+     * @return LanguageService
+     */
+    protected function getLanguageService()
+    {
+        return $GLOBALS['LANG'];
+    }
+
+    /**
+     * Returns the database connection
+     *
+     * @return DatabaseConnection
+     */
+    protected function getDatabaseConnection()
+    {
+        return $GLOBALS['TYPO3_DB'];
+    }
 }