LAB10 - nvbach91/4IZ278-2020-2021-LS GitHub Wiki
Cvičení 10 - What one man can invent, another can discover.
Povinná četba (na doma)
- https://github.com/4iz278/cviceni/tree/master/08-uzivatele
- https://github.com/4iz278/cviceni/tree/master/09-uzivatele-db
Náplň cvičení
- víceuživatelský přístup k datům - kdy a jak zamykat modifikace záznamů v DB
- composer a načtení knihoven
- Facebook OAuth pomocí PHP Graph SDK
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
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
- Instalace
- Vytvořte složku a otevřete ji v příkazovém řádku
- Zadejte
composer init
a vyplňte údaje pro projekt - Prohlídněte obsah souboru
composer.json
- Najděte n2jakou knihovnu např.
monolog
na portálu https://packagist.org/ a načtěte ji do projektu pomocí příkazucomposer require monolog/monolog
- Prohlídněte obsah souboru
composer.json
- Načtěte knihovnu monolog do php stránky použijte ji následovně
<?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
app_id
a app_secret
Nastavení na straně Facebooku + jak získat - 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ávatcode
v URL, pomocí kterého získáteaccess_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 poleApp Domains
název domény, ze které budete tuto aplikaci volat, tedyeso.vse.cz
. Pokud budete chtít vyzkoušet na localhostu, doplňte doménuvcap.me
. - Dále vyberte kategorii, doplňte nějaký odkaz do
Privacy Policy URL
, a nahrajte ikonu doApp Icon
a poté zapněte aplikaci pomocí přepínače nahoře - Zde zjistěte hodnoty
app_id
aapp_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
aapp_secret
, jako graph verzi uveďte2.10
- Vygenerujte odkaz k Facebook loginu pomocí knihovny
php-graph-sdk
, součástí odkazu je odkaz nafb-login-callback.php
, viz níže
- Vytvořte Facebook SDK instanci pomocí
- 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 Facebookaccess_token
uložený v sessionu. - Vytvořte soubor
profile.php
, kde budete pomocí uloženéhoaccess_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
- nahrání programu na GitHub přes PullRequest včetně odkazu https://eso.vse.cz/~xname/cvxx/
- jeho schválení viz návod