Generovani komponenty pomoci vlastni syntaxe v texy

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

Narazil jsem na problem s vytvarenim komponenty uvnitr zpracovani vlastni syntaxe texy. Kdyz zavolam $anketa->render(), tak mi to nevrati text, ale jenom ho vypise na obrazovku(to zpusobi, ze jelikoz toto s provede pred zobrazenim vysledku, tak se ten kod vygenerovany komponentou zobrazi na zacatek namisto pozadovanyho mista(podle textu)).

	public function userAnketaHandler($parser, $matches, $name)
	{
		...

		$anketa = $this['anketa'];
		return $anketa->render();

		...
	}

V komponente se v metode render vykresluje text pomoci

	public function render()
	{
		...
		$this->template->render();
	}

Napadaji mne dve potencionalni reseni, ale ani jedno nejsem schopny napsat v nette.

  1. Dosahnout toho, aby funkce render v komponente vracela text(pak by to ale nemuselo byt koser vuci volani v sablone pomoci widged))
  2. Funkce userAnketaHandler by vracela jenom jakysi callback, ktery by se zavolal az pri vypisovani.
Honza Kuchař
Člen | 1662
+
0
-

Nějak nechápu proč je v userAnketaHandler() volá render()? To se přece zavolá v šablone na tom požadovaném místě.

Saska
Člen | 23
+
0
-

ono to je tak, ze kdyz narazi parser texy na danou sekvenci(mam vlastni syntaxy zapisu), ktera vyznacuje zapsani ankety, tak se provede ten userAnketaHandler(), ktery to zpracuje a vrati pozadovany kod a ja pak potrebuju dostat html vystup ty komponenty. Jenze jak uz jsem zminoval nahore, tato funkce se provadi predem a vypisovani probiha pak az naraz se to cely vypise

Honza Marek
Člen | 1664
+
0
-

Saska napsal(a):

  1. Dosahnout toho, aby funkce render v komponente vracela text(pak by to ale nemuselo byt koser vuci volani v sablone pomoci widged))

Co když budeš mít ještě jednu metodu, která bude vracet string místo vyrenderování?

// magická metoda __toString
public function __toString() {
	...
	return (string) $this->template;
}

public function render() {
	echo (string) $this;
}
Jod
Člen | 701
+
0
-

Toto riešim takto:

<?php
ob_start();
$widget->render($params);
return ob_get_clean();
?>
Saska
Člen | 23
+
0
-

Uz to chodi. Takze diky za Vasi radu a cas.

Milanov
Člen | 51
+
0
-

Zdravím. Mám zřejmě podobný příklad jako Saska. V renderované komponentě ale opět využívám Texy filtr šablony. V tomto momentě se má provést zpracování pomocí Texy v bloku, který je zpracováván pomocí Texy a vyhodí se vyjímka, že Texy již běží. Lze problém vyřešit jinak, než vytvožením nové instance Texy? Díky za rady