Zjištění všech dostupných presenterů

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

Chci se zeptat, jestli existuje nějaký způsob, jak získat všechny dostupné presentery.. Podle mě by ta informace už měla někde existovat a Nette o všech musí vědět, jen mě nenapadá, odkud je vytáhnout.. Jinak není problém si to samozřejmě napsat :-)

Jakub Šulák
Člen | 222
+
0
-

Taky jsem to hledal, nenašel… Tak jsem si na to napsal tohle, ale nevím jak to funguje na novém uspořádání modulů a možná jsou v tom i jiné chyby – netestoval jsem to.

<?php
 private function setPresentersAsResource($dirname='presenters/')
    {
        $dirs = array_diff(scandir(APP_DIR.'/'.$dirname), array('..', '.'));
        foreach ($dirs as $item){
            if (is_dir(APP_DIR.'/'.$dirname.$item)){
                self::setPresentersAsResource($dirname.$item.'/');
            }else{
                $matches = array();
                $name = null;

                $filename = APP_DIR.'/'.$dirname.$item;

                preg_match('/presenters\/(.*)Module/', $dirname, $matches); // dir
                if (isset($matches[1])){
                    $name = str_replace('/', '::', $filename).'::';
                }

                preg_match('/(.*)Presenter.php/', $item, $matches); //file
                $name .= $matches[1];
                dibi::query('INSERT INTO [w_resources]',array('name'=>$name));
                $this->setActionsAsPrivilege($filename, dibi::insertId());
            }
        }
        //dibi::query('TRUNCATE TABLE [w_resources]');
    }

    private function setActionsAsPrivilege($filename, $id)
    {
        $tokens = token_get_all(file_get_contents($filename));
        foreach ($tokens as $t){
            if (isset($t[1]) && preg_match('/render([a-zA-Z]*)/', $t[1], $matches)){echo $t[1].' '.$matches[1].'<br>';
                dibi::query('INSERT INTO [w_privileges]', array('name'=>$matches[1], 'resource_id'=>$matches[1]));
            }
        }
        return;
    }
?>

Takže spíš jen jako inspirace…

Honca
Člen | 28
+
0
-

Díky za odpověd, ale je to škoda.. spíš mi přijde, že to je nějak moc schovaný, podle mě by to snad mělo být někde dostupný z frameworku.. no neva, ale díky

Jakub Šulák
Člen | 222
+
0
-

Taky jsem si říkal, ale nenašel. Ale možná to tam někde je, kolem autoloadingu, nebo v Presenter…

Jan Tvrdík
Nette guru | 2595
+
0
-

Ne, skutečně to tam nikde není. Nette samo o sobě si žádný seznam presenterů nedělá. Nejblíže tomu je RobotLoader, který ví, jaká třída je v jakém souboru, ale už netuší, že daná třída je instanceof IPresenter. Pokud je něco takového potřeba, tak je ideální napsat si vlastní scanner (vylepšený RobotLoader), který bude kromě umístění tříd znát i čeho je to instance.

Editoval Jan Tvrdík (2. 11. 2009 16:18)

Jakub Šulák
Člen | 222
+
0
-

ještě se zeptám, k čemu jsi to potřeboval?

wdolek
Člen | 331
+
0
-

no byla by to ale docela dobra featura ala SmallTalk :) vlastne by se mi to velice libilo, i kdyz bych to asi moc casto nevyuzival a implementace by asi take nebyla uplne nejlehci

Vyki
Člen | 388
+
0
-

Zdarec,
používám seznam presenterů pro vlastní route. Nejdříve testuji jestli nevyhovuje url masce pro modul – presenter – akce, když ne, vyhodnocuje se zda nejde o alias. Tahám to z cache takto:

<?php
    public function collectPresenters()
    {
        $cache = Environment::getCache('Nette.RobotLoader');

        if(!isset($cache['data']['list']))
            throw new InvalidArgumentException('Data from RobotLoader were not loaded!');

        $data = array();

        foreach($cache['data']['list'] as $prname => $page){
            if((preg_match('/^(?<name>\w+)presenter$/', $prname, $matches)) && ($matches['name'] != 'i'))){

                $data[] = $matches['name'];
            }
        }
        return $data;
    }
?>

Dalo by se to určitě napsat lépe, ale na to nebyl čas :o)

Editoval Vyki (13. 11. 2009 22:10)