Externě invalidace komponenty s render argumentem
- Nox
- Člen | 378
Ahoj,
mám komponentu co (zatím jen) zobrazuje panel z uživatelským infem, má
objekt $user jako povinný argument renderu (je to ok?), v ní je cache makro
(„userBar-“.$user->getId(), tags ⇒
array(„userBar-“.$user->getId()) … což mi přijde škaredý, ale
s tím jsem nechtěl otravovat) a v něm snippet makro ‚userBar‘
Pokud nějak uživatele změním (resp. jeho vlastnost) třeba z presenteru,
rád bych komponentu invalidoval
Čištění cache už funguje, bezajaxově běží vše ok
Ajaxově ale mi nejde invalidovat
Přímo snippet asi nejde (není to snippet– ale snippet-userbar-), takže zkouším
<?php
$this(presenter)->getComponent('userBar')->invalidateControl() // (případně ->invalidateControl('userBar')
?>
jenže tady je problém že se volá render, který má ale povinného $usera a nevim jak toto předat, prošel jsem kódy, ale componenta má jen $need a invalidateControl jen $snippet
Možná na to jdu celkově špatně, klidně to taky může být odpověď
Díky moc
- bojovyletoun
- Člen | 667
Nejde o tento išů , kdy při
renderování komponent přes ajax se natvrdo volá
$komponenta->render()
? Tedy jednak se nepředají parametry a za
druhé nejde například renderSmall()
- Nox
- Člen | 378
Vyřešil jsem to znepoviněním parametru u ->render() a přidáním property $user komponentě a jeho nastavením přímo v createComponent
Je to ale jen work-around, protože stejně nejde třeba dynamicky zobrazovat komponenty pro různé vstupy (což nepotřebuju, takže to šlo vyřešit tak jak jsem psal…navíc to jak nejde volat renderNěco() jak píše bojovyletoun, ikdyž to se k tomuto taky nevztahuje)
- newPOPE
- Člen | 648
Akurat som riesil ten renderXXX() u komponenty (fast&furious riesenie :-D)
small.latte
<?php
//link na signal, bude sa volat renderSmall
<a href="{link quantityUp! $item->getHash(), render=>'small'}" class="ajax quantity-up">+</a>
?>
BaseControl.php
<?php
public function getParams() {
return $this->params; //su private
}
?>
a posledne (tu mam zaroven aj otazku na guruov ci je mozne nejak dosadit vlastnu triedu namiesto LatteMacros??, aby som nemusel zatial zasahovat do FW kym sa toto nedoriesi )
LatteMacros::renderSnippets(…)
<?php
if ($child->isControlInvalid()) {
$params = $child->getParams();
$renderMethod = NULL;
if(isset($params['render']))
$renderMethod = \ucfirst ($params['render']);
//este by to chcelo ocekovat ci metoda existuje atd...
$child->{"render{$renderMethod}"}();
}
//namiesto
if ($child->isControlInvalid()) {
$child->render();
}
?>
Editoval newPOPE (23. 2. 2011 1:49)
- Aurielle
- Člen | 1281
Ohledně LatteMacros: můžeš ji buď podstrčit LatteFilteru přepsáním metody templatePrepareFilters v BasePresenteru, nebo (efektivněji) podědit LatteFilter a nastavit to přímo v konstruktoru: (a tuto poděděnou třídu opět vnutit v templatePrepareFilters)
class LatteFilter extends Nette\Templates\LatteFilter
{
/**
* Constructor
*/
public function __construct()
{
$this->setHandler(new LatteMacros);
}
}
Editoval gmvasek (23. 2. 2011 16:49)
- newPOPE
- Člen | 648
gmvasek napsal(a):
Tak LatteFilter uz mam vlastny vsetko OK, ale pri Ajax requeste nech robim co robim nastavi vzdy Nette\Templates\LatteMacros!
resp. v vygenerovanych sablonach je vzdy LatteMacros na render snippetov…
jo skusal aj nastavit moje LatteMacros
priamo v
Nette\Application\Control
ale nic. Zrejme to ide niekade inokade…
shit to mi zas bude trvat :-D
EDT: tak som to nasiel
v Nette\Templates\LatteMacros
je natvrdo string
„LatteMacros::initRuntime…“ ktory sa premietne do kompilovanej
sablony.
Editoval newPOPE (23. 2. 2011 19:33)