Filtry - Jet\DataListing_Filter
Každý filtr seznamu dat je tvořen svou třídou, která dědí od abstraktní třídy Jet\DataListing_Filter a reprezentuje logiku daného filtru. Rovnou si jeden reálný filtr ukažme. Zůstaneme u prohlížeče událostí a koukneme se na filtr pomocí kterého je možné filtrovat seznam dle druhu události:
namespace JetApplicationModule\EventViewer\Admin;
use Jet\DataListing_Filter;
use Jet\Form;
use Jet\Form_Field_Input;
use Jet\Http_Request;
class Listing_Filter_Event extends DataListing_Filter {
public const KEY = 'event';
protected string $event = '';
public function getKey(): string
{
return static::KEY;
}
public function catchParams(): void
{
$this->event = Http_Request::GET()->getString( 'event' );
$this->listing->setParam( 'event', $this->event );
}
public function catchForm( Form $form ): void
{
$this->event = $form->field( 'event' )->getValue();
$this->listing->setParam( 'event', $this->event );
}
public function generateFormFields( Form $form ): void
{
$field = new Form_Field_Input( 'event', 'Event:' );
$field->setDefaultValue( $this->event );
$form->addField( $field );
}
public function generateWhere(): void
{
if( $this->event ) {
$this->listing->addFilterWhere( [
'event' => $this->event,
] );
}
}
}
Co tedy musí povinně filtr umět:
- Zachytávat své parametry - metoda catchParams
- Generovat definice formulářových prvků pro filtrační formulář - metoda generateFormFields
- Zachytávat hodnoty z filtračního formulář (který je v daný moment již zachycen a validován) - metoda catchForm
- Generovat WHERE část dotazu pro ORM DataModel - metoda generateWhere
- Každý filtr musí být identifikován svým unikátním klíčem.
View filtru
Každý filtr má své příslušné view. Pro zobrazení filtru ve view, které zobrazuje příslušný seznam se používá toto volání:
<?=$listing->filter(Listing_Filter_Event::KEY)->renderForm()?>
Ovšem toto volání ve finále zavolá view skript daného filtru, který může mít například tuto podobu:
<?php
namespace JetApplicationModule\EventViewer\Admin;
use Jet\MVC_View;
/**
* @var MVC_View $this
* @var Listing $listing
*/
$listing = $this->getRaw( 'listing' );
$filter_form = $listing->getFilterForm();
?>
<?= $filter_form->field( 'event' )->label() ?>
<?= $filter_form->field( 'event' )->input()?>
Název view skriptu musí odpovídat identifikačnímu klíči filtru. Tedy v našem příkladu je to event.phtml.
Přehled metod
Metoda | Význam |
---|---|
public setListing( DataListing $listing ) : void |
Seznam automaticky při předání filtru nastavuje filtru referenci na sebe. K tomu slouží tato metoda. |
public getListing( ) : DataListing |
Vrací instanci seznamu dat do kterého filtr náleží. |
abstract public getKey( ) : string |
Vrací unikátní klíč identifikující filtr. Doporučuje se implementovat takto:
class Listing_Filter_Event extends DataListing_Filter {
A s filtrem následně pracovat takto:
<?=$listing->filter(Listing_Filter_Event::KEY)->renderForm()?>
|
abstract public catchParams( ) : void |
Metoda slouží k zachycení parametrů filtru, například GET parametrů z URL. |
abstract public generateFormFields( Form $form ) : void |
Metoda slouží k vygenerování formulářových polí filtru. |
abstract public catchForm( Form $form ) : void |
Metoda slouží k zachycení hodnot z formuláře filtru. Volá se v momentě, kdy je formulář již zachycen a zvalidován. |
abstract public generateWhere( ) : void |
Generuje WHERE část dotazu pro ORM DataModel pro samotnou filtraci dat. |
public renderForm( ) : string |
Postará se o vygenerování příslušného filtru. Výchozí implementace je tato:
$view = $this->listing->getFilterView();
Z čehož plyne:
|
Předpřipravené filtry
Pro usnadnění práce Jet obsahuje několik již předpřipravených filtrů, u kterých stačí dokončit implementaci. Zde je jejich seznam:
Jet\DataListing_Filter_Search | Klasické políčko pro textové vyhledávání. |
Jet\DataListing_Filter_DateInterval | Definice rozmezí data (od - do). Dvě vstupní pole. |
Jet\DataListing_Filter_DateTimeInterval | Definice rozmezí data a času (od - do). Dvě vstupní pole. |
Jet\DataListing_Filter_OptionSelect | Výběr z definovaných možností (select box). |