Ajax v komponentě – pro různé render metody
- thm
- Člen | 147
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
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
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
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
@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
@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.