Drzeni defaultnich hodnot formulare
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- Fires
- Člen | 97
Zdravim , potreboval bych nakopnout spravnym smerem ..
Delam stranku ktera vykresli form , po kliknuti na tlacitko se form zpracuje a prekresly stranku( tu samou), ale potrebuju aby si uchoval hodnoty z minula tzn . budou zase defaultni hodnoty takove jake byli pri odeslani. Jakej je best practice na takovouhle praci s formama?
- Patrik Votoček
- Člen | 2221
$item = $presenter->getService()->findById($presenter->getParam('id'));
if ($item) {
$form->setDefaults($item->toArray());
}
- Šaman
- Člen | 2666
No, Patrik ti naznačil takovéto řešení:
- Načti si pomocí nějaké service (běžně z modelu) entitu která má
id
shodné s tím, které jsi předal aktuálnímu presenteru. - A pokud ti to tuto entitu našlo, tak nastav ve formuláři defaultní hodnoty podle této entity.
Obecně si musíš po odeslání formuláře tyto hodnoty někam uložit (db, session, ..) a zapamatovat si jak se k nim dostat (v session je to jednoduché, v db budeš potřebovat to id) a po redirectu si tyto hodnoty načteš a předáš je formuláři jako defaultní.
- Patrik Votoček
- Člen | 2221
ok tak detailněji:
// $this == aktuální presenter
// získání modelové služby
$service = $this->getService();
// načtení dat z db (entity)
$item = $service->findById($this->getParam('id'));
if ($item) {
// převedení entity na pole - aby se s tím formulář mohl poprat
$data = $item->toArray();
// nastavení defaultních dat formuláři
$this['myForm']->setDefaults($data);
}
zjednodušeně to může vypadat asi takhle:
use Nette\Application\AppForm;
class FooPresenter extends BasePresenter
{
private $item;
public function getService()
{
return $this->getContext()->getService('App\Models\ItemService');
}
protected function createComponentMyForm($name)
{
$form = new AppForm($this, $name);
// definice prvků formuláře
$form->addSubmit('sub', "Save");
$form->onSubmit[] = callback($this, 'processMyForm');
}
public function processMyForm(AppForm $form)
{
$values = $form->values;
if (!$this->item) {
$this->item = new \App\Models\ItemEntity;
}
// naplnění entity z formuláře
$this->item->setFoo($values['foo']);
$this->getService()->save($this->item);
$this->redirect('this', array('id' => $this->item->id);
}
public function actionDefault($id = NULL)
{
if ($id) {
$this->item = $this->getService()->findById($id);
if (!$this->item) {
throw new \Nette\Application\BadRequestException;
}
$this['myForm']->setDefaults($this->item->toArray());
}
}
public function renderDefault()
{
$this->template->item = $this->item;
}
}
Netestováno psáno z hlavy