Ajax v komponentě – pro různé render metody

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

Ahoj, rád bych se zeptal, jak řešíte chybu(?) Nette kdy potřebuju mít různé verze komponent ajaxované.
Např.:

{control calendar:Big}
{control calendar:Small}

kdy příslušné komponenty volají renderBig(), nebo renderSmall(), ale v případě zajaxování komponenty se volá render().

Rád bych to vyřešil třeba tím, že si udělám BaseControl a v kosntruktoru nastavím renderMetodu a nebudu používat render() u komponent. Jenom nevím ja získat Big/Small v konstruktoru komponenty(?). Taky nevím jestli toto řešení je dobré nebo ne, ale fungovalo by to – aspoň myslím.

abstract class BaseControl extends Control{

	protected $renderMethod;

	public function __contruct(){
		parent::__construct();
		$this->renderMethod = //Dá se tady získat to slovo Big, Small???
	}

	public function render(){
            call_user_func(array($this,'render'.$this->renderMethod));
      	}
}
mkoubik
Člen | 728
+
0
-

Já se snažím použití více render metod v komponentách vyhýbat.

Edit: aby to neznělo úplně jako hraběcí rada: pokud potřebuješ jednu instanci jedné komponenty vykreslovat více způsoby, stojí za to mít jednu komponentu která drží stav a v ní dvě (nebo více) podkomponenty které řeší UI.

Editoval mkoubik (11. 7. 2014 13:17)

Pavel Macháň
Člen | 282
+
0
-

thm napsal(a):

Ahoj, rád bych se zeptal, jak řešíte chybu(?) Nette kdy potřebuju mít různé verze komponent ajaxované.
Např.:

{control calendar:Big}
{control calendar:Small}

kdy příslušné komponenty volají renderBig(), nebo renderSmall(), ale v případě zajaxování komponenty se volá render().

Rád bych to vyřešil třeba tím, že si udělám BaseControl a v kosntruktoru nastavím renderMetodu a nebudu používat render() u komponent. Jenom nevím ja získat Big/Small v konstruktoru komponenty(?). Taky nevím jestli toto řešení je dobré nebo ne, ale fungovalo by to – aspoň myslím.

abstract class BaseControl extends Control{

	protected $renderMethod;

	public function __contruct(){
		parent::__construct();
		$this->renderMethod = //Dá se tady získat to slovo Big, Small???
	}

	public function render(){
            call_user_func(array($this,'render'.$this->renderMethod));
      	}
}

Pomocí továrničky v create předat parametr třeba $type a v render podle tohoto typu volat požadovaný render… Jen teda budeš mít 2 instance komponenty místo 1

{control calendarBig}
{control calendarSmall}

Editoval Pavel Macháň (11. 7. 2014 12:23)

David Matějka
Moderator | 6445
+
0
-

nebo se to necha „hacknout“ multiplierem:

protected function createComponentCalendar()
{
	return new Nette\Application\UI\Multiplier(function($view) {
		return new Calendar($view); //tam uz se s tim nejak poper :)
	});
}

a v sablone

{control calendar-big}
thm
Člen | 147
+
0
-

@mkoubik – Určitě, s tím souhlasím, to je nejednodušší cesta, jak problém obejít.
@PavelMacháň – jasně, to by šlo, vlastně to tak i teď řeším, resp. podobně – v továrně komponenty nastavuju $calendar->setRenderMethod = ‚Small‘ a v render() komponenty mám call_user_func(array($this,‚render‘.$this->renderMethod)); což je prakticky stejné.

Díky moc za názory.

thm
Člen | 147
+
0
-

@matej21 – Á to je pravda s Multiplierem jsem se sice seznámil teprve včera a jestli tomu dobře rozumím, tak tomu rozumím :) V některých případech ale potřebuju, aby komponenta nebyla Multiplovaná, aby se chovala stejně – pokud ji mám vícekrát na stránce. Ale tohle řešení je dobrý. Díky.