Joomla: Mit JLayout 'Search Tools' im Joomla 3 Admin Backend List Views erstellen

In Joomla 3 ist die Nutzung eigener Filter für ein List-View im Backend stark vereinfacht worden. Mit Hilfe der bordeigenen Search Toos erstellen Sie mit nur wenigen Zeilen Code eine leistungsfähige Filtermaschine für Ihre eigene Erweiterung.

Im folgenden finden Sie eine kompakte Anleitung für die Erstellung eigener Filter.

 1. Ordner-Struktur und alle Dateien, die wir benötigen

Angenommen wir haben eine eigene Erweiterung com_cities. In dieser Erweiterung verwalten wir Städtename und die Region, in der sich die Stadt befindet. Über einen Filter möchten wir im List-View alle Städte angezeigt bekommen, deren Region dem gewählten Filter entsprechen.
Für diese Erweiterung sieht die Ordner-Struktur für unsere Filter in so aus:

/administrator/components/com_cities/models/
/administrator/components/com_cities/models/fields/
/administrator/components/com_cities/models/forms/
/administrator/components/com_cities/views/

Nun kommen die Dateien, die wir ändern bzw. ergänzen müssen:

/administrator/components/com_cities/models/forms/filter_regionen.xml
/administrator/components/com_cities/models/fields/region.php
/administrator/components/com_cities/models/regionen.php
/administrator/components/com_cities/views/regionen/view.html.php
/administrator/components/com_cities/views/regionen/tmpl/default.php

2. Umsetzung

Zuerst erstellen wir eine neue Datei filter_regionen.xml in /administrator/components/com_cities/models/forms. In dieser xml-Datei definieren wir alle Filter, die wir für unsere List-View einbauen wollen.

Code: xml
  1.  
  2. <?xml version="1.0" encoding="utf-8"?>
  3. fields/region.php
  4. <form>
  5.     <fields name="filter">
  6.         <field
  7.             name="search"
  8.             type="text"
  9.             label="COM_CITIES_FILTER_SEARCH_DESC"
  10.             hint="JSEARCH_FILTER"
  11.         />
  12.  
  13.         <field
  14.             name=„region“
  15.             type=„region“
  16.             label="COM_CITIES_FILTER_SELECT_REGION“
  17.             description="COM_CITIES_FILTER_SELECT_REGION_DESC"
  18.             onchange="this.form.submit();"
  19.             >
  20.                 <option value="">COM_CITIES_FILTER_SELECT_REGION</option>
  21.         </field>
  22.  
  23.         <field
  24.             name="state"
  25.             type="list"
  26.             label="COM_CONTENT_FILTER_PUBLISHED"
  27.             description="COM_CONTENT_FILTER_PUBLISHED_DESC"
  28.             onchange="this.form.submit();"
  29.             >
  30.             <option value="">JOPTION_SELECT_PUBLISHED</option>
  31.             <option value="1">COM_CITIES_PUBLISH</option>
  32.             <option value="0">COM_CITIES_UNPUBLISH</option>
  33.         </field>
  34.     </fields>
  35.  
  36.     <fields name="list">
  37.         <field
  38.             name="limit"
  39.             type="limitbox"
  40.             class="input-mini"
  41.             default="25"
  42.             label="COM_CONTENT_LIST_LIMIT"
  43.             description="COM_CONTENT_LIST_LIMIT_DESC"
  44.             onchange="this.form.submit();"
  45.         />
  46.     </fields>
  47. </form>
  48.  
  49.  

In die filter_regionen.xml haben wir insgesamt 4 Filterfelder eingebaut

search Filter für das Suchen-Feld der List-View
regionen Eigener Filter Regionen, der im nächsten Schritt als eigenes Field erstellt werden muss.
state Filter für den Status "veröffentlicht", "gesperrt", etc.
limit Filter für die Limit-Box der List-View

Nun muss für unseren eigenen Filter regionen ein entsprechendes Field erstellt werden.
Das geschieht unter /administrator/components/com_cities/models/fields/regionen.php.

