Im Backend Suchwerkzeuge (Filter) immer eingeblendet halten (Stand: Joomla 3.9.6)
Mich nerven die Suchwerkzeuge im Backend. Weil sie immer verschwinden, wenn in den Filterboxen nichts ausgewählt ist oder, wenn man auf Zurücksetzen klickt. Diese wiederholte Klickerei, um sie wieder anzuzeigen kann man mit einem Joomla-Layout-Override abschaffen und den Suchwerkzeugebutton zugleich verstecken. Der Override wird für das ganze Backend mit Isis-Template angelegt.
Nicht geeignet für Joomla 4!
Hinweis vom aufmerksamen Leser und Tester Ladislav M. per Email am 10.05.2019: Dieser Override funktioniert nicht in der Menüs-Ecke des Joomla-Backends.
"Ich denke für Sie eher zur Info, die wichtigste Stelle für die Suchwerkzeuge sind ja die Beiträge: In Menüs >> Menüeinträge bleiben die Suchwerkzeuge [trotz Override] eingeklappt."
Antwort von mir:
"Ja, die Menüs-Ecke bzw. die Komponente com_menus verwendet eigene Overrides für die Suchwerkzeuge, die unseren Override überschreiben, da Komponenten-Overrides für JLayouts die im Template 'overrulen'. Für diese Komponenten-Overrides könnte man nun zwar ebenfalls weitere, abweichende Komponenten-Overrides-Overrides im Template unter anderen Pfaden anlegen, aber..."
Kurz: Bin ich zu faul. Gerne mal auf gezielte Rückfrage, wenn's wer dringend braucht.
Für Interessierte: Kurze Begriffsklärung: Layouts vs. JLayouts
Seit Joomla 3.2 werden viele, häufiger verwendeten Grund-Elemente im /layouts/-Ordner abgelegt. Sowohl Backend- als auch Frontenderweiterungen können darauf zugreifen. Es werden stetig mehr. Alle PHP-Dateien in diesem Verzeichnis sind updatesicher überschreibbar, also Teil des berühmten Joomla-Override-Systems. Liest man irgendwo was über "JLayout" oder "JLayouts" sind meist Files in diesem Ordner gemeint. Musste ich auch erst kapieren. Will nur sagen: Suche nach Layout-Override, ein Begriff der schon lange vor JLayouts im Joomla-Jargon verwendet wurde, kann einen ganz schön in die Irre führen, manchmal aber auch JLayouts meinen. Ein Hoch auf die Transparenz!
JLayout-Override für Suchwerkzeuge (Searchtools)
Im /layouts/-Ordner liegen mehrere, voneinander abhängige Ausgabedateien für die Suchwerkzeuge (Ordner /layouts/joomla/searchtools/), die in Joomla im Backend in den Listenansichten zu sehen sind, wenn man das ISIS-Template verwendet.
Ein Button Suchwerkzeuge, der bei Anklicken die Filter-Dropdown-Boxen aufklappt oder wieder versteckt. Setzt man einen einmal gesetzten Filter wieder auf den Urzustand zurück, verschwinden alle Boxen. Das ist ein Feature, kein Bug. Mit dem folgend beschriebenen Override für eine einzelne JLayout-Datei, den man am Ende des Beitrags zum Herunterladen findet, wird man das Verhalten los und den Knopf auch gleich..
Wir müssen lediglich 1 Datei überschreiben, indem wir eine gleichbenannte (inklusive der zugehörigen /layouts/-Ordnerhierarchie) im /html/-Ordner des Backendtemplates Isis anlegen.
Fehlende Ordner innerhalb des Isis-Templates müssen Sie folgend zuvor selbst anlegen.
Unser Override wird im Backend die folgende Datei ersetzen, besser: überschreiben.
An dieser Datei selbst dürfen wir nichts ändern! Sonst wäre es kein updatesicherer Override, sondern ein verbotener Core-Hack.
/layouts/joomla/searchtools/default.php
Override erstellen
Tipp: Alle Schritte können per FTP, aber auch mit dem Template-Editor im Joomla-Backend erfolgen.
Legen Sie für das Isis-Template folgende Ordnerstruktur an, soweit noch nicht vorhanden. Hier kommt unsere Override-Datei gleich rein.
/administrator/templates/isis/html/layouts/joomla/searchtools/
Variante 1: Code kopieren
Legen Sie eine leere Datei default.php in diesem Ordner an und kopieren Sie den folgenden Overridecode hinein.
<?php
/**
* @package Joomla.Site
* @subpackage Layout
*
* @copyright Copyright (C) 2005 - 2017 Open Source Matters, Inc. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
/**
* Override by ghsvs.de 2019-05-10
* @link https://www.ghsvs.de/programmierer-schnipsel/joomla/165-suchwerkzeuge-filter-immer-sichtbar
*/
defined('JPATH_BASE') or die;
$data = $displayData;
// Receive overridable options
$data['options'] = !empty($data['options']) ? $data['options'] : array();
$noResultsText = '';
$hideActiveFilters = false;
$showFilterButton = false;
$showSelector = false;
$selectorFieldName = isset($data['options']['selectorFieldName']) ? $data['options']['selectorFieldName'] : 'client_id';
// If a filter form exists.
if (isset($data['view']->filterForm) && !empty($data['view']->filterForm))
{
// Checks if a selector (e.g. client_id) exists.
if ($selectorField = $data['view']->filterForm->getField($selectorFieldName))
{
$showSelector = $selectorField->getAttribute('filtermode', '') == 'selector' ? true : $showSelector;
// Checks if a selector shoudl be shown in the current layout.
if (isset($data['view']->layout))
{
$showSelector = $selectorField->getAttribute('layout', 'default') != $data['view']->layout ? false : $showSelector;
}
// Unset the selector field from active filters group.
unset($data['view']->activeFilters[$selectorFieldName]);
}
// Checks if the filters button should exist.
$filters = $data['view']->filterForm->getGroup('filter');
$showFilterButton = isset($filters['filter_search']) && count($filters) === 1 ? false : true;
// Checks if it should show the be hidden.
$hideActiveFilters = empty($data['view']->activeFilters);
// Check if the no results message should appear.
if (isset($data['view']->total) && (int) $data['view']->total === 0)
{
$noResults = $data['view']->filterForm->getFieldAttribute('search', 'noresults', '', 'filter');
if (!empty($noResults))
{
$noResultsText = JText::_($noResults);
}
}
}
// Set some basic options.
$customOptions = array(
'filtersHidden' => isset($data['options']['filtersHidden']) && $data['options']['filtersHidden'] ? $data['options']['filtersHidden'] : $hideActiveFilters,
'filterButton' => isset($data['options']['filterButton']) && $data['options']['filterButton'] ? $data['options']['filterButton'] : $showFilterButton,
'defaultLimit' => isset($data['options']['defaultLimit']) ? $data['options']['defaultLimit'] : JFactory::getApplication()->get('list_limit', 20),
'searchFieldSelector' => '#filter_search',
'selectorFieldName' => $selectorFieldName,
'showSelector' => $showSelector,
'orderFieldSelector' => '#list_fullordering',
'showNoResults' => !empty($noResultsText) ? true : false,
'noResultsText' => !empty($noResultsText) ? $noResultsText : '',
'formSelector' => !empty($data['options']['formSelector']) ? $data['options']['formSelector'] : '#adminForm',
);
$customOptions['filterButton'] = 0;
$customOptions['filtersHidden'] = 0;
// Merge custom options in the options array.
$data['options'] = array_merge($customOptions, $data['options']);
// Add class to hide the active filters if needed.
$filtersActiveClass = $hideActiveFilters ? '' : ' js-stools-container-filters-visible';
// Load search tools
JHtml::_('searchtools.form', $data['options']['formSelector'], $data['options']);
?>
<div class="js-stools clearfix">
<div class="clearfix">
<?php if ($data['options']['showSelector']) : ?>
<div class="js-stools-container-selector">
<?php echo JLayoutHelper::render('joomla.searchtools.default.selector', $data); ?>
</div>
<?php endif; ?>
<div class="js-stools-container-bar">
<?php echo $this->sublayout('bar', $data); ?>
</div>
<div class="js-stools-container-list hidden-phone hidden-tablet">
<?php echo $this->sublayout('list', $data); ?>
</div>
</div>
<!-- Filters div -->
<?php #if ($data['options']['filterButton']) : ?>
<div class="js-stools-container-filters hidden-phone clearfix<?php echo $filtersActiveClass; ?>">
<?php echo $this->sublayout('filters', $data); ?>
</div>
<?php #endif; ?>
</div>
<?php if ($data['options']['showNoResults']) : ?>
<?php echo $this->sublayout('noitems', $data); ?>
<?php endif; ?>
Variante 2: Download des Overrides
Laden Sie sich die ZIP-Datei am Ende dieses Beitrags herunter und entpacken Sie sie. Darin finden Sie die Datei default.php, die Sie in den oben angelegten Ordner hochladen.
Der Override-Code (siehe oben)
Zeile 76: Eine Option, die einen der Unter-JLayouts unserer default.php anweist, den Suchwerkzeuge-Button NICHT anzuzeigen.
Zeile 77: Eine Option, die einen der Unter-JLayouts unserer default.php anweist, die Filterfelder anzuzeigen, anstatt sie, wie üblich, auszublenden.
Zeilen 103 und 107: Deaktivierung der if-Anweisung, die die Such-Tools u.U. nicht anzeigen könnten.