LAB10 - nvbach91/4IZ278-2020-2021-LS GitHub Wiki

Cvičení 10 - What one man can invent, another can discover.

Povinná četba (na doma)

Náplň cvičení

Bodovaná samostatná práce

  • Naimplementujte oba typy zamykání updatu produktů nebo kategorií dle popisu níže.
  • Naimplementujte přihlášení pomocí Facebook OAuth. Po přihlášení zobrazte v rámci možností základní údaje o uživateli: jméno, email, profilový obrázek, atd.

Víceuživatelský přístup k modifikaci dat

V případě, že systém spravuje více adminů, je potřeba vyřešit situaci, kdy dva nebo více adminů se snaží souběžně upravovat jeden stejný záznam, aby nedošlo ke ztrátě dat / nechtěnému uložení / přepisování dat. Scenario: Admin A otevře editační stránku pro zboží s ID 99, to samé udělá Admin B. Admin A uloží modifikaci. Co se stane u Admina B? Je to problém? Jak to vyřešit?

Optimistic update lock = kdo uloží jako první, je vítěz

  • zavedeme timestamp (časové razítko) - u každého záznamu budeme evidovat datum a čas poslední změny.
  • vygenerujeme formulář pro editaci záznamu s tímto timestampem - je lepší ho dát do sessionu, protože pak ten timestamp nikdo nemůže měnit.
  • pokud se při odesílání formuláře neshodují timestamp z formuláře (sessionu) a aktuální timestamp vedený u záznamu v databázi, tak to znamená, že záznam byl během toho změněn někým jiným a tím pádem jsme při editaci vycházeli z neaktuálních informací, tj. může se stát, že přepisujeme/zneplatníme práci toho rychlejšího admina
  • to se nesmí stát, v takovém případě, musíme zobrazit nějaké upozornění, aby uživatel o tom věděl.
  • pokud záznam nebyl změněn v té mezidobě, pokračujeme s editací a uložením záznamu s novým aktuálním timestampem do databáze - tím zamezujeme ukládání jiných souběžných editací, které byly inicializovány před uložením naší editace = kdo uloží jako první, je vítěz
  • avšak ostatním musíme vhodně zobrazovat upozornění nebo nabídnout jiné možnosti, nesmí tedy dojít k tomu, že uloží, dostane hlášku a ztratí veškerou svou rozdělanou práci

image

Pessimistic update lock = kdo začne první má dočasnou výhodu, ostatní musí počkat

  • zavedeme 2 kritéria - u každého záznamu evidujeme timestamp začátku editace a id uživatele, který tento záznam právě edituje (otevřel editační stránku).
  • při otevření editační stránky pro konkrétní zboží zamkneme záznam přidáním timestampu a id uživatele
  • nikdo další již tuto editační stránku pro toto zboží nemůže otevřít, dokud je timestamp ještě čerstvý (dejme tomu 5 minut dle časové náročnosti editace) - zde porovnáme timestamp v databázi s aktuálním časem
  • pokud ale ten stejný uživatel editační stránku otevře znova, tak by to mělo projít - zde kontrolujeme zda id uživatele v databázi není shodný s id aktuálního uživatele v sessionu
  • pokud editace pokračuje, při ukládání zrušíme zámek nastavením těch dvou hodnot na NULL

Composer tutorial

<?php 
// automaticke nacteni trid
require __DIR__ . '/vendor/autoload.php';

// nacteni namespace kvuli zkraceni nazvu trid pri pouziti
use Monolog\Logger;
use Monolog\Handler\StreamHandler;

// vytvareni instance
$log = new Logger('index.php');

// nastaveni instance
$log->pushHandler(new StreamHandler('warning.log', Logger::WARNING));

// pouziti instance
$log->warning('warning');

?>

Facebook OAuth návod

image

Nastavení na straně Facebooku + jak získat app_id a app_secret

  • Otevřete https://developers.facebook.com/ a tam si vytvořte novou aplikaci
  • Přidejte funkcionalitu (Product) Facebook login a přejděte do jeho nastavení
  • Do pole Valid OAuth Redirect URIs doplňte redirect URL do vaší aplikace. Musí to být cesta k .php skriptu, kde budete očekávat code v URL, pomocí kterého získáte access_token. Např. https://eso.vse.cz/~nguv03/cv10/facebook/fb-login-callback.php, https://vcap.me/4IZ278-2020-2021-LS/www/nguv03/cv10/facebook/fb-login-callback.php
  • Přejděte do Basic Settings a tam doplňte do pole App Domains název domény, ze které budete tuto aplikaci volat, tedy eso.vse.cz. Pokud budete chtít vyzkoušet na localhostu, doplňte doménu vcap.me.
  • Dále vyberte kategorii, doplňte nějaký odkaz do Privacy Policy URL, a nahrajte ikonu do App Icon a poté zapněte aplikaci pomocí přepínače nahoře
  • Zde zjistěte hodnoty app_id a app_secret

V PHP

  • Vytvořte soubor index.php, kde budete umísťovat tlačítko pro Facebook login
    • Vytvořte Facebook SDK instanci pomocí app_id a app_secret, jako graph verzi uveďte 2.10
    • Vygenerujte odkaz k Facebook loginu pomocí knihovny php-graph-sdk, součástí odkazu je odkaz na fb-login-callback.php, viz níže
  • Vytvořte soubor fb-login-callback.php, kde budete ziskávat a ukládat vrácený access_token do sessionu. Poté přesměrujte uživatele na stránku profilu. Uživatel je přihlášený, je-li Facebook access_token uložený v sessionu.
  • Vytvořte soubor profile.php, kde budete pomocí uloženého access_token volat na Facebook Graph API a zobrazovat vrácené informace v HTML

That's all folks

Domácí úkol z dnešního cvičení není

  • můžete si vypracovat úkoly které jste nestihli minule a odevzdat
  • 1 bod dostanete až po

joke