User adatok elmentése, ha nincs bejelentkezve yii2
2018-12-19T13:03:20+01:00
2018-12-19T15:38:14+01:00
2022-08-11T09:00:29+02:00
ikazariel
Sziasztok.

Van egy teszt feladatom, kosár tartalom kezelése, majd mentése. Kosárba kerülhetnek termékek értelemszerűen. És el lehet menteni később. Keretrendszer Yii2.

Api-n keresztül történnek a hívások, backend php, frontend vue.

Érdeklődnék, hogy van -e valami bevált módszer arra, ha nincs az user bejelentkezve, akkor az order-hez user_id-ként mit mentsek, vagy milyen adatot menthetek, ami egyértelműen tudná azonosítani az user-t valahogy? (beloginolva értelemszerűen user_id kerülne)

Vagy mindenképp csak loginolt user kosár tartalmát mentsem, mert amúgy be kéne kérni az összes infót róla (lakcím, stb, majd email kiküldés), ami most alapból nem feladat számomra?

az order táblám így néz ki:
id | user_id | created_at | updated_at

és van hozzá egy order_item tábla, ahová értelemszerűen az items-ek kerülnek, de az most lényegtelen.


upd: felvettem az order-be egy session_id-t is, és abba belementem a Yii::$app->session->getId()-t, user_id meg 0, ha nincs bejelentkezve. Mondjuk innen kérdés, hogy ha időközben bejelentkezik, akkor lehet érdemes lenne update-elni az user_id-t az order-ben. Plusz az rendben, ha lementem a session id-t, de későbbiekben a kérdés, hogy hogy tudom azonosítani, hogy az az user az tényleg az az user, aki nem volt bejelentkezve, és a kosár adatai hozzá tartoznak (pl azért tudom, mert levélben értesítettem az order ID-jával?)
Mutasd a teljes hozzászólást!
Szia!
ez is egy lehetséges megoldás, ami felé elindultál.

ha nincs az user bejelentkezve, akkor az order-hez user_id-ként mit mentsek, vagy milyen adatot menthetek, ami egyértelműen tudná azonosítani az user-t valahogy

Teljes kétséget kizáróan nem fogod tudni azonosítani, de amit írtál, hogy kiegészítetted egy session_id-val a táblát az egy célravezető megoldás lehet. A session_id-t ne keverd a user_id-val, inkább a kódot egészítsd ki. Pl. a user_id NULL lehet amíg nincs bejelentkezve a user, majd ha belépet a session_id alapján update-eled az order táblában a user_id-t és kész is. Bár, ami feltűnt hogy nincs order_id, ami az egyes külön megrendelésekhez tartozó valamennyi item-et összefogná.
Ezen irány esetében el kell gondolkoznod azon is, hogy miként kezeled azokat az eseteket, amikor nem lépnek be userek, csak pakolgatnak a kosárba, de később otthagyják a tartalmat. Az is előfordulhat, hogy miután otthagyta visszatér az oldalra, de nem ugyanazon a gépen, hanem a mondjuk a mobilján és kezdi előröl. Ez külön munkamenet és újra tárolás.. Ezeket a dump adatokat időnként ki kell takarítani a táblából, mivel emiatt hatalmasra nőhet a tárolt adatmennyiséged indokolatlanul. Ezt egy nap cron jobbal meg tudod oldani. 


A másik lehetséges megoldási irány - és szerintem ez az egyszerűbb - , hogy bejelentkezés nélkül nem mentesz semmit db-be, csak session-be tárolod le a megrendelést, majd ha belép a user, akkor mented csak db-be. Itt nem kell modelben, controllerben akkora változtatásokba belemenni, mint az előző irányál. Ennél a feladatnál azt gondolom, hogy ez az egyszerűbb a jobb és nem kell az elején túlbonyolítani, elég kifejezetten a követelményekre lefejleszteni amit kell.

kosár tartalom kezelése, majd mentése. Kosárba kerülhetnek termékek értelemszerűen. És el lehet menteni később. 
...Vagy mindenképp csak loginolt user kosár tartalmát mentsem, mert amúgy be kéne kérni az összes infót róla (lakcím, stb, majd email kiküldés), ami most alapból nem feladat számomra?

A javaslatom:
- kosártartalom kezelése bejelentkezés nélkül sessionben történjen. Bejelentkezést követően db-ben.
- ha a regisztrációhoz előírás a lakcím, számlázási cím stb. akkor is készíthetsz egy feautre-t, amihez csak e-mail címet kérsz be, hogy elmentsd az összeválogatott termékeket. Így könnyebb megszerezni is a potenciális vevőt is. Ha megadta az email címét, akkor az oldalra visszatérve ismét megadva megjelennek a termékei. A regisztráció (email cím) és a rendelés feltételeit (név, cím, számlázás) érdemes lehet külön választani itt.


Sok sikert!
Üdv,
Madi
Mutasd a teljes hozzászólást!

  • Köszönöm a választ.

    Igazából az order tábla közre fogja az order_item-eket, tehát az order_item-ben van az order_id, és az order-ben az id a primary és auto increment.

    order: 
    id - integer (primary | auto_increment)
    user_id - integer
    session_id - string
    created_at - timestamp
    updated_at - timestamp

    order_item:
    id - integer (primary | autoincrement)
    order_id - integer
    item_id - integer
    quantity - integer
    (meg ide is tettem created_at/updated_at mezőket a biztonság kedvéért) ... mondjuk egy status mezőt lefelejtettem, ami mondjuk jelzi hogy aktív az a rendelés, vagy mondjuk törölt :D

    Tehát alapból úgy gondoltam, hogy ha történik egy cart mentés db-be, akkor:

    -bekerül az order-be, user_id/session_id-t kitöltve (meg timestamp)
    -order_item-be pedig minden item, amit a kosárba tett, az előzőleg mentett order id-jával, item_id-val, quantity-vel. (tehát 1:M kapcsolat order-order_item között)

    Lehet hogy akkor már itt elrontottam :)

    Alapból session-ben van a kosár tartalom tárolva, tehát ha bezárja az adott böngészőben az adott tab-ot, és mondjuk újat nyit, akkor a session miatt (most perpill nem tudom meddig, gondolom default érték) újra listázhatom abban a munkamenetben a tartalmat.  

    Tehát ebben az esetben, ha abba hagyja, és mondjuk mobillal folytatná, az új munkamenet lesz, új session_id-vel ha jól gondolom. Viszont a probléma itt jogos, ha mondjuk elmenti mobilon, és visszatér pl laptopon, ahol még él a munkamenet, és ott is menti, akkor duplikált lesz.

    Maradok az általad tanácsolttal, tehát: login után menthetőek az adatok. Nem volt kikötés a feladatnál, hogy nem bejelentkezett kosarat is lehessen menteni.
    Mutasd a teljes hozzászólást!
abcd