Drzeni defaultnich hodnot formulare

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

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
+
0
-
$item = $presenter->getService()->findById($presenter->getParam('id'));
if ($item) {
	$form->setDefaults($item->toArray());
}
Fires
Člen | 89
+
0
-

:) slo by to trosku okomentovat ? moc chytrej z toho nejsem, resp kde by se tohle melo nachazet v tovarnicce na form ? Trosku masivnejsi kop prosim :D

Šaman
Člen | 2635
+
0
-

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
+
0
-

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

Fires
Člen | 89
+
0
-

Mnoho nasobene dekuji..