Contao\DC_Table::sortMenu PHP Method

sortMenu() protected method

Return a select menu that allows to sort results by a particular field
protected sortMenu ( ) : string
return string
    protected function sortMenu()
    {
        if ($GLOBALS['TL_DCA'][$this->strTable]['list']['sorting']['mode'] != 2 && $GLOBALS['TL_DCA'][$this->strTable]['list']['sorting']['mode'] != 4) {
            return '';
        }
        $sortingFields = array();
        // Get sorting fields
        foreach ($GLOBALS['TL_DCA'][$this->strTable]['fields'] as $k => $v) {
            if ($v['sorting']) {
                $sortingFields[] = $k;
            }
        }
        // Return if there are no sorting fields
        if (empty($sortingFields)) {
            return '';
        }
        /** @var AttributeBagInterface $objSessionBag */
        $objSessionBag = \System::getContainer()->get('session')->getBag('contao_backend');
        $this->bid = 'tl_buttons_a';
        $session = $objSessionBag->all();
        $orderBy = $GLOBALS['TL_DCA'][$this->strTable]['list']['sorting']['fields'];
        $firstOrderBy = preg_replace('/\\s+.*$/', '', $orderBy[0]);
        // Add PID to order fields
        if ($GLOBALS['TL_DCA'][$this->strTable]['list']['sorting']['mode'] == 3 && $this->Database->fieldExists('pid', $this->strTable)) {
            array_unshift($orderBy, 'pid');
        }
        // Set sorting from user input
        if (\Input::post('FORM_SUBMIT') == 'tl_filters') {
            $strSort = \Input::post('tl_sort');
            // Validate the user input (thanks to aulmn) (see #4971)
            if (in_array($strSort, $sortingFields)) {
                $session['sorting'][$this->strTable] = in_array($GLOBALS['TL_DCA'][$this->strTable]['fields'][$strSort]['flag'], array(2, 4, 6, 8, 10, 12)) ? "{$strSort} DESC" : $strSort;
                $objSessionBag->replace($session);
            }
        } elseif (strlen($session['sorting'][$this->strTable])) {
            $overwrite = preg_quote(preg_replace('/\\s+.*$/', '', $session['sorting'][$this->strTable]), '/');
            $orderBy = array_diff($orderBy, preg_grep('/^' . $overwrite . '/i', $orderBy));
            array_unshift($orderBy, $session['sorting'][$this->strTable]);
            $this->firstOrderBy = $overwrite;
            $this->orderBy = $orderBy;
        }
        $options_sorter = array();
        // Sorting fields
        foreach ($sortingFields as $field) {
            $options_label = strlen($lbl = is_array($GLOBALS['TL_DCA'][$this->strTable]['fields'][$field]['label']) ? $GLOBALS['TL_DCA'][$this->strTable]['fields'][$field]['label'][0] : $GLOBALS['TL_DCA'][$this->strTable]['fields'][$field]['label']) ? $lbl : $GLOBALS['TL_LANG']['MSC'][$field];
            if (is_array($options_label)) {
                $options_label = $options_label[0];
            }
            $options_sorter[$options_label] = '  <option value="' . \StringUtil::specialchars($field) . '"' . (!strlen($session['sorting'][$this->strTable]) && $field == $firstOrderBy || $field == str_replace(' DESC', '', $session['sorting'][$this->strTable]) ? ' selected="selected"' : '') . '>' . $options_label . '</option>';
        }
        // Sort by option values
        uksort($options_sorter, 'strcasecmp');
        return '

<div class="tl_sorting tl_subpanel">
<strong>' . $GLOBALS['TL_LANG']['MSC']['sortBy'] . ':</strong>
<select name="tl_sort" id="tl_sort" class="tl_select">
' . implode("\n", $options_sorter) . '
</select>
</div>';
    }