Code: php
  1.  
  2. <?php
  3. /**
  4.  * @version    1.8
  5.  * @package    dats | dortmund
  6.  * @copyright  Copyright (c) 2016 dats | dortmund. All rights reserved.
  7.  * @license    GNU General Public License version 2 or later.
  8.  */
  9.  
  10. // No direct access.
  11. defined('_JEXEC') or die();
  12.  
  13. JFormHelper::loadFieldClass('list');
  14.  
  15. /**
  16.  * Supports an HTML select list of categories
  17.  */
  18. class JFormFieldRegion extends JFormFieldList
  19. {
  20.  
  21.     protected $type = ‚region‘;
  22.  
  23.     protected $loadExternally = 0;
  24.  
  25.     protected function getOptions()
  26.   {
  27.     $db = JFactory::getDbo();
  28.     $user = JFactory::getUser();
  29.     $options = array();
  30.  
  31.     $query = $db->getQuery(true);
  32.     $query->select("a.id, a.region“)->from(„#__mycities_cities as a");
  33.     $query->group(‚region‘);
  34.  
  35.     $db->setQuery($query);
  36.  
  37.     foreach ($db->loadObjectList() as $item)
  38.     {
  39.       // Create a new option object based on the <option /> element.
  40.       $tmp = JHtml::_('select.option', $item->id, $item->region);
  41.  
  42.       // Add the option object to the result set.
  43.       $options[] = $tmp;
  44.     }
  45.  
  46.     // Merge any additional options in the XML definition.
  47.     $options = array_merge(parent::getOptions(), $options);
  48.  
  49.     return $options;
  50.   }
  51. }
  52.  
  53.  

Bitte beachten: dieser Schritt ist optional und nur dann erforderlich, wenn nicht auf joomla-eigene Felder zurückgreifen möchten. In unserem Beispiel müssen wir ein eigenes Field erstellen, weil wir aus der Tabelle Regionen selbst Daten abfragen wollen, die wir als Filter-Kriterium einsetzen.

3. Aktivieren der Filter-Funktionen im View

Um Filterfunktionen in einer List-View nutzen zu können, müssen die Filter-Parameter zunächst in der View aktiviert werden. In unserem Beispiel betrifft das die folgende Datei: /administrator/components/com_cities/views/regionen/view.html.php

Die folgenden zwei Zeilen stellen die Verbindung zum Filter her

Code: php
  1.  
  2. $this->filterForm = $this->get('FilterForm');
  3. $this->activeFilters = $this->get('ActiveFilters');
  4.  

So sollte die view.html.php dann aussehen:

Code: php
  1.  
  2. class CitiesViewRegionen extends JViewLegacy
  3. {
  4.     public function display ($tpl = null)
  5.     {
  6.         $this->state = $this->get('State');
  7.         $this->items = $this->get('Items');
  8.         $this->pagination = $this->get('Pagination');
  9.  
  10.         // Get filter form.
  11.         $this->filterForm = $this->get('FilterForm');
  12.  
  13.         // Get active filters.
  14.         $this->activeFilters = $this->get('ActiveFilters');
  15.  
  16.         // Some code here
  17.          
  18.         parent::display($tpl);
  19.     }
  20. }
  21.  

4. Aktivieren der Search-Tools im default-Layout

Als nächsten muss im default-Layout unserer View die Anzeige der Joomla Search-Tools aktiviert werden. Das machen wir in der Datei /administrator/components/com_cities/views/regionen/tmpl/default.php.

Wir müssen den folgenden Code-Schnippsel einfügen.

Code: php
  1.  
  2. <?php
  3.     // Search tools bar
  4.     echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this));
  5. ?>
  6.  

Eingebaut sieht das ganze dann etwa so aus:

