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.
- Zabezpečené formuláre — ukladací formulár na tej istej stránke
- Vlastná JS knižnica — znovupoužiteľné widgety nad tým istým
load()
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á.