Prejsť na obsah

AJAX zoznamy

Otvoriť živú ukážku na adrese /documentation/examples/run/lists.

Úvod

Rastúca tabuľka je problém backendu aj frontendu. PHP stránkuje cez paginate(), šifruje id riadkov a vracia HTML fragmenty. dotapp.js po $dotapp().load() záplatuje #listInner. Prepnutie a zmazanie sú tlačidlá, nie jeden <fo-rm> na riadok.

Trasy

GET vykreslí stránku. POST endpointy vracajú ajaxReply JSON pre zoznam, uloženie, zmazanie a prepnutie:

Router::get($pair($p . '/lists'), 'Examples:Lists@page!', Router::STATIC_ROUTE);
Router::post($pair($p . '/lists/list'), 'Examples:Lists@list!', Router::STATIC_ROUTE);
Router::post($pair($p . '/lists/save'), 'Examples:Lists@save!', Router::STATIC_ROUTE);
Router::post($pair($p . '/lists/delete'), 'Examples:Lists@delete!', Router::STATIC_ROUTE);
Router::post($pair($p . '/lists/toggle'), 'Examples:Lists@toggle!', Router::STATIC_ROUTE);

PHP zoznam a stránkovanie

Hľadanie beží od troch znakov. Id opúšťajú PHP ako Crypto::encrypt($id, 'Examples.item.id'). Dešifrujte tým istým extra kľúčom. Zlyhanie je === false.

$result = DB::module('RAW')->q(function ($qb) use ($q, $useSearch) {
    $qb->select(['id', 'title', 'active', 'created_at'])->from('examples_items')->orderBy('id', 'DESC');
    if ($useSearch) {
        $esc = str_replace(['\\', '%', '_'], ['\\\\', '\%', '\_'], $q);
        $qb->where('title', 'LIKE', '%' . $esc . '%');
    }
})->paginate(10, $page);

Fragment lists-inner.view.php je to, čo JS vloží do #listInner. Vráťte ho v html vedľa status a message.

JavaScript

Zakryte zoznam triedou .ex_busy, kým load() neskončí. Záplatujte dieťa, nie wrapper s overlay. Zmazanie používa grafický dialóg — nikdy alert() ani window.confirm().

$dotapp().load(listUrl, "POST", { page: page, q: q },
  function (raw) {
    var reply = $dotapp().parseReply(raw);
    if (reply && reply.html) $dotapp("#listInner").html(reply.html);
    listDone();
  },
  function () { listDone(); }
);

Skript stránky je v /app/modules/Examples/assets/js/lists.js.

Živá ukážka

/documentation/examples/run/lists potrebuje MySQL v app/config.php. Bez databázy stránka oznámi, že ukážka nie je pripravená.