Produkty Objednávky Zákazníci Dokumentace
Nepřihlášen Uživatel 1 Uživatel 2 Uživatel 3
Část II · Zdroje dat

4. ArrayDataSource

Grid nad polem v paměti – číselník v kódu, odpověď z API, řádky ze souboru. Filtruje, řadí i stránkuje se v PHP.

Ukázka

Osm dopravců zapsaných rovnou v komponentě. Grid nepozná rozdíl proti databázi.

Zdrojový kód

php app/Modules/AdminModule/Components/Docs/Data/ArrayGridControl/ArrayGridControl.php
<?php

declare(strict_types=1);

namespace App\Components\Docs\Data\ArrayGridControl;

use Xart\Grid\Button\ButtonManager;
use Xart\Grid\Column\ColumnManager;
use Xart\Grid\Control\GridControl;
use Xart\Grid\DataOutput\Row;
use Xart\Grid\DataSource\ArrayDataSource;
use Xart\Grid\DataSource\DataSource;

/**
 * Dokumentace, kapitola 4 – ArrayDataSource.
 *
 * Grid nad polem v paměti. Žádná databáze, a přesto funguje filtrování, řazení i stránkování –
 * jen se počítá v PHP, ne v databázi.
 */
class ArrayGridControl extends GridControl
{
    /**
     * Číselník dopravců. V praxi sem stejně dobře patří odpověď z API nebo řádky z CSV – cokoli,
     * co se dá dostat do pole „alias => hodnota“.
     *
     * @return list<array<string, mixed>>
     */
    private function carriers(): array
    {
        return [
            ['id' => 1, 'code' => 'ppl', 'name' => 'PPL', 'price' => 89.0, 'days' => 1, 'cod' => 'Ano'],
            ['id' => 2, 'code' => 'dpd', 'name' => 'DPD', 'price' => 95.0, 'days' => 1, 'cod' => 'Ano'],
            ['id' => 3, 'code' => 'zasilkovna', 'name' => 'Zásilkovna', 'price' => 65.0, 'days' => 2, 'cod' => 'Ano'],
            ['id' => 4, 'code' => 'post', 'name' => 'Česká pošta', 'price' => 79.0, 'days' => 3, 'cod' => 'Ano'],
            ['id' => 5, 'code' => 'pickup', 'name' => 'Osobní odběr', 'price' => 0.0, 'days' => 0, 'cod' => 'Ne'],
            ['id' => 6, 'code' => 'gls', 'name' => 'GLS', 'price' => 92.0, 'days' => 2, 'cod' => 'Ne'],
            ['id' => 7, 'code' => 'dhl', 'name' => 'DHL Express', 'price' => 249.0, 'days' => 1, 'cod' => 'Ne'],
            ['id' => 8, 'code' => 'balikovna', 'name' => 'Balíkovna', 'price' => 59.0, 'days' => 3, 'cod' => 'Ano'],
        ];
    }


    public function createDataSource(): DataSource
    {
        // Druhý parametr říká, který alias řádky jednoznačně identifikuje.
        return new ArrayDataSource($this->carriers(), 'id');
    }


    public function columns(ColumnManager $cm): void
    {
        $cm->add('name', 'Dopravce');
        $cm->add('code', 'Kód');
        $cm->addNumber('price', 'Cena', 0, 'Kč');
        $cm->addNumber('days', 'Doručení (dní)', 0);
        $cm->addSelect('cod', 'Dobírka', ['Ano', 'Ne'], multi: false);
    }


    public function buttons(ButtonManager $bm): void
    {
    }


    public function rows(Row $row): void
    {
    }


    public function render(): void
    {
        $this->template->render(__DIR__ . '/ArrayGridControl.latte');
    }
}

Jak se zdroj vytvoří

return new ArrayDataSource($this->carriers(), 'id');
  • první parametr je cokoli, co jde projít cyklem (pole i generátor); řádek je pole alias => hodnota,
  • aliasy se odvodí z klíčů řádků – u prázdných dat se předají přes setAliases(),
  • chybějící klíč se doplní jako null.

Porovnává se jako v MySQL

Čísla číselně, ostatní jako řetězce bez ohledu na velikost písmen, null nevyhoví žádné podmínce (ani !=) a řadí se první. Proto: vracejte hodnoty ve správném typu – číslo uložené jako řetězec se bude řadit jako text.

Meze

  • do zdroje se načte všechno, i když se zobrazí deset řádků – na desetitisíce záznamů se nehodí,
  • přeuspořádání drag & drop platí jen do konce požadavku (uložit natrvalo = přepsat moveOrdering()), akce mazání a úprav potřebují zapisovatelný zdroj.