Dynamické komponenty a ajax

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

Ahoj,
mam menší problém mám vytvořenou dynamickou komponentu a v ní mám 2 render metody

  1. public function render()
  2. 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
+
+2
-

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)

Marek K.
Člen | 8
+
0
-

Ahoj,
ano je to pochopitelné.

Děkuji.