Po redirect se nezobrazí flashMessage

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

Ahoj,
v šabloně @layout.latte zobrazuji počet příspěvků. Abych tuto hodnotu nemusel posílat šabloně v každém presenteru, udělal jsem si v BasePresenteru metodu injectCount ve které je následující:

public function injectCount()
    {
        $this->template->count = '51';
    }

Problém je, že v tu chvíli se přestanou zobrazovat FlashMessage po redirectu. Jakmile v metodě inject zakomentuji předání hodnoty do template , nebo dám pryč redirect , vše funguje jak má.

Poraďte mi prosím, jak mám předávat do šablony počet příspěvků tak aby FlashMessage fungoval a nemusel jsem to vkládat v každém presenteru zvlášť.

Díky za radu.

kejlicz
Člen | 201
+
+1
-

Tak to zkus přidat třeba v BasePresenteru v metodě beforeRender().

CZechBoY
Člen | 3608
+
0
-

Zajímavý chování… nicméně k tomuhle inject* metody vůbec neslouží :D Slouží k předání závislostí/služeb do abstraktního předka (Base* třídy)
Použij metodu beforeRender jak psal @kejlicz

andros
Člen | 145
+
0
-

Díky za radu. Už to vypadá líp. Jak mám ale v metodě beforeRender načíst z data z nějaké modelové třídy ?

Metoda inject vypadala nějak takto:

public function injectMetoda(msgModel $msgModel)
    {

        $this->msgModel= $msgModel;
        $this->template->msg = $this->msgModel->getMsg();

    }

metodu beforeRender ale nemůžu volat s parametry

Editoval andros (17. 1. 2017 21:38)

CZechBoY
Člen | 3608
+
0
-

Inject metodu použij, ale tu práci s template přesuň do render metody (třeba ta beforeRender), kde se s template má pracovat.

Editoval CZechBoY (17. 1. 2017 21:38)

andros
Člen | 145
+
0
-

No právě že se jedná o template @layout.latte , kde je hlavička celé aplikace, ve které potřebuju ty informace zobrazit. Pokud bych to dal render metody nějakého presenteru, musel bych to dávat do všech presenterů. Nebo ne ?

CZechBoY
Člen | 3608
+
0
-

jj, použij tu metodu beforeRender.
Pokud beforeRender metodu přepíšeš v některém z dědících presenterů tak nezapomeň zavolat parent::beforeRender();

Editoval CZechBoY (17. 1. 2017 21:43)

andros
Člen | 145
+
0
-

Teď už jsem mimo úplně :)
V basePresenteru mám metodu inject ve které získám nějaká data z modelu. Jak ta získaná data dostanu do metody beforeRender, abych je tam nacpal to templates ?

kejlicz
Člen | 201
+
0
-

Pošli sem raději kód BasePresenteru.

Editoval kejlicz (17. 1. 2017 21:53)

andros
Člen | 145
+
+1
-

Už mi to došlo :) Dneska mi to myslí trošku pomaleji :) výsledek metody inject uložím do nějaké proměnné kterou zavolám v beforeRender() :)

kejlicz
Člen | 201
+
+1
-

Tou metodou inject dostaneš do BasPresenteru ten msgModel. S tím pak můžeš kdekoliv pracovat

$this->msgModel->metoda()

V té inject metodě získáváš jen službu. Samotná data z té služby už taháš jinde, kde je potřeba. Třeba v tom beforeRender()

public function beforeRender()
{
	 $this->template->msg = $this->msgModel->getMsg();
}
andros
Člen | 145
+
0
-

Díky za radu, to je přesně co jsem potřeboval :) Pletlo mě, že mi IDE řvalo, když volám v befreRender() $this->msgModel->getMsg() – IDE mi getMsg k výběru nenabídne. Ale funguje :)

CZechBoY
Člen | 3608
+
0
-

To je divny. Co pouzivas za ide?

andros
Člen | 145
+
0
-

používám PHPStorm

JZechy
Člen | 161
+
0
-

@andros A máš u toho atributu nějaký type hinting/PHPDoc? Zase IDE není všemocné, když mu neřekneš, co je proměnná/atribut za typ.

andros
Člen | 145
+
0
-

Mám to takhle:

Model:

namespace App\Model;

use Nette;

abstract class Manager  {

    use Nette\SmartObject;

    /** @var Nette\Database\Context */
    protected $connection;

