Problém s voláním presenteru u podmenu

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

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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