Nette\Database a DateTime objekt – nesprávný čas

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
dibalaj
Člen | 40
+
0
-

Zdravím,

popíši svou situaci:

  • do tabulky uživatelů v DB jsem si přidal sloupec last_login, typu: DATETIME
  • v Authenticatoru se do tohoto sloupce ukládá objekt new \DateTime
  • v databázi je tedy čas posledního přihlášení v pořádku, ale:
    • když si poté v presenteru pomocí $this->getUser()->getIdentity()->last_login tahám to datum,

      vrací mi to objekt Nette\DateTime:

<?php
last_login => Nette\DateTime(3) {
  date => "2012-08-02 11:32:10" (19)
  timezone_type => 3
  timezone => "Europe/Prague" (13)
}
?>
  • problém je v tom, že se například přihlásím v 10:20:00
  • poté se odhlásím a znovu přihlásím například v 10:25:00
  • V objektu Nette\DateTime po druhém přihlášení (v 10:25:00) vidím čas 10:20:00 (tedy vždy ten předchozí),

    přitom v databázi je čas správný

Necachuje si Nette nějak tu Identitu, nic jiného mě opravdu nenapadá :-/

Co vy na to?

ViPEr*CZ*
Člen | 813
+
0
-

Použijte logout s parametrem TRUE, to vymaže identitu. Ale postněte sem jak vytváříte Identitu ještě.

dibalaj
Člen | 40
+
0
-

Díky za odpověď.
Smazání identity bohužel nepomohlo. (metodu logout v SignPresenter volám s parametrem TRUE)

Identitu vytvářím takto:

<?php
public function login($id = NULL, $password = NULL)
{
  $this->logout(TRUE);
  if (!$id instanceof IIdentity) {
    $credentials = func_get_args();
    $id = $this->getAuthenticator()->authenticate($credentials);
  }
  $this->storage->setIdentity($id);
  $this->storage->setAuthenticated(TRUE);
  $this->onLoggedIn($this);
}
?>
dibalaj
Člen | 40
+
0
-

Ještě dodám, že této metodě login() předávám parametry $username a $password, nepředávám IIdentity.
Není to tedy tím?

Pokud ano, kde (jak) Identitu vytvořím (v SignPresenteru), abych ji mohl předat?

ViPEr*CZ*
Člen | 813
+
0
-

No spíš by mě zajímalo kde si plníte toto property last_login. Taky příliš nechápu tu metodu login. Mrkněte na dokumentaci: https://doc.nette.org/…thentication

dibalaj
Člen | 40
+
0
-

Pardon,

ve třídě Authenticator jsem si přidal do metody authenticate toto:

<?php
// uložíme si datum a čas přihlášení
$this->users->update(array(
  'last_login'  =>  new Nette\DateTime(),
));
?>
  • $this->users je objekt Nette\Database\Table\Selection pro tabulku uživatelů
  • ta metoda login je ve třídě User (Nette\Security\User)

Ono to datum se uloží do databáze správně, jen nechápu, že po každém odhlášení a přihlášení se do objektu Identity po přihlášení uloží předchozí Identita (tam je to starší datum)

ViPEr*CZ*
Člen | 813
+
0
-

Vy jste si přepsal Nette??? Jestli jo, tak omg. :-)
Dál … pokud todle máte v Presenteru

  • $this->users je objekt Nette\Database\Table\Selection pro tabulku uživatelů

Tak to je hovadina, protože v Presenteru už hodnota users existuje a je to instance Nette\Security\User
A poslal jste kod, kde si ukládáte last_login do databáze… ale ne ten kus kodu, kde si to plníte z databáze?
Ale jestli přepisujete samotné Nette, tak to je špatně. Mrkněte na ten odkaz co jsem posílal. Identita žádná data nenese o posledním přihlášení pokud se nepletu. Využijte její property data a ukládejte si hodnotu last_login do této property.

dibalaj
Člen | 40
+
0
-

Neřekl bych, že jsem si přepsal Nette.

Přišlo mi jako hovadina dělat si vlastní autentikátor, když jediné co potřebuji navíc je uložit si poslední datum přihlášení do databáze.

Problém jsem již vyřešil, byla to moje blbost :-)
Při ověřování, zda takový uživatel existuje, se tahala data z DB (tudíž i last_login).
Já jsem ovšem vracel identitě ta data, která existovala ještě před updatem sloupce last_login.

Každopádně díky za pomoc a tvůj čas! :-)

ViPEr*CZ*
Člen | 813
+
0
-

No podle toho co jste psal to vypadá, že jste si přepsal metodu login v souboru Nette\Security\User.php což by nebylo správně. Jinak není za co ;-)

dibalaj
Člen | 40
+
0
-

ViPErCZ napsal(a):

No podle toho co jste psal to vypadá, že jste si přepsal metodu login v souboru Nette\Security\User.php což by nebylo správně. Jinak není za co ;-)

Připsal jsem si pouze update query do metody authenticate ve třídě Authenticator. Nechtěl jsem si kvůli tomu psát vlastní.
A prosím, tykej mi, není mi 50 (jestli ti to nevadí) :-)

ViPEr*CZ*
Člen | 813
+
0
-

Myslíš SimpleAuthenticator?
Okej neva ;-)

dibalaj
Člen | 40
+
0
-

ViPErCZ napsal(a):

Myslíš SimpleAuthenticator?
Okej neva ;-)

Nene :-) myslím /app/models/Authenticator , byl tam už takhle připravenej :)

ViPEr*CZ*
Člen | 813
+
0
-

Jo taaak… tak to je dobře… tam je použitá dědičnost. A to asi myslíš ze sandbaxu. Pak stejně nechápu kde jsi vzal ten kod login co jsi tu přilepil?
Protože v Authenticatoru tam máš tento řádek:

return new NS\Identity($row->id, $row->role, $row->toArray());

a na ten jsem se tě ptal… tade se vytváří Identita a jako třetí parametr se tam právě vytváří ony data (plní se property třídy Identity). Pak už jen přistupuješ:

$this->getUser()->getIdentity()->data->last_login