Code: php
  1.  
  2. <form
  3.     action="<?php echo JRoute::_('index.php?option=com_cities&view=regionen‘); ?>"
  4.     method="post" name="adminForm" id="adminForm">
  5.  
  6.     <?php if (!empty( $this->sidebar)) : ?>
  7.         <div id="j-sidebar-container" class="span2">
  8.             <?php echo $this->sidebar; ?>
  9.         </div>
  10.         <div id="j-main-container" class="span10">
  11.     <?php else : ?>
  12.         <div id="j-main-container">
  13.     <?php endif;?>
  14.             <?php
  15.             // Search tools bar
  16.             echo JLayoutHelper::render('joomla.searchtools.default', array('view' => $this));
  17.             ?>
  18.  
  19.             <!-- Alle anderen Code-Elemente kommen hier hin -->
  20.              
  21.         </div>
  22. </form>
  23.  

5. Das Model Regionen anpassen

Zum Schluss müssen wir das Model Regionen unserer Erweiterung noch mit den neuen Filter-Möglichkeiten bekannt machen. Dafür erweitern wir die folgene Datei: /administrator/components/com_cities/models/regionen.php.

Code: php
  1.  
  2. class CitiesModelRegionen extends JModelList
  3. {
  4.     public function __construct($config = array())
  5.     {
  6.         if (empty($config['filter_fields']))
  7.         {
  8.             $config['filter_fields'] = array(
  9.                 'id', 'a.id',
  10.                 'region', 'a.region',
  11.                 ‚stadt‘, ‚a.stadt‘,
  12.                 'state', 'a.state'
  13.             );
  14.         }
  15.  
  16.         parent::__construct($config);
  17.     }
  18.  
  19.     protected function populateState($ordering = null, $direction = null)
  20.     {
  21.         // Variable initialisieren.
  22.         $app = JFactory::getApplication('administrator');
  23.  
  24.         // Alle anderen Code-Elemente kommen hier hin
  25.  
  26.         $region = $app->getUserStateFromRequest($this->context . 'filter. region', 'filter_ region', '', 'string');
  27.         $this->setState('filter. region', $region);
  28.  
  29.         // Alle anderen Code-Elemente kommen hier hin
  30.  
  31.         // List state information.
  32.         parent::populateState('a.id', 'asc');
  33.     }
  34.  
  35.  
  36.     protected function getListQuery()
  37.     {
  38.          // Erstellen eines neuen Query-Objektes.
  39.          $db = $this->getDbo();
  40.          $query = $db->getQuery(true);
  41.       $query->select('a.*')->from(#__mycities_cities AS a');
  42.  
  43.       // Filter nach Suche
  44.     $search = $this->getState('filter.search');
  45.     $s = $db->quote('%'.$db->escape($search, true).'%');
  46.    
  47.           // Filter nach Region
  48.           $region = $this->getState('filter. region');
  49.  
  50.           if ($region)
  51.           {
  52.             $query->where('a.region = ' . $db->quote($db->escape($region)));
  53.           }
  54.  
  55.           // Alle anderen Code-Elemente kommen hier hin
  56.  
  57.         return $query;
  58.     }
  59. }
  60.  
  • 1946
  • Letzte Änderung am Sonntag, 14 Februar 2016 15:19

1 Kommentar

  • Kommentar-Link PHP-WRITER Sonntag, 14 Februar 2016 16:01 gepostet von PHP-WRITER

    Das ist ja mal ein echt cooles Tutorial! Hat super funktioniert! Vielen Dank dafür!

    Melden

Schreibe einen Kommentar

Bitte achten Sie darauf, alle Felder mit Stern * zu füllen. HTML-Code ist nicht erlaubt.

Heute301
Gestern320
Diese Woche954
Dieser Monat6088
Insgesamt213971

Who Is Online

2
Online

Mittwoch, 20. September 2017 21:47

Rückrufservice

Kontaktdaten

dats
Druckagentur Torsten Scheel

Malvenweg 8
44289 Dortmund

Telefon: 0231 | 13 86 86 18
E-Mail:  kontakt@torstenscheel.de