Zjištění všech dostupných presenterů
- Jakub Šulák
- Člen | 222
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…
- Jakub Šulák
- Člen | 222
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
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)
- Vyki
- Člen | 388
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)