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

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