getComponent(); – správný název komponenty

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

Ahoj,

pokouším se vytvořit komponentu z textu, např. mám v DB v textu:

nějaký článek
[module type=IKontaktniFormularComponent id=1]
další text

je asi jasné, že vy se v tu chvíli měla vytvořit komponenta KontaktniFormular,ale hází chybu.

Název souboru s komponentou: KontaktniFormularComponent.php
Název třídy v souboru: KontaktniFormularComponent, interface: IKontaktniFormularComponent
Namespace: namespace Profect\Shopminer\Komponenty;

I když dám v presenteru samotné

$this->getComponent('Profect\Shopminer\Komponenty\IKontaktniFormularComponent');

tak stejně tvrdí, že komponenta neexistuje, napadá někoho proč?

Nette\InvalidArgumentException

Component with name ‚Profect\Shopminer\Komponenty\IKontaktniFormularComponent‘ does not exist.

Editoval exquis (7. 7. 2016 14:48)

CZechBoY
Člen | 3608
+
0
-

Ten kod máš v createComponent nebo kde?
Tu komponentu nejdřív musíš vytvořit podle dané továrny a předat parametry – pomocí getComponent se asi nevytvoří pokud tam nemáš někde createComponentXXX

exquis
Člen | 83
+
0
-

CZechBoY napsal(a):

Ten kod máš v createComponent nebo kde?
Tu komponentu nejdřív musíš vytvořit podle dané továrny a předat parametry – pomocí getComponent se asi nevytvoří pokud tam nemáš někde createComponentXXX

Vytvořená není, v podstatě se snažím o to, aby obyčený text šel rozšířit o komponenty a uživatel si sám mohl vložit např. kontaktní formulář kam bude potřebovat, takže vlastně na začátku nevím jaké komponenty (pokud vůbec nějaké mám vytvořit). Tím pádem nemohu vytvořit createComponentxxx, tohle je celá funkce

    private function applyComponents(Nette\Application\UI\Presenter $presenter, $html)
    {

        preg_match_all("|\[module type=(?<typ>\H+) id=(?<modulId>\d+)\]|", $html, $matches);

        if ($matches) {
            foreach ($matches["typ"] AS $key => $value) {
                if ($value) {
                    try {
//                        $html = $presenter->getComponent('Profect\Shopminer\Komponenty\IKontaktniFormularComponent')->render();

                    } catch (\ReflectionException $ex) {

                    }
                }
            }
        }

        return $html;
    }
Michal Hlávka
Člen | 190
+
0
-

Zkus $this->context->getByType('Profect\Shopminer\Komponenty\IKontaktniFormularComponent');
Případně to může být aji tím, že ji nemáš zaregistrovanou v services.neon

Editoval emptywall (7. 7. 2016 15:15)

ViPEr*CZ*
Člen | 818
+
+1
-

Pak si budete muset udělat nějakou vlastní funkcionalitu, která to Vaše „makro“ vezme (najde ho v té šabloně), vytvoří podle textu v tom makru nějakou instanci nějaké třídy dědící UI\Control a pak takovou instanci přidat na správném místě do kontejneru přes addComponent pod správným jménem.
Navíc pak budete muset v té šabloně to Vaše makro nahradit vykreslením oné komponenty.
Celé mě napadá, že by mělo jít udělat formou vlastního nadefinovaného makra: https://latte.nette.org/cs/#….

Editoval ViPEr*CZ* (7. 7. 2016 15:47)