Pokud neexistuje komponenta, vytvoř ji

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

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
+
+1
-

Druhy parametr need nastav na false: https://api.nette.org/…ntainer.html#…

Myiyk
Člen | 321
+
+1
-

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
+
0
-

Myiyk napsal(a):
3. if (isset($this->category)) bude vždy true

ne, pokud bude category null

Wailey
Člen | 48
+
0
-

Skvělé, moc děkuji.
Ty uživatelé chci udělat dynamicky přes databázi s přednastavenými přístupy k různým přiděleným sekcím. Avšak stále přemýšlím, jak to správně propojit s Nette

CZechBoY
Člen | 3608
+
+1
-

Určitě přes autorizátor [ dokumentace ].

Editoval CZechBoY (9. 3. 2016 18:35)