    public function __construct(Nette\Database\Context $db) {
        $this->connection = $db;
    }
}
namespace App\Model;


class BasketManager extends Manager
{
    public function getBasketGuest($id)
    {

        return $this->connection->table('basket')
            ->where('guest_id', $id);

    }

}

basePresenter:

namespace FrontModule;

use App\Model\BasketManager;
use \Nette\Application\UI\Presenter;
/**
 * Base presenter for all application presenters.
 */
abstract class BasePresenter extends Presenter
{
    private $basketManager;
    private $guest;
    private $basket;
    private $basketCount;

    public function injectGuestCookies(BasketManager $basketManager)
    {
        $this->basketManager = $basketManager;
    }


    public function beforeRender()
    {
        $httpRequest = $this->context->getByType('Nette\Http\Request');
        $httpResponse = $this->context->getByType('Nette\Http\Response');

        if ($httpRequest->getCookie('guest')) {
            // Cookies košíku existuje
            $this->guest = $httpRequest->getCookie('guest');
        }

        else {
            // Cookies košíku neexistuje, nastavíme
            $this->guest = $httpResponse->setCookie('guest', uniqid(),'7 days');

        }

        $rows = $this->basketManager->getBasketGuest($this->guest);
        $this->basket = $rows;
        $this->template->basketCount = count($rows);
    }
}
JZechy
Člen | 161
+
+1
-

@andros Když k těm privatům doplníš PHPDoc, např:

abstract class BasePresenter extends Presenter
{
	/**
	 * @var BasketManager
	 */
    private $basketManager;

// ...

Tak IDE bude v tu chvíli vědět, co je ten atribut za typ a je schopen ti napovídat public metody i atributy, který ten objekt v proměnné nabízí.

Jestli to máš takhle čistě, tak jak říkám, IDE nemá křišťálovou kouli a ze setterů nebo inject metod není schopno doplnit typ atributu.

Editoval JZechy (17. 1. 2017 22:55)

andros
Člen | 145
+
0
-

Funguje to :) Díky moc :) Vůbec jsem netušil, že tohle pomůže. Sice nechápu jak to funguje, ale funguje

CZechBoY
Člen | 3608
+
0
-

Funguje to tak, ze reknes idecku/programatorovi, ze v ty promenny/property ocekavas typ XXX.
Takovehle komentare muzes psat i u metod – urcis jakyho typu maj byt parametry a jakej typ metoda vraci.
Pokud nevadi anglictina tak vic info tady https://github.com/…ed/phpdoc.md

CZechBoY
Člen | 3608
+
0
-

Jeste doplnim, ze httpRequest a httpResponse jsou dostupne v presenteru pres gettery

$this->getHttpRequest();
$this->getHttpResponse();
andros
Člen | 145
+
0
-

@CZechBoY děkuju moc za doplnění, zase jsem o něco chytřejší. Tohle je přesně jedna z věcí, na které jsem v manuálu nenarazil.

CZechBoY
Člen | 3608
+
0
-

O jakym manualu ted mluvis? V Nette manualu bys na anotace narazil akorat u generovane tovarnicky. V php manualu urcite anotace nemaji ani smysl.
A presto anotace vsichni pouzivaji…

andros
Člen | 145
+
0
-

Protože s Nette teprve začínám , neustále procházím dokumentaci (https://doc.nette.org/cs/) a snažím se zjistit co všechno umí. Takže co nenajdu v dokumentaci, tak nevím. Pokud na to náhodou nenarazím na fóru. Třeba že existují gettery

$this->getHttpRequest();
$this->getHttpResponse();

v dokumentaci nenajdeš.

Editoval andros (18. 1. 2017 12:29)

David Matějka
Moderator | 6445
+
0
-

@andros mrkni i na generovanou api dokumentaci, konkretne presenter

andros
Člen | 145
+
0
-

Tak v tomhle jsem se ztratil už úplně :)

CZechBoY
Člen | 3608
+
0
-

jj, pro nováčky je api peklo :-)
V presenteru je hodně věcí dostupných – request, response, session, user, template aj. Ostatní si musíš předat přes konstruktor/inject.

Jinak pár taháků:
https://ondrej.mirtes.cz/…tsheet-tahak
https://phpfashion.com/…-presenterum
http://nette.matej21.cz/cs/di

andros
Člen | 145
+
0
-

tak to máš pravdu :) peklo to teda je :) za ty odkazy děkuju