Komponenta nemá továrničku na jinou komponentu a chce si šáhnout na továrničku presenteru

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

Jak tohle řešíte, jste v šabloně

$control[imageMatcher]

což je komponenta basepresenteru,

takže máte několik možností vytvořit komponentu v každé komponentě co to chcete použít, nebo nastavit továrničku komponenty tak, aby když sama neví, kde to vzít, tak se zeptá presenteru

tohle mi ale nefunguje

<?php
	public function createComponent($name)
	{
		if (isset($this[$name])) {
			return $this[$name];
		}
		elseif (isset($this->presenter[$name])) {
			return $this->presenter[$name];
		}
	}
?>

začalo mi to ignorovat vlastní továrničky

je trochu jasné o co mi jde?

Filip Procházka
Moderator | 4668
+
0
-

Co takhle?

public function createComponent($name)
{
	if (isset($this[$name])) {
		return $this[$name];

	} elseif (isset($this->presenter[$name])) {
		return $this->presenter[$name];
	}

	return parent::createComponent($name);
}

Ale nenechám tě spálit se a řeknu ti rovnou, že komponentu nemůžeš připojit do dvou containerů. Pokud zavoláš nad komponentou dvakrát ->setParent(), tak ti to selže ;) Čili, tohle nikdy fungovat nebude :)

Nauč se raději používat Nette\ComponentModel\Component::lookup() a Nette\ComponentModel\Container::getComponents()

Editoval HosipLan (24. 10. 2011 11:06)

mcmatak
Člen | 504
+
0
-

co ukázku toho kódu, však já to nechci připojit dvakrát, nebo jo? když vrátím komponentu presenteru, on ji znovu připojí k té komponentě, kde to vracím?

Filip Procházka
Moderator | 4668
+
0
-

Teď mě napadá, tohle je hovadina

public function createComponent($name)
{
        if (isset($this[$name])) {
                return $this[$name];

protože $this[$name] volá $this->getComponent($name) a ta ji vytváří pomocí $this->createComponent($name), to by se ti mělo zacyklit ne?

A pak tohle:

public function createComponent($name)
{
	if (isset($this->presenter[$name])) {
                return $this->presenter[$name];

To ti zkusí vytvořit komponentu v presenteru (tím ji připojí do presenteru) a pak ji zkoušíš znovu připojit v té komponentě ⇒ připojuješ 2× ⇒ umře to.

mcmatak
Člen | 504
+
0
-

no právě to jsem psal,

getComponent nevím proč ale ignorovalo to, rovnou to spouštělo createComponent, hmm, aha to by asi nejdříve mělo udělat test

parent::createComponent

a když existuje tak vrátit a ne dělat set

a když neexistuje tak třeba ten presenter, ale tam je zase to dvojí připojení :( hm

no dobrá takže závěr je že v šabloně budu používat

$control->presenter[‚imageMatcher‘]

a je to vyřešeno, ať to dám kamkoli najde si to nejbližší presenter, kde je to ok