Více komponent na stránce

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

Ahoj,

řeším takový problém. Na jedné stránce vypisuji produkty a ke každému produktu jsem přidal komponentu, v šabloně je něco jako:

{foreach $products as $product}
	{$product->name}
	{control priceInfo $product}
{/foreach}

Definice komponenty:

class priceInfo extends Nette\Application\UI\Control
{
    private $template;

    public function render($product)
    {
	$this->template = parent::createTemplate(); //Vytvoříme šablonu
	$this->template->setFile(__DIR__ . '/priceInfo.phtml'); //Soubor se šablonou
	$this->template->product = $product;
	$this->template->render();
    }

    public function handleChangePrice($product_id,$new_price)
    {
	//upravi zaznam v db ... ->update(...)
	if ($this->presenter->isAjax()) {
	  $this->invalidateControl();
	}
    }
}

A v šabloně komponenty něco jako:

<a n:href="changePrice $product->id,$product->price_count" class="ajax">...</a>

U aktuálně načrtnutého řešení se odkaz neodešle, protože v render($product) nemám definovaný $product. Pokud nastavím výchozí hodnotu na NULL (protože produkt nutně nepotřebuji – mám ho třeba z handleChangePrice, tak se ivaliduje jen první komponenta na stránce.

Mým cílem není nic složitýho – stačí na když se provede handleChangePrice, tak do komponenty přidat text info, že se cena změnila.

Filip Procházka
Moderator | 4668
+
0
-

Tohle volat nemusíš

$this->template = parent::createTemplate(); //Vytvoříme šablonu

Btw, to co ti to dělá je logické, protože jsi z komponenty udělal helper. Pokud chceš dosáhnout invalidace i jiných komponent, budeš jich muset buď přidat do presenteru tolik, kolik máš produktů na stránce a pak je vypisovat zvlášť. Nebo lépe, obalit je snippety a invalidovat snippety.

Nox
Člen | 378
+
0
-

No asi takhle nějak https://forum.nette.org/…v-presenteru#…

Tedy nevím jestli je to úplně ok, ale zatím jsem nikde neviděl zmíněné řešení tohodle podle mě dost častého problému („Komponenty představují základní kámen znovupoužitelnosti kódu“…a přitom se smí použít jen jednou (za factory)…)