Formular z komponenty nacitat do snippetu v komponente

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

Zdravím mám taký dotaz
ako je možné načítať Formulár Ajaxom vytvorený v komponente do snippetu v tej istej komponente ale až po kliknutí na odkaz s handle.

Takže aby sa formulár nezobrazil hneď pri načítaní komponenty ale až po kliknutí na handle a revalidovaní snippetu.

thm
Člen | 149
+
+1
-

Takhle by to mohlo jít (jestli dobře chápu co potřebuješ – nerozumím co je formulář ajaxem vytvořený).
Toto řešení zobrazí odkaz „ukaž formulář“, po kliknutí se provede handle (kam si asi chceš ještě něco dát, jinak bych to řešil javascriptem) a formulář se zobrazí.

presenter/komponenta:

/** @persistent */
public $formShowed = false;


public function handleShowForm(){
	$this->$formShowed = true;
	if($this->isAjax()) $this->redrawControl('someSnippet');
		else $this->redirect('this');
}

public function createComponentSomeForm(){
	//...
	return $form;
}

public function renderDefault(){
	$this->template->formShowed = $this->formShowed;
}

A v šabloně normálně:

<a n:href="showForm!" n:if="!$formShowed" class="ajax">Ukaž formulář</a>
{snippet someSnippet}
	<div n:if="$formShowed">
		{control someForm}
	</div>
{/snippet}

Editoval thm (29. 9. 2014 9:31)

sucho
Člen | 57
+
0
-
(jestli dobře chápu co potřebuješ – nerozumím co je formulář ajaxem vytvořený)

Načítať AJAXOM formulár, ktorý je vytvorený v komponente do snippetu ktorý je taktiež v tej istej komponente

skúsil som to
a stále to vyžaduje nejaký render na to aby to mohlo zobraziť

exception 'Nette\MemberAccessException' with message 'Call to undefined method App\...Control::render().'

mám to nejak takto

	/** @persistent */
	public $formShowed = false;

	public function createComponentForm(){
		$form = new Form;

		$form->addText('title', 'Názov')
				->setRequired('Vyplňte toto pole');
		...

		return $form;
	}

	public function renderDefault(){
		$this->template->formShowed = $this->formShowed;
		$this->template->render();
	}

	public function handleEdit($id){
		$this->formShowed = true;

		if($this->presenter->isAjax()){
			$this->redrawControl('orderStatus');
		}else{
			$this->redirect('this');
		}
	}

a latte v komponente

{snippet orderStatus}
    {if $formShowed}
        {control form}
    {/if}
{/snippet}

<div class="order-status">
	{foreach $statuses as $status}
		<div class="status">
			<a href="{link Edit!, $status->id}" class="edit ajax">{_'upraviť'}</a>
		</div>
	{/foreach}
</div>
thm
Člen | 149
+
+1
-
exception 'Nette\MemberAccessException' with message 'Call to undefined method App\...Control::render().'

Komponenta má metodu ->render(), ne ->renderDefault(). Psal jsem to pro presenter.
Hláška ti to říká: „Volání nedefinované metody render()“

Jinak co jsem to tak zběžně projel, by to asi mohlo fungovat.

Editoval thm (29. 9. 2014 11:28)

sucho
Člen | 57
+
0
-

dik :D funguje ;)