kde plnit selecty – Dependent form select with AJAX
- japlavaren
- Člen | 404
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
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
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
- ako prosim nakonfigurovat tu factory, aby dostala ako parameter udaje ktorymi sa ma naplnit?
- 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
- 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%]
- 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
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
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
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)