Produkty Objednávky Zákazníci Dokumentace
Nepřihlášen Uživatel 1 Uživatel 2 Uživatel 3
Část III · Enum sloupce

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 app/Modules/AdminModule/Components/Docs/Columns/EnumFilterOptionsGridControl/EnumFilterOptionsGridControl.php
<?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');
    }
}
sql app/Modules/AdminModule/Components/Docs/Columns/EnumFilterOptionsGridControl/EnumFilterOptionsGridControl.sql
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.