$presenter->isLinkCurrent na modul

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

Funguje nějak kontrola na modul v šabloně?

Mám například presentery
ForumModule/AdminModule/TopicPresenter.php
ForumModule/AdminModule/ThreadPresenter.php

a chtěl bych aby se mi zvýraznilo v menu, pokdu budu v modulu ForumModule (příp. může být i ForumModule/AdminModule/)

zkoušel jsem takto:
$presenter->isLinkCurrent(‚Forum:*‘) – a dostanu, že nemůže najít presenter (logicky, jelikož ho hledá relativně k tomu modulu, v kterém zrovna jsem

$presenter->isLinkCurrent(‚:Forum:*‘) – tak dostanu stejný error, jen s tím, že ho hledá v app/presenters

Zatím to řeším tak, že mám v BasePresenteru kontrolu vlastní.

Editoval Jiří Nápravník (11. 11. 2013 15:36)

frosty22
Člen | 373
+
0
-

Tak fce isLinkCurrent by měla reflektovat fci link, čili stejně jako vytváříš odkaz, tak to stejné předáš isLinkCurrent.

Takže předpokládám, že odkaz předáváš, z jiného modulu by to tedy bylo snad

:Forum:Admin:Topic:*

frosty22
Člen | 373
+
0
-

Jo a jen jako doplněk vůbec nezáleží jestli máš ten presenter v „app/presenters“ a nebo třeba v „libs/foo/blbost/bar/“ … na cestách nezáleží.

Záleží na tom v jakém je presenter namespace. Od verze 2.1.? (nvm přesně) lze definovat již namespace pro presentery vlastní, třeba App*Module*Presenter …

Příklady:

default – hledá v aktuálním presenteru actionDefault
Foo: – hledá výchozí akci presenteru s názvem Foo v aktuálním modulu
Foo:bar – hledá akcí bar v presenteru s názvem Foo v aktuálním modulu
:Foo:SubFoo:Bar:baz – s dvojtečkou na začátku by to snad měla již být absolutní cesta, takže hledá v tomhle případě hledá modul Foo:SubFoo v něm presenter Bar a v něm akci baz

.. což modul s názvem Foo:SubFoo se přeloží ve výchozím stavu na namespace FooModule\SubFooModule .. a následně tedy presenter na třídu BarPresenter

Majkl578
Moderator | 1364
+
+1
-

isLinkCurrent s moduly neumí. Používám něco takového:

public function isModuleCurrent($module)
{
	$module = trim((string) $module);

	$pos = strrpos($this->getName(), ':');
	$current = $pos !== FALSE ? substr($this->getName(), 0, $pos + 1) : NULL;

	if ($current === NULL) {
		return $module === '';
	}

	return Strings::startsWith($current, $module . ':');
}

Usage:

<li n:class="$presenter->isModuleCurrent('Foo:Bar') ? active">

což bude TRUE pro jakýkoliv presenter (i submodul) Foo:Bar:*.

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

frosty: díky za upřesnění, u mě namespace kopírují adresáře, tak jsem to zaměnil trochu…

Majkl: díky, něco hodně podobného používám