Obnovení snippetu uvnitř komponenty – Call to undefined method render()
- Danny
- Člen | 146
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 :-)
- Danny
- Člen | 146
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?