Čá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.