Nette\Database a DateTime objekt – nesprávný čas
- dibalaj
- Člen | 40
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:
- když si poté v presenteru pomocí
<?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?
- dibalaj
- Člen | 40
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);
}
?>
- ViPEr*CZ*
- Člen | 813
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
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 objektNette\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
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
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! :-)
- dibalaj
- Člen | 40
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
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