Obchod
Otvoriť živú ukážku na adrese /documentation/examples/run/store.
Úvod
Obchod je najkratšia cesta, ako ukázať, že DotApp je full stack. PHP vlastní katalóg a košík. CSS skladá mriežku. dotapp.js hľadá, pridáva riadky a odosiela pokladňu bez reloadu. Id produktov sú šifrované. Stav relácie žije v DSM::use('Examples'), nikdy v $_SESSION.
- Vlastná JS knižnica — toasty po pridaní produktu
- Zabezpečené formuláre — pokladňový
fo-rm - AJAX zoznamy — ten istý overlay +
parseReply - NOVA obchod — Pro príklad: kompletný e-shop, cache katalógu, checkout, desk objednávok
Značky a CSS
Stránka je kompletný HTML dokument v store.view.php. Mriežka a košík sú samostatné view, aby ich AJAX vedel vymeniť. Zdieľaný vzhľad: /assets/modules/Examples/css/examples.css (.ex-products, .ex-product, .ex-cart-panel, .ex-toast-stack).
<div id="storeWrap" class="ex-store"
data-catalog="{{ var: $catalogUrl }}"
data-add="{{ var: $addUrl }}"
data-remove="{{ var: $removeUrl }}">
<div id="gridInner">{{ var: $gridHtml }}</div>
<aside id="cartPanel">
<div id="cartInner">{{ var: $cartHtml }}</div>
<fo-rm method="POST" id="checkoutForm" action="{{ var: $checkoutAction }}">
{{ formName(checkout) }}
<button type="submit" id="checkoutBtn" class="ex-btn">Place demo order</button>
</fo-rm>
</aside>
</div>
Katalóg, košík, DSM
Šifrované sku na každej karte a riadku košíka:
$enc = Crypto::encrypt($item['sku'], 'Examples.product.id');
$sku = Crypto::decrypt((string) ($data['id'] ?? ''), 'Examples.product.id');
if ($sku === false) {
return DotApp::DotApp()->ajaxReply(['status' => 0, 'message' => 'Invalid product.'], 200);
}
Košík v DSM:
$cart = DSM::use('Examples')->get('cart');
if (!is_array($cart)) {
$cart = [];
}
DSM::use('Examples')->set('cart', $cart);
Hľadanie ide cez malý katalóg v pamäti (šesť položiek). Aj tak platí pravidlo zoznamu: debounce, od troch znakov, overlay, záplata #gridInner. Pokladňa je skutočný fo-rm na tej istej URL ako stránka.
Hľadanie, pridanie, pokladňa
$dotapp().live("click", ".js-store-add", function (btn) {
var id = btn.getAttribute("data-item");
$dotapp().load(addUrl, "POST", { id: id }, function (raw) {
var reply = $dotapp().parseReply(raw);
if (reply && reply.html) $dotapp("#cartInner").html(reply.html);
if (reply && reply.message) $dotapp().exNotify({ title: "Cart", text: reply.message });
});
});
$dotapp().live() volá handler ako (element, event). Prvý argument je zhodný uzol, nie prehliadačový event — data-item čítajte z toho tlačidla. Odstránenie potvrdzuje modal. Pokladňa používa $dotapp().form("#checkoutForm") so strážou blocked-form a loadermi. Po úspechu sa HTML košíka nahradí a polia sa vyčistia — žiadne location.reload().
Skript stránky: /app/modules/Examples/assets/js/store.js. Widgety: ex-ui.js.
Živá ukážka
/documentation/examples/run/store — hľadajte „mug“, pridajte položky, dokončite objednávku. Košík prežije obnovenie stránky, lebo je v DSM.