Externě invalidace komponenty s render argumentem

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

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

Jan Tvrdík
Nette guru | 2595
+
0
-

Co používáš za verzi Nette?

Nox
Člen | 378
+
0
-

Pardon – 2.0 nightly pro PHP5.3, teď jsem updatoval na nejnovější commit ze 7.2., stejné (při invalidaci Argument 1 passed to UserBar::render() must implement interface User\IUser, none given, called in …\libs\Nette\Latte\LatteMacros.php on line 1243 and defined…)

bojovyletoun
Člen | 667
+
0
-

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
+
0
-

J, to bude hodně pradvěpodobně ono, díky … tak snad se to nějak časem fixne

Nox
Člen | 378
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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)