Obnovení snippetu uvnitř komponenty – Call to undefined method render()

Danny
Člen | 146
+
0
-

Zdravím,
potřeboval bych poradit ohledně komponenty.

Mám SignComponent.php která obsahuje několik formulářů a render metod – jako registraci, přihlášení a nebo dokončení profilu. Nicméně potřeboval bych u jednoho zpracování udělat refresh pomocí ajaxu uvnitř komponenty, to ovšem vrací chybu
Nette\MemberAccessException: Call to undefined method App\ClientModule\Components\Sign\SignComponent::render()

Chápu že při volání

$this->redrawControl();

Se ta komponenta snaží udělat render a ten ve finále neexistuje protože tam je pouze např renderLogin(), renderRegister atd.. a já nevím jak sem schopný říct te komponentě aby při $this->redrawControl() pak zavolala render který je potřeba, třeba renderFinish().

class SignComponent extends BaseComponent {

	// form pouzity v finish.latte
	protected function createComponentFinish() {

		// inputy
		$form->onSuccess[] = function (Form $form, \stdClass $values) {

		$presenter = $this->getPresenter();
		if($presenter->isAjax()) {
			// zde se snazim obnovit snippet kterym je obaleny form
			$this->redrawControl('finishFormSnippet');
		} else {
			$this->getPresenter()->redirect('Homepage:');
		}

		};
		return $form;
	}

	public function renderFinish() {
		$template = $this->template;
		$template->setFile(__DIR__ . '/finish.latte');
		$template->render();
	}
}
interface ISignComponent {

	/** @return SignComponent */
	public function create();
}

finish.latte

{snippet finishFormSnippet}
<form n:name="finish" class="form-horizontal ajax">
...
</form
{/snippet}

V presenteru
SignPresenter.php

class SignPresenter extends BasePresenter {

	/** @var ISignComponent @inject */
	public $ISignComponent;

	protected function createComponentSignComponent() {
		return $this->ISignComponent->create();
	}
}

V šablone volám takto

{control signComponent:finish}

Je to vůbec možné? Jsem tedy nucený to řešit třeba multiplierem (což mi upřímně nepřijde v tuhle chvíli zas tak dobré řešení, od toho ty render metody v komponentě přeci jsou ne?) Nebo bych musel udělat každou komponentu zvlášť, tzn Komponentu co řeší jen registraci, komponentu co řeší jenom přihlášení a v každé komponetě mít jenom tu jedenu metodu render

public function render() {
	//
}

Moc děkuji :-)

CZechBoY
Člen | 3608
+
+1
-

Pokud chces pouzit ajax tak je potreba delat komponenty jen s render metodou a metoda musi byt bez parametru.
Muzu doporucit asi jen rozdeleni na vice komponent (klidne podkomponent te hlavni).

Danny
Člen | 146
+
0
-

Takže jsem opravdu odkázaný jen na to abych to rozdělil na více komponent? Jiná řešení neexistuje? Samozřejmě můžu refreshovat snippety až na úrovní presentru – ale nerad bych zbytečně obnovoval bloky které nejsou nutné.

Podkomponent myslíš to že by existovala např SignComponent a LoginComponent a LoginComponent by extendovala tu SignComponent? Mě dělá hrozný problém to že když to rozdělím tak mi přijde zbytečné do všech komponent injectovat všechny ostatní závislostí které potřebují a ve finále jsou skoro pro všechny komponenty stejné.

Je možné to udělat nějak tak, že by pak bylo možné si injectnout v presentru pouze tu SignComponentu, která by měla všechny závislosti a ty ostatní komponenty pouze form + render metodu? A k těm komponentám přistupovat skrze SignComponentu?

CZechBoY
Člen | 3608
+
+1
-

Myslel jsem to tak, ze v SignComponent budes mit dalsi komponenty – normalne createComponentXXX a {control xxx}.