Dynamické komponenty a ajax
- Marek K.
- Člen | 8
Ahoj,
mam menší problém mám vytvořenou dynamickou komponentu a v ní mám
2 render metody
- public function render()
- public function renderSmall()
v sabloně pak volám
{control favourite-$row->id} resp {control favourite-$row->id:small}
Vše funguje jak má. Ovšem v okamžiku, kdy invaliduji komponentu favourite-$row->id:small ajaxem, tak se mi načítá a vrací obsah jako kdybych na tom místě volal favourite-$row->id
V šabloně mám
{snippet small}
<!-- Oblibene -->
{if $isFavourite}
<a n:href="action!, remove" class="projectHead-favourite is-active">
<span style="display:block">Odebrat z oblíbených</span>
</a>
{else}
<a n:href="action!, add" class="projectHead-favourite ajax">
<span style="display:block">Přidat do oblíbených</span>
</a>
{/if}
<!-- / Oblibene -->
{/snippet}
Handle metoda pak vypadá takto
public function handleAction($type){
if($this->getPresenter()->user->isLoggedIn()) {
if ($type == 'add') {
$this->userFavourite->insert(['user_id' => $this->getPresenter()->user->getId(), 'project_id' => $this->project->id]);
} else {
$this->userFavourite->delete(['user_id' => $this->getPresenter()->user->getId(), 'project_id' => $this->project->id]);
}
$this->redrawControl('small');
}else{
$this->getPresenter()->redirect('Sign:in');
}
}
Dokáže mi prosím, někdo poradit co tam dělám špatně?
Děkuji
- Jan Mikeš
- Člen | 771
Ahoj, jedná se o omezení nette, pokud překresluješ v snippetu
komponentu, volá se vždy pouze render()
metoda, nikoliv
renderXxx()
pokud máš v šabloně
{control abc:xxx}
.
Jako workaround používám v komponentách property $view
, na
základě které pak vykresluji v render metodě šablonu kterou potřebuji a
rozděluji si to do 2 továrních metod v presenteru, např takto:
{snippet abc}
{control x}
{control y}
{/snippet}
protected function createComponentX()
{
return $this->controlFactory->create();
}
protected function createComponentY()
{
// stejna factory jako v createComponentX
$control = $this->controlFactory->create();
$control->setView("small");
return $control;
}
class MyControl
{
private $view = "default";
public function setView($view)
{
$this->view = $view;
}
public function render()
{
return call_user_func_array([$this, "render" . ucfirst($this->view)], func_get_args());
}
private function renderDefault()
{
$template = $this->createTemplate();
$template->setFile("default.latte");
return $template->render();
}
private function renderSmall()
{
$template = $this->createTemplate();
$template->setFile("small.latte");
return $template->render();
}
}
Snad je to z ukázek pochopitelné.
Editoval Jan Mikeš (8. 11. 2016 8:07)