Problém s voláním presenteru u podmenu
- Joacim
- Člen | 229
Zdravím, používám nastavení
<presenter>/<action>[/<id>]
a mám html menu
Test1 (Test1Presenter)
Test2 (Test2Presenter)
Test3 (Test3Presenter)
Nastavení (SetupPresenter) – funguje
Nastavení → Users (UsersPresenter) – nefunguje (Jsem stále
SetupPresenter)
Nastavení → Workflow (WFPresenter) – nefunguje (Jsem stále
SetupPresenter)
class SetupPresenter extends BasePresenter {
public function renderDefault() {
$this->redirect("Users:users");
}
}
class UsersPresenter extends \App\Presenters\BasePresenter {
/** @var Nette\Database\Context */
private $database;
public function __construct(Nette\Database\Context $database)
{
$this->database = $database;
}
public function renderDefault() {
$this->template->all_users = $this->database->table('user')->select('*')->order('id')->fetchAll();
}
}
Vždy mě vypíše laděnka
Undefined variable: all_users
a view pro Nastavení/Users
{layout '../@layout.latte'}
{block content}
<div class="row">
<div class="col-sm-12">
<ul>
{foreach $all_users as $user}
<li>{$user->email}</li>
{/foreach}
</ul>
</div>
</div>
{/block}
{block scripts}
{include parent}
{/block}
{block head}
{/block}
Je to asi banalita, ale nevím jak to zprovoznit
Zkoušel jsem v prezenteru Nastavení(Setup) vrátit all_users a oddělat redirect, ale ve view nikdy nevidí netbeans proměnou all_users
Možná jsem zapoměl něco v config.neon ?
Editoval Joacim (25. 3. 2015 11:32)
- TOMeek
- Člen | 64
Jestli to dobře chápu, tak si myslím, že vůbec nezáleží jestli to
voláš z menu nebo podmenu, když stále voláš jen Presenter.
Podle toho jak píšeš, tak bys měl odkazovat na UsersPresenter
nějak takto:
<a n:href="Users:default">...</a>
nebo
<a href="{link Users:default}">...</a>
Pak bys měl mít v app/presenters/templates (pokud vycházíš ze sandboxu
2.3) složku Users a tam default.latte (nebo Users.default.latte), kde máš
tvůj kód s foreach s proměnou $all_users
(a nemusí tam být
ani {layout '../@layout.latte'}
). Nikde v config.neon by se nic
nastavovat nemělo (krom připojení k DB).
Editoval TOMeek (25. 3. 2015 11:30)
- Joacim
- Člen | 229
Omlouvám se že jsem nepřidal základní šablonu, kde mám i menu
<ul class="nav navbar-nav">
<li {ifCurrent Dashboard:} class="active" {/ifCurrent}><a href="{$basePath}/">Dashboard</a></li>
<li {ifCurrent Reservations:} class="active" {/ifCurrent}><a href="{$basePath}/reservations">Rezervace</a></li>
<li {ifCurrent Approval:} class="active" {/ifCurrent}><a href="{$basePath}/approval">Schvalování</a></li>
<li {ifCurrent Setup:*} class="active" {/ifCurrent} class="dropdown" >
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">Nastavení <span class="caret"></span></a>
<ul class="dropdown-menu" role="menu">
<li><a href="{$basePath}/setup/users">Uživatelé</a></li>
<li><a href="{$basePath}/setup/teams">Teamy</a></li>
<li><a href="{$basePath}/setup/departments">Oddělení</a></li>
<li class="divider"></li>
<li><a href="{$basePath}/setup/workflow">Schvalovací workflow</a></li>
</ul>
</li>
</ul>
Zajímalo by mě jestli mohu mít odkazy i takto
{$basePath}/setup/users
i když je pravda že samotná položka v menu „Nastavení“ slouží pouze pro zobrazení skritého podmenu
Navíc mám ve view adresářovou strukturu pro podmenu:
templates/Setup/users.latte
templates/Setup/workflow.latte
Editoval Joacim (25. 3. 2015 11:43)
- TOMeek
- Člen | 64
S odkazy opravdu nevím, ale nikde jsem neviděl, že by je někdo
vytvářel takto. Hlavně když se to vytvoří jak jsem psal buď
n:href="..."
nebo {link ...}
, tak pomocí rout
pohodlně změníš tvar URL, což teď nejde. Takže asi to funguje, ale
rozhodně to nedoporučuji.
K samotnému problému. Menu by asi mělo být takto
<ul class="nav navbar-nav">
<li {ifCurrent Dashboard:}class="active"{/ifCurrent}><a n:href="Dashboard:">Dashboard</a></li>
<li {ifCurrent Reservations:} class="active"{/ifCurrent}><a n:href="Reservations:">Rezervace</a></li>
<li {ifCurrent Approval:}class="active"{/ifCurrent}><a n:href="Approval:">Schvalování</a></li>
<li {ifCurrent Setup:*}class="active"{/ifCurrent} class="dropdown" >
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">Nastavení <span class="caret"></span></a>
<ul class="dropdown-menu" role="menu">
<li><a n:href="Setup:users">Uživatelé</a></li>
<li><a n:href="Setup:teams">Teamy</a></li>
<li><a n:href="Setup:departments">Oddělení</a></li>
<li class="divider"></li>
<li><a n:href="Setup:workflow">Schvalovací workflow</a></li>
</ul>
</li>
</ul>
Pak ale nebude UsersPresenter, ale v SetupPresenter bude
public function renderUsers() {
$this->template->all_users = $this->database->table('user')->select('*')->order('id')->fetchAll();
}
V templates/Setup/users.latte pak bude kód ze tvého prvního příspěvku
(stále platí, že tam není potřeba
{layout '../@layout.latte'}
).
Editoval TOMeek (25. 3. 2015 11:58)
- Joacim
- Člen | 229
Paráda, už to dělá co má, děkuji mnohokrát mistře.
Takže v url mám presenter:template (Setup:users) a v prezenteru volám render(template) (renderUsers) ? Pokud jsem to pochopil dobře.
Když jsem si v template změnil
<a n:href="Setup:users">...</a>
na
<a n:href="Users:users">...</a>
Třída UsersPresenter nenalezena + path kde to hledalo – (přitom ta třída tam je)
- akadlec
- Člen | 1326
Nevytvářej pevné odkazy ale používej routování. Zbytečně by ses pak v té aplikaci zahrabal pokud bys chtěl něco změnit. Pokud potřebuješ dělat nějak strom v menu abys měl odkazy typu:
rodic/potomek/potomek/akce
Tak si na tohle musíš napsat routy, ty základní ti na to nebudou stačit.
- TOMeek
- Člen | 64
Není zač.
O tomto problému je pěkně napsáno v dokumentaci https://doc.nette.org/…n/presenters#…
Pokud tedy budeš chtít volat Users:users, tak budeš mít UsersPresenter.php a v něm funkci renderUsers. Šablony pak budou templates/Users/users.latte