Proměnné ze šablony komponenty
- jerry90
- Člen | 19
Ahoj, potreboval bych v presenteru ziskat nejlepe vsechny promenne, ktere v komponente posilam do templaty. Tedy v komponente nastavim
$this->template->promenna = 1;
a pak se k ni chci dostat z presenteru, ve kterem je komponenta
instanciovana.
Zkousel jsem
$this['nazev_komponenty']->template->getParams();
ale tam moje promenne nejsou.
Diky za pomoc.
- Filip Procházka
- Moderator | 4668
Jestli je plníš v render()
, tak logicky musíš nejdříve
zavolat ty metody :)
- jerry90
- Člen | 19
Jde mi o to, ze potrebuji na konci zivotniho cyklu poslat JSONResponse se
vsemi promennymi sablony a sablon vsech jejich komponent. Jak bych toho docilil
? Potrebuju nejake misto v zivotnim cyklu za vykreslenim komponent, coz
afterRender zjevne neni (paradoxne).
Diky moc
Editoval jerry90 (22. 12. 2011 15:56)
- Filip Procházka
- Moderator | 4668
Šablona se totiž „vykreslí“ lazy po „odeslání“
TextResponse
.
Nejdříve se zavolají události presenteru startup
,
action
, signal
, beforeRender
,
render
, afterRender
a pak se celý object Template
obalí do objektu TextResponse.
Ten se vrací do Application
a ta teprve odpověď
odešle a response
s šablonou se vykreslí.
- Filip Procházka
- Moderator | 4668
To rozhodně bude způsobovat problémy :)
protected function renderDefault()
{
ob_start();
$this->template->render();
ob_end_clean();
$this->sendResponse(new TemplateParametersResponse($this));
}
use Nette\Application\UI;
class TemplateParametersResponse extends Nette\Object implements \Nette\Application\IResponse
{
private $parameters = array();
public function __construct(UI\PresenterComponent $component)
{
$this->addComponent($component);
foreach ($component->getComponents(TRUE, 'Nette\Application\UI\PresenterComponent') as $child) {
$this->addComponent($child);
}
}
/**
* @param \Nette\Application\UI\PresenterComponent $component
*/
public function addComponent(UI\PresenterComponent $component)
{
if (!$component->getReflection()->hasMethod('getTemplate')) {
return;
}
$template = $component->getTemplate();
if (!$template instanceof \Nette\Templating\Template) {
return;
}
$this->parameters[$component->getUniqueId() ? : 'presenter'] = $template->getParameters();
}
/**
* Sends response to output.
* @return void
*/
public function send(Nette\Http\IRequest $httpRequest, Nette\Http\IResponse $httpResponse)
{
$httpResponse->setHeader('Content-Type: application/json');
echo json_encode($this->parameters);
}
}
Editoval HosipLan (22. 12. 2011 17:12)
- Filip Procházka
- Moderator | 4668
Aha, tak to bude problém, protože soubor se nastavuje až v
sendTemplate
a tahle metoda rovnou zabije presenter.
- jerry90
- Člen | 19
Vyresil jsem to tak, ze jsem tam zkopiroval cast kodu z metody
sendTemplate()
:
if ($template instanceof Nette\Templating\IFileTemplate && !$template->getFile()) { // content template
$files = $this->formatTemplateFiles();
foreach ($files as $file) {
if (is_file($file)) {
$template->setFile($file);
break;
}
}
}