Pokud neexistuje komponenta, vytvoř ji
- Wailey
- Člen | 48
Ahoj, řeším jeden malý problém.. jak lze v nette zjistit zdali je
komponenta vytvořená (existuje), či nikoli. Nejspíše hledám špatně, ale
nic jsem nenašel.
konkrétně v poznámce „Načtení pluginů“
Plus prosím, nejsem si jistý, zdali jsem si tímto dynamickým vytvářením komponent neudělal díru. Moc děkuji
namespace App\Presenters;
use Nette\Http as Http,
Nette\Application\UI,
Nette\Application\UI\Form as Form,
Nette\Utils\Image,
Nette\Utils\Strings;
class AdminPagesPresenter extends BasePresenter {
/** @persistent */
public $page;
/** @persistent */
public $category;
// Informace o stránce
public $pageID;
public $page_data;
public $page_items;
// Nastavení ID k souborovému systému
public $directoryBannerID;
public $directoryID;
// Pluginy
public $plugins;
protected function startup() {
parent::startup();
// Neoprávněný přístup
if (!$this->getUser()->isLoggedIn() || !($this->getUser()->isInRole("admin") || $this->getUser()->isInRole("user"))) {
$this->redirect('Homepage:');
}
// Předání parametrů
$this->page = $this->getParameter("page");
$this->category = $this->getParameter("category");
$this->pageID = $this->pages->getPageIDFromURL($this->page);
if (isset($this->category)) {
$this->pageID = $this->pages->getPageCategoryFromURLNameID($this->pageID, $this->category);
}
// Data stránky
$this->page_data = $this->pages->getPages($this->pageID);
// Nastavení složek souborového systému
if ($this->page_data) {
$this->directoryID = $this->pages->getPageDirectory($this->page_data->id);
$this->directoryBannerID = $this->files->getDirInDir("Banner", $this->directoryID);
}
// Načtení pluginů
$this->plugins = $this->pages->getPageModule($this->pageID);
foreach($this->plugins as $plugin) {
$class = "\\App\\Components\\{$plugin->class}_admin";
/***************************************/
// Zde potřebuji odladit kód /
if (!$this->getComponent($plugin->class)) $this->addComponent(new $class(), $plugin->class);
// /
/***************************************/
$plugin["cover"] = $this->files->getURLImagePathNameID($plugin->cover_id, "/images/nomodule.png", 48, 48, 0, "fill");
}
}
public function renderDefault() {
// Controla Snippet
foreach($this->plugins as $plugin) {
$this[$plugin->class]->invalidateControl();
}
// Poslání pluginů do šablony
$this->template->plugins = $this->plugins;
// Data
$this->template->page_data = $this->page_data;
$this->template->category = $this->category;
$this->template->lastChangeUserName = ($this->page_data)?
$this->users->getFullName($this->page_data->users_id):null;
}
- David Matějka
- Moderator | 6445
Druhy parametr need nastav na false: https://api.nette.org/…ntainer.html#…
- Myiyk
- Člen | 321
Pokud se někdo nedostane do databáze, tak tam zranitelnost nevidím.
Komentář ke kódu
1. Pokud nemáš uživatele jako admin a user současně, tak část
podmínky $this->getUser()->isInRole("user")
nepotřebuješ.
2.
// Předání parametrů
$this->page = $this->getParameter("page");
$this->category = $this->getParameter("category");
tohle dělá nette samo, můžeš smazat
3. if (isset($this->category))
bude vždy true
Editoval Myiyk (8. 3. 2016 18:48)
- David Matějka
- Moderator | 6445
Myiyk napsal(a):
3.if (isset($this->category))
bude vždy true
ne, pokud bude category null