Premium vypnutie reklamy, automaticky nezapne

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

Ahojte potrebujem poradiť mám na webe premium systém a v nom možnosť pre premium užívatela vypnúť reklamu na webe na to mám použitý tento kód:

**{if !($user->isLoggedIn() && isset($user->identity->data['disable_advertising']) && $user->identity->data['disable_advertising'] )}**
  <div class="partners clearfix">
    <a href="nazovwebu" target="_blank">
        <img src="{$basePath}/images/partners/LOL.png" alt="LOL" class="partner-frakie">
    </a>
   </div>
**{/if}**

Všetko ide reklamu vypína aj zapína lebo potrebujem vedieť ako upraviť ten kód, keď niekomu premium vyprší aby mu automaticky tú reklamu hodilo na web, lebo po vypršaný ju má stále vypnutú.Prvý riadok je to vypínanie a zapínanie funkcie.Ďakujem pekne za rady.

Editoval x5 (11. 12. 2015 1:25)

Jiří Nápravník
Člen | 710
+
0
-

Problém bude v tom, že uživatel je stále přihlášený a data jsou v identitě stará.

Či-li refreshovat tu identitu v User při každém načtení.

A nebo to netahat z identity, ale mít to v nějaké proměnné, která se bude obnovovat z dtb.

x5
Člen | 28
+
0
-

Jiří Nápravník napsal(a):

Problém bude v tom, že uživatel je stále přihlášený a data jsou v identitě stará.

Či-li refreshovat tu identitu v User při každém načtení.

A nebo to netahat z identity, ale mít to v nějaké proměnné, která se bude obnovovat z dtb.

A prosím ťa to ako urobím, nejaké upravenie toho mojho kódu čo som postol vyššie?

Jiří Nápravník
Člen | 710
+
0
-

Nejjednodussi bude:

V presenteru něco takoveho

protected function beforeRender(){
	parent::beforeRender();
	$this->template->disableAdvertising = /*tady si vytahnes informaci z databaze*/;
}

v sablone pak:

{if !($user->isLoggedIn() && $disableAdvertising)}
iNviNho
Člen | 352
+
0
-

Ja som si extendol triedu Nette/Security/User a pri kazdom nacitani sa zavola metoda SetFreshData a v nej si vzdy aktualizujem data :)

Zuben45
Člen | 268
+
-1
-

Já to kdysi řešil úplně primitivně.

Příklad:

  • Po odeslání formuláře:
	$user->getIdentity()->avatar = $values->avatar;

přepíše se to prozatím než se uživatel odhlásí, a jak se přihlásí, tak se načte již z db.

EDIT:

$user = $this->getUser();

Editoval Zuben45 (11. 12. 2015 10:28)

iNviNho
Člen | 352
+
-1
-

To nie je vždy dobrý príklad ako to robiť.

Dajme tomu, že dáš niekomu rolu administrátora, on sa prihlási, nastaví sa mu rola a tú rolu tam bude mať až kým sa neodhlási…

Čo ak už nechcem aby bol admin a chcem mu zrušiť práva? Dá sa to samozrejme kadejako vyriešiť, ale najlepšie bude ak sa to vždy bude ťahať výhradne z DB, čo znamená, že všetky jeho dáta budú vždy reprezentovať skutočnú aktuálnu realitu.

Zuben45 napsal(a):

Já to kdysi řešil úplně primitivně.

Příklad:

  • Po odeslání formuláře:
	$user->getIdentity()->avatar = $values->avatar;

přepíše se to prozatím než se uživatel odhlásí, a jak se přihlásí, tak se načte již z db.

EDIT:

$user = $this->getUser();
iNviNho
Člen | 352
+
0
-
<?php
class User extends \Nette\Security\User {

    /**
	* ... construct atd...
	*/

    /**
     * Returns user entity
     * @return \App\Entities\User
     */
    public function getEntity() {
		return $this->userService->getOneById($this->getId());
    }

}
?>

Vždy po siahnutí na $user->getEntity() mám určite najaktuálnejšie informácie

Zuben45
Člen | 268
+
0
-

iNviNho napsal(a):

To nie je vždy dobrý príklad ako to robiť.

Dajme tomu, že dáš niekomu rolu administrátora, on sa prihlási, nastaví sa mu rola a tú rolu tam bude mať až kým sa neodhlási…

Čo ak už nechcem aby bol admin a chcem mu zrušiť práva? Dá sa to samozrejme kadejako vyriešiť, ale najlepšie bude ak sa to vždy bude ťahať výhradne z DB, čo znamená, že všetky jeho dáta budú vždy reprezentovať skutočnú aktuálnu realitu.

Zuben45 napsal(a):

Já to kdysi řešil úplně primitivně.

Příklad:

  • Po odeslání formuláře:
	$user->getIdentity()->avatar = $values->avatar;

přepíše se to prozatím než se uživatel odhlásí, a jak se přihlásí, tak se načte již z db.

EDIT:

$user = $this->getUser();

Však chtěl aby se to okamžitě projevilo ne ?, jinak je jasné že ještě zapíši data do db… ;)

Jan Endel
Člen | 1016
+
+2
-

Tohle řešení ale každý request na stránku zatíží dotazem do databáze navíc, který potenciálně není potřeba, což takhle mít něco takového:

class User
{
	private $premiumTo;


	public function isAdvertisementEnabled()
	{
		$now = new \DateTime();
		return $this->premiumTo === NULL || $this->premiumTo >= $now;
	}
}
David Matějka
Moderator | 6445
+
0
-

@JanEndel a to premiumTo se tam vezme odkud? :)

Jan Endel
Člen | 1016
+
0
-

to je v db, po přihlášení se to prdne do identity a pak se už dál nemusíš dotazovat :-).

David Matějka
Moderator | 6445
+
0
-

@JanEndel ale to je prave ten problem, ktery tu resime – ze po aktualizaci db nedojde k aktualizaci dat v identite :)

Jan Endel
Člen | 1016
+
0
-

tim prave k aktualizaci db nedojde, vy ukladate bool flagu, ja ukladam od kdy to nemam ukazovat :-).

Jan Endel
Člen | 1016
+
+1
-

Resp, mam premium do 12:00, 11:50 refreshnu stranku, reklamy nevidim, 12:10 refreshnu stranku reklamy vidim, bez jedineho dotazu do db, protoze mam v identite jen casovou znamku.

David Matějka
Moderator | 6445
+
0
-

@JanEndel to je jedno, jestli je to bool nebo datetime. kdyz ti admin tu casovou znamku upravi v db, tak to nebude fungovat

Jan Endel
Člen | 1016
+
+1
-

to ano, ale zrovna u tohohle mi nepřijde jako moc reálný scénář, to spíše nová platba za premium nebo tak něco a pak samozřejmě identitu refreshnout.