kde plnit selecty – Dependent form select with AJAX

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

Mam otazku k planette Dependent form select with AJAX. Formular chcem mat ako samostatnu komponentu UI\Control. Problem vznika, kde plnit zavisle select boxy hodnotami (setItems). V createComponent este nepoznam prijate hodnoty (popripadne nastavene od setDefaultValues) a v render uz je neskoro

kde a ako plnit data zavislych selectov??

japlavaren
Člen | 404
+
0
-

podelim sa, ako som to vyriesil. otazka je, preco nieco take nieje priamo v UI\Forms

<?php

namespace App\Forms;

class Form extends \Nette\Application\UI\Form
{
	/** @var array of function(Form $sender, array $values); Occurs when values are set or form receive response */
	public $onPopulate = array();


	/**
	 * @param \Nette\ComponentModel\IComponent $presenter
	 */
	protected function attached($presenter)
	{
		if ($this->isSubmitted()) $this->onPopulate($this, $this->getHttpData());

		parent::attached($presenter);
	}


	/**
	 * @param array|\Traversable $values
	 * @param bool $erase
	 * @return self
	 */
	public function setValues($values, $erase = FALSE)
	{
		$this->onPopulate($this, $values);

		return parent::setValues($values, $erase);
	}
}
?>
<?php
$form->onPopulate[] = function(Form $form, $values){
	// zavisle selecty a pod...
};
?>

Editoval japlavaren (1. 7. 2014 13:28)

Jiří Nápravník
Člen | 710
+
+2
-

Mám formulář jako samostatnou komponentu UI/Control a generovanou továrničku a plním ten závislý select až v ní. Resp. já celé plnění formuláře nechávám, až na komponentě.

Presenter

public function actionEdit($id){
	$this->articleToEdit = $this->articleFacade->getArticleById($id);
}

protected function createComponentArticleEditForm()
{
	return $this->articleEditFormFactory->create($this->articleToEdit);
}

no a v samotné komponentě potom mám ten articleToEdit (kde jsou ty všechny hodnoty, včetně závislých selectů) a v render() komponenty to vše nastavím

japlavaren
Člen | 404
+
0
-
  1. ako prosim nakonfigurovat tu factory, aby dostala ako parameter udaje ktorymi sa ma naplnit?
  2. ak zavisle selecty nastavujes az v render, nieje to neskoro? pretoze ak zavolam getValues skor, ako prebehne render v komponente tak dostanem neuplne vysledky

Editoval japlavaren (2. 7. 2014 20:43)

Jiří Nápravník
Člen | 710
+
0
-
  1. Používám editační formulář i pro přidávání, takže mám ten parametr, jako nepovinný a v neonu to vypadá takhle (je to nette 2.1, v 2.2 se to tusim nejak urpavovalo, tak mozna ten class uz se psat nemusi, ale nevim):
	-
		implement: BacklinkModule\AdminModule\Components\Backlink\Edit\IBacklinkEditFormFactory
		class: BacklinkModule\AdminModule\Components\Backlink\Edit\BacklinkEditForm
		parameters: [backlinkToEdit: NULL]
		arguments: [%backlinkToEdit%]
  1. Nějak mi to nedělá problémy. Ale já zpracovávám ten formulář taky přímo v komponentě, mám tam proste $form->onSuccess[] = array($this, ‚processForm‘); a tam dostanu getValues v pohodě. Pokud by to náhodou blbo, tak si to můžeš hodit do createComponentForm tam by to už kor mělo jít.
japlavaren
Člen | 404
+
0
-

2. ak sa nemylim, success sa vola pred renderom komponenty. cize ked plnis formular az v render metode, uz je neskoro. v success to potom tahas z http data? pretoze pri selecte nette nevrati inu hodnotu, ako ma v v poli items a items nieje este nastavene

Jiří Nápravník
Člen | 710
+
0
-

No v tomhle případě to funguje u mě proto, že já mám ještě onValidate callback (je to složitý formulář, který musí validovat i jiné věci) a v tom nastavuji ty itemy podle toho prvniho selectu, proto to pak mám v getValues().

Pokud bych tam neměl onValidate, pak bych to buď nastavoval jak v render, tak asi v onSuccess (itemy podle kategorie), ale spíše bych to dal přímo do toho createComponentForm

Climber007
Člen | 105
+
-1
-

Ideální mi přijde do create() nic nepředávat a vytvořit si v komponentě setter.

V presenteru:

public function actionedit($id){
    $this['articleEditForm']->setArticle($this->articleFacade->getArticleById($id));
}

protected function createComponentArticleEditForm()
{
    return $this->articleEditFormFactory->create();
}

V tom UI\Control už jednoduše:

public function setArticle($article)
{
	$this->article = $article;
}

PS: Snad je to ve všech směrech v pohodě.

Editoval Climber007 (23. 1. 2015 14:29)