Prejsť na obsah

Reaktivita

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

Úvod

Živá ukážka je cenová ponuka: produkt, množstvo, destinácia a voliteľný kupón. Jadro dotapp.js už má variable, databind a computed. Riadok položky sa aktualizuje v prehliadači. DPH, doprava, sklad a pravidlá kupónu ostávajú v PHP a vracajú sa cez to isté bezpečné $dotapp().load() ako pri zoznamoch a formulároch.

To je celá slučka: katalóg a sadzby na serveri, ajaxReply na drôte, premenné v prehliadači. Prázdne pruhy #error-message / #status ostávajú skryté, kým PHP naozaj nemá chybu alebo info riadok.

variable, databind, computed

$dotapp().variable("qty", "1");
$dotapp().variable("name", "Workshop seat");
$dotapp().variable("unit", "49.00");
$dotapp().variable("total", "0.00");

var qty = $dotapp().getVariable("qty");
var total = $dotapp().getVariable("total");
total.bindToElement(document.getElementById("bindTotal"));

var line = $dotapp().computed(function () {
  var q = $dotapp().getVariable("qty").value;
  var n = $dotapp().getVariable("name").value;
  var u = $dotapp().getVariable("unit").value;
  return q + " × " + n + " @ €" + u;
});

qty.onChange(function () {
  line.invalidate();
  document.getElementById("bindLine").textContent = line.value;
});

// after parseReply:
total.value = String(reply.total);

Priradenie .value na singleton premennej aktualizuje každý prvok naviazaný cez bindToElement / databind na tej istej inštancii $dotapp(). Premenné sa nezdieľajú medzi klonmi $dotapp('#x'). Naviažte cez $dotapp().getVariable('total').bindToElement(el).

Pole kupónu používa obojsmernú väzbu s { live: true }, takže písanie aktualizuje premennú na input a nasleduje debounceované load().

Cenová ponuka z PHP

POST s CRC. Počas požiadavky zakryte ponuku. Payload zapíšte do premenných — celú kartu nemeňte, kým nepotrebujete fragment.

$dotapp().load(quoteUrl, "POST", { id: encId, qty: qty, country: country, coupon: coupon },
  function (raw) {
    var reply = $dotapp().parseReply(raw);
    total.value = String(reply.total);
    stock.value = String(reply.stock);
    if (reply.error) $dotapp("#error-message").attr("hide", "false").html(reply.error);
    else if (reply.message) $dotapp("#status").attr("hide", "false").html(reply.message);
    else {
      $dotapp("#error-message").attr("hide", "hide").html("");
      $dotapp("#status").attr("hide", "hide").html("");
    }
  }
);

PHP dešifruje id produktu, uplatní DPH podľa krajiny, dopravu (zadarmo nad 80 € pri fyzickom tovare), sklad a kupón DOTAPP10. DSM počíta, koľkokrát táto relácia naozaj vyžiadala ponuku:

$sku = Crypto::decrypt($id, 'Examples.live.id');
$dsm = DSM::use('Examples');
$hits = (int) ($dsm->get('live_quotes') ?? 0);
$hits++;
$dsm->set('live_quotes', $hits);
return DotApp::DotApp()->ajaxReply([
    'status' => 1,
    'total' => $total,
    'stock' => $stock,
    'error' => $error,
    'message' => $message,
    'hits' => $hits,
], 200);

Vypredané a zlý kupón idú do červeného pruhu. Platný kupón alebo doprava zadarmo idú do modrého. Oba ostávajú hide="hide", kým sa to nestane.

Oficiálny reactive doplnok

Voliteľný dotapp.reactive.js pridáva HTML atribúty (reactive-api, reactive-interval, reactive-trigger, reactive-variable, reactive-template) a $dotapp().reactive(url, config). Načítajte ho po dotapp.js, keď vaša inštalácia servíruje /assets/dotapp/dotapp.reactive.js. Živá ukážka na tomto webe používa jadrové API, aby vždy bežala: už sú vnútri dotapp.js.

<div reactive-api="/shop/live" reactive-method="GET"
     reactive-interval="5000" reactive-variable="stock"></div>

Živá ukážka

/documentation/examples/run/live — živá ponuka, naviazané súčty, computed riadok, správy ku kupónu a skladu. Súbory: Controllers/Live.php, live.view.php, live.js.