AJAX-Listen
Live-Demo öffnen unter /documentation/examples/run/lists.
Einleitung
Eine wachsende Tabelle ist ein Backend- und ein Frontend-Problem. PHP paginiert mit paginate(), verschlüsselt Zeilen-IDs und liefert HTML-Fragmente. dotapp.js patcht #listInner nach $dotapp().load(). Umschalten und Löschen sind Buttons, nicht ein <fo-rm> pro Zeile.
- Sichere Formulare — das Speicherformular auf derselben Seite
- Eigene JS-Bibliothek — wiederverwendbare Widgets über demselben
load()
Routen
GET rendert die Seite. POST-Endpunkte liefern ajaxReply-JSON für Liste, Speichern, Löschen und Umschalten:
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-Liste und Pager
Die Suche startet ab drei Zeichen. IDs verlassen PHP als Crypto::encrypt($id, 'Examples.item.id'). Entschlüsseln Sie mit demselben Extra-Schlüssel. Ein Fehlschlag ist === 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);
Das Fragment lists-inner.view.php ist das, was JS in #listInner setzt. Geben Sie es in html neben status und message zurück.
JavaScript
Decken Sie die Liste mit .ex_busy ab, bis load() fertig ist. Patchen Sie ein Kind, nicht den Overlay-Wrapper. Löschen nutzt einen grafischen Dialog — niemals alert() oder 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(); }
);
Das Seitenskript liegt unter /app/modules/Examples/assets/js/lists.js.
Live-Demo
/documentation/examples/run/lists
braucht MySQL in app/config.php. Ohne Datenbank erklärt die Seite, dass die Demo nicht bereit ist.