/** * Add the relation filters * @param \DataContainer $dc in BE * @return string */ public function addRelationFilters($dc) { if (empty(static::$arrFilterableFields)) { return ''; } $filter = $GLOBALS['TL_DCA'][$dc->table]['list']['sorting']['mode'] == 4 ? $dc->table . '_' . CURRENT_ID : $dc->table; $session = \Session::getInstance()->getData(); // Set filter from user input if (\Input::post('FORM_SUBMIT') == 'tl_filters') { foreach (array_keys(static::$arrFilterableFields) as $field) { if (\Input::post($field, true) != 'tl_' . $field) { $session['filter'][$filter][$field] = \Input::post($field, true); } else { unset($session['filter'][$filter][$field]); } } \Session::getInstance()->setData($session); } $count = 0; $return = '<div class="tl_filter tl_subpanel"> <strong>' . $GLOBALS['TL_LANG']['HST']['advanced_filter'] . '</strong> '; foreach (static::$arrFilterableFields as $field => $arrRelation) { $return .= '<select name="' . $field . '" class="tl_select' . (isset($session['filter'][$filter][$field]) ? ' active' : '') . '"> <option value="tl_' . $field . '">' . $GLOBALS['TL_DCA'][$dc->table]['fields'][$field]['label'][0] . '</option> <option value="tl_' . $field . '">---</option>'; $arrIds = Model::getRelatedValues($arrRelation['reference_table'], $field); if (empty($arrIds)) { $return .= '</select> '; // Add the line-break after 5 elements if (++$count % 5 == 0) { $return .= '<br>'; } continue; } $options = array_unique($arrIds); $options_callback = array(); // Store the field name to be used e.g. in the options_callback $this->field = $field; // Call the options_callback if ((is_array($GLOBALS['TL_DCA'][$dc->table]['fields'][$field]['options_callback']) || is_callable($GLOBALS['TL_DCA'][$dc->table]['fields'][$field]['options_callback'])) && !$GLOBALS['TL_DCA'][$dc->table]['fields'][$field]['reference']) { if (is_array($GLOBALS['TL_DCA'][$dc->table]['fields'][$field]['options_callback'])) { $strClass = $GLOBALS['TL_DCA'][$dc->table]['fields'][$field]['options_callback'][0]; $strMethod = $GLOBALS['TL_DCA'][$dc->table]['fields'][$field]['options_callback'][1]; $objClass = \System::importStatic($strClass); $options_callback = $objClass->{$strMethod}($this); } elseif (is_callable($GLOBALS['TL_DCA'][$dc->table]['fields'][$field]['options_callback'])) { $options_callback = $GLOBALS['TL_DCA'][$dc->table]['fields'][$field]['options_callback']($this); } // Sort options according to the keys of the callback array $options = array_intersect(array_keys($options_callback), $options); } $options_sorter = array(); // Options foreach ($options as $kk => $vv) { $value = $vv; // Options callback if (!empty($options_callback) && is_array($options_callback)) { $vv = $options_callback[$vv]; } elseif (isset($GLOBALS['TL_DCA'][$dc->table]['fields'][$field]['foreignKey'])) { // Replace the ID with the foreign key $key = explode('.', $GLOBALS['TL_DCA'][$dc->table]['fields'][$field]['foreignKey'], 2); $objParent = \Database::getInstance()->prepare("SELECT " . $key[1] . " AS value FROM " . $key[0] . " WHERE id=?")->limit(1)->execute($vv); if ($objParent->numRows) { $vv = $objParent->value; } } $option_label = ''; // Use reference array if (isset($GLOBALS['TL_DCA'][$dc->table]['fields'][$field]['reference'])) { $option_label = is_array($GLOBALS['TL_DCA'][$dc->table]['fields'][$field]['reference'][$vv]) ? $GLOBALS['TL_DCA'][$dc->table]['fields'][$field]['reference'][$vv][0] : $GLOBALS['TL_DCA'][$dc->table]['fields'][$field]['reference'][$vv]; } elseif ($GLOBALS['TL_DCA'][$dc->table]['fields'][$field]['eval']['isAssociative'] || array_is_assoc($GLOBALS['TL_DCA'][$dc->table]['fields'][$field]['options'])) { // Associative array $option_label = $GLOBALS['TL_DCA'][$dc->table]['fields'][$field]['options'][$vv]; } // No empty options allowed if (!strlen($option_label)) { $option_label = $vv ?: '-'; } $options_sorter[' <option value="' . specialchars($value) . '"' . (isset($session['filter'][$filter][$field]) && $value == $session['filter'][$filter][$field] ? ' selected="selected"' : '') . '>' . $option_label . '</option>'] = utf8_romanize($option_label); } $return .= "\n" . implode("\n", array_keys($options_sorter)); $return .= '</select> '; // Add the line-break after 5 elements if (++$count % 5 == 0) { $return .= '<br>'; } } return $return . '</div>'; }