modules-usage

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

Inspiroval som sa prikladom modules-usage z distribucie, je mozne ziskat zoznam vsetkych svojich modulov resp. prezenterov za behu aplikacie, alebo si na to budem musiet vytvorit vlastnu rutynu.

Jan Tvrdík
Nette guru | 2595
+
0
-

Nevím o žádném způsobu, jak získat seznam presenterů nebo modulů.

Jod
Člen | 701
+
0
-

Budeš si to musieť napísať sám, ale pokiaľ používaš RobotLoader, tak sa dajú získať nacachované dáta, z ktorých si to môžeš vytiahnuť.

jasir
Člen | 746
+
0
-

Jod napsal(a):

Budeš si to musieť napísať sám, ale pokiaľ používaš RobotLoader, tak sa dajú získať nacachované dáta, z ktorých si to môžeš vytiahnuť.

Bez přepsání private na public seznami v RobotLoaderu to nejde.

Jod
Člen | 701
+
0
-

Akože nie, všetko ma uložené tu:

Environment::getCache('Nette.RobotLoader');
jasir
Člen | 746
+
0
-

Jod napsal(a):

Akože nie, všetko ma uložené tu:

Environment::getCache('Nette.RobotLoader');

Ahaaaa! Tak to je mnohem lepší díky!

marek-m
Člen | 66
+
0
-

No to by slo, predpokladam ze dostanem len subory Prezenterov, avsak ak by som si hodil do premennej Prezenteru zoznam jeho akcii, tak by som to vedel tahat, ci aj to je zaznamenane v cachy, tam som to nevidel. Ale uz ta cache mi bude stacit

Jod
Člen | 701
+
0
-

Ono si potom z dannej triedy môžeš vytiahnuť všetký metódy ktoré majú prefix action (prípadne render a pod). V cache[‚list‘] je len class ⇒ file.

PetrP
Člen | 587
+
0
-

Vytahavat presentery z cache robot loaderu se mi vubec nelibi.

Mnohem rychlejší je si project všechny třídy

	$presenters = array();
	foreach (get_declared_classes() as $class)
	{
		if (strstr($class,'Presenter') === 'Presenter' AND $class != 'Presenter')
			$presenters[] = $class;
	}

// EDIT
Beru zpět, až když jsem to odeslal jsem si uvědomil, že všechny třídy nejsou naincludovaný. Asi bych dnes neměl nic dělat ;]]

Editoval PetrP (3. 8. 2009 12:06)

Jod
Člen | 701
+
0
-

:)))

o5
Člen | 416
+
0
-

vcera jsem si s tim hral, mozno poslouzit jako inspirace (pokud mate lepsi reseni, sem s tim :) )

//nekde v BasePresenter.php
$cache = Environment::getCache('Nette.RobotLoader');

foreach ($cache['data']['list'] as $name => $file) {
    if (false !== strpos($file, dirname(__FILE__)) && $name != "basepresenter") {
        $rClass = new ReflectionClass($name);
        $actions = array();

        foreach ($rClass->getMethods() as $rMethod) {
            if (false !== strpos($rMethod->getName(), 'render') &&
                $rMethod->getDeclaringClass()->getName() == $rClass->getName())
	    {
                $actions[] =  str_replace('render', '', $rMethod->getName());
            }
        }
        if (!empty($actions)) {
            $modules[str_replace('presenter', '', $name)] = $actions;
        }
    }
}

print_r($modules);

/*
Array
(
    [articles] => Array
        (
            [0] => Add
            [1] => Edit
            [2] => Preview
        )
    [users] => Array
        (
            [0] => Add
            [1] => Edit
        )
)
*/

Editoval o5 (14. 9. 2009 13:22)