12. Viditelnost, pořadí a šířky sloupců
Co grid nabídne, rozhoduje columns(). Co z toho uživatel opravdu vidí, v jakém
pořadí a jak široké, si nastaví sám v dialogu Zobrazení → Sloupce – a gridu to
zůstane i příště.
Ukázka
Přetáhněte sloupce mezi viditelnými a skrytými, změňte jejich pořadí, zatáhněte za pravý okraj hlavičky. Přepínačem uživatele nahoře v liště stránky se navíc dvojice sloupců (Cena a Hmotnost) objeví a zmizí – ty se podle práv vůbec nepřidávají.
Zdrojový kód
<?php
declare(strict_types=1);
namespace App\Components\Docs\Columns\ColumnLayoutGridControl;
use App\Enum\ProductCategory;
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 12 – Viditelnost, pořadí a šířky sloupců.
*
* Devět sloupců, ze kterých si uživatel v dialogu „Sloupce“ poskládá své zobrazení. Dva z nich
* se přidají jen přihlášenému (přepínač uživatele je nahoře v liště stránky).
*/
class ColumnLayoutGridControl extends GridControl
{
public function createDataSource(): DataSource
{
return new SQLDataSource(__DIR__ . '/ColumnLayoutGridControl.sql');
}
public function columns(ColumnManager $cm): void
{
$cm->add('name', 'Název');
$cm->add('description', 'Popis');
$cm->addEnum('category', 'Kategorie', ProductCategory::class);
// Sloupec z gridu odebrat nejde – co se nemá zobrazit, se rovnou nepřidá.
if ($this->getPresenter()->getUser()->isLoggedIn()) {
$cm->addNumber('price', 'Cena', 2, 'Kč');
$cm->addNumber('weight', 'Hmotnost', 0, 'g');
}
$cm->addNumber('quantity', 'Skladem', 0);
$cm->addDate('created_at', 'Vytvořeno');
$cm->addDatetime('updated_at', 'Upraveno', true);
}
public function buttons(ButtonManager $bm): void
{
}
public function rows(Row $row): void
{
}
public function render(): void
{
$this->template->render(__DIR__ . '/ColumnLayoutGridControl.latte');
}
}
SELECT
p.id,
p.name,
p.description,
p.category,
p.price / 100 AS price,
p.weight,
p.quantity,
p.created_at,
p.updated_at
FROM `product` p
Sloupec pro někoho – podmínkou při přidání
Sloupec z gridu odebrat nejde: co je jednou v columns() přidané,
tam zůstane. Sadu pro někoho – podle práv, podle pohledu, podle konfigurace – se proto
vypodmínkuje rovnou u přidání:
if ($this->getPresenter()->getUser()->isLoggedIn()) {
$cm->addNumber('price', 'Cena', 2, 'Kč');
$cm->addNumber('weight', 'Hmotnost', 0, 'g');
}
Nepřidaný sloupec v gridu není vůbec: není v datech, v exportu, v nabídce dialogu ani v uloženém nastavení. Skrytí přes dialog je něco jiného – tam sloupec zůstane a uživatel si ho kdykoli vrátí.
Co si uživatel nastaví
| Viditelnost | Přetažením mezi viditelnými a skrytými. Skrytý sloupec dál filtruje a řadí, jen ho uživatel nevidí – uložený filtr tedy po skrytí platí dál. Z globálního hledání ale vypadne (kapitola 20): koukat na řádek a nevědět, čím prošel, je horší než užší hledání. |
| Pořadí | Taháním v dialogu. Promítne se i do exportu – ten si bere rozvržení přes
forLayout(), takže sešit vypadá jako obrazovka. |
| Šířka | Tažením za pravý okraj hlavičky. Dvojklik na tutéž hranu vrátí automatickou šířku. Do exportu se nepropisuje. |
Kde to žije
Všechno tohle je součástí uloženého nastavení gridu – přihlášenému v databázi, ostatním v session (kapitoly 43 a 44). Nastavení se srovnává se sloupci, které grid dnes má: když sloupec zmizí (přejmenovaný alias, nepřidaný podle práv), uložený záznam o něm se zahodí a zbytek rozvržení zůstane.