8.4. Vícenásobný výběr a vlastní hodnota
Dva poslední parametry addEnum(): $multi říká, jestli jde vybrat
víc hodnot naráz, $custom jestli smí uživatel zadat i něco, co v nabídce není.
Ukázka
Stav je vícenásobný (výchozí stav), Platba (jedna) se chová jako přepínač
a v Platbě (i vlastní) si do filtru dopíšete unknown – tuhle hodnotu
mají objednávky bez zvolené platby a enum ji nezná.
Zdrojový kód
<?php
declare(strict_types=1);
namespace App\Components\Docs\Columns\EnumFilterOptionsGridControl;
use App\Enum\OrderPayment;
use App\Enum\OrderStatus;
use Xart\Grid\Button\ButtonManager;
use Xart\Grid\Column\ColumnManager;
use Xart\Grid\Control\GridControl;
use Xart\Grid\DataOutput\Row;
use Xart\Grid\DataSource\DataSource;
use Xart\Grid\DataSource\SQL\SQLDataSource;
/**
* Dokumentace, kapitola 8.4 – Vícenásobný výběr a vlastní hodnota.
*
* Tři nabídky filtru nad týmiž daty: vícenásobná (výchozí), jediná hodnota a nabídka, do které smí
* uživatel dopsat i něco, co v enumu není.
*/
class EnumFilterOptionsGridControl extends GridControl
{
public function createDataSource(): DataSource
{
return new SQLDataSource(__DIR__ . '/EnumFilterOptionsGridControl.sql');
}
public function columns(ColumnManager $cm): void
{
$cm->add('number', 'Číslo');
// Výchozí chování: ve filtru jde zatrhnout víc stavů naráz (skládají se přes OR).
$cm->addEnum('status', 'Stav', OrderStatus::class);
// Jediná hodnota – nabídka se chová jako přepínač.
$cm->addEnum('payment', 'Platba (jedna)', OrderPayment::class, multi: false);
// Objednávky bez platby mají v tomhle sloupci „unknown“, což enum nezná. S custom: true si
// takovou hodnotu uživatel do filtru dopíše sám.
$cm->addEnum('payment_any', 'Platba (i vlastní)', OrderPayment::class, custom: true);
$cm->addNumber('total_price', 'Celkem', 2, 'Kč');
}
public function buttons(ButtonManager $bm): void
{
}
public function rows(Row $row): void
{
}
public function render(): void
{
$this->template->render(__DIR__ . '/EnumFilterOptionsGridControl.latte');
}
}
SELECT
o.id,
o.number,
o.status,
o.payment,
IFNULL(o.payment, 'unknown') AS payment_any,
o.total_price / 100 AS total_price
FROM `order` o
Vícenásobný výběr
$multi = true (výchozí) spojí zatržené hodnoty přes OR, takže
Nová + Potvrzená vybere obojí. S $multi = false je hodnota
jediná – hodí se u sloupců, kde kombinace nedává smysl, nebo když má být filtr co nejrychleji
ovladatelný. Mezi sloupci se podmínky spojují přes AND tak jako tak.
Vlastní hodnota
$custom = true má smysl jedině tam, kde data obsahují i něco mimo enum: staré
záznamy po zúžení číselníku, hodnoty z importu, prázdno nahrazené zástupnou hodnotou. Bez
něj se na takový řádek uživatel filtrem nedostane – v nabídce je jen to, co má enum.
Vlastní hodnota se porovnává přesně na rovnost, takže musí sedět na to, co je v databázi. Uloží se do nastavení gridu jako každý jiný filtr a po návratu na stránku se použije znovu – i když v datech mezitím zmizela.
Sloupec bez filtru
Když filtrovat nemá cenu, vezměte sloupci filtr úplně: setFilter(null).
Filtrovací řádek pak zůstane u toho sloupce prázdný, řazení a export fungují dál. Podrobněji
v kapitole 22.