Formular: zadej data + (next) → vypis data + (zpet/submit)

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

Chtel bych se zeptat jak se resi takove to klasicke – ve formulari se neco vyplni, na dalsi strance se vypisi zadane hodnoty s volbou oprav zadani nebo submit. Predpokladam, ze existuje neco elegantnejsiho, nez manualne obstaravat sessions nebo hidden fields. Dekuji za napovedu, forum jsem prohledaval marne, ale mozna spatne.

Filip Procházka
Moderator | 4668
+
0
-

Možnosti máš v podstatě dvě. Buď session, nebo hidden fields, jak sám píšeš.

frosty22
Člen | 373
+
0
-

Alternativně by to šlo řešit, přes JS :) V jQuery něco jako:

<script>
var send = false;
$(".submit").val("Náhled");

$("#form").submit(function(){
  if (send) return true;

  $("h1").text("Náhled zprávy");
  $("#form :input").attr("disabled", true);
  $(".submit").val("Uložit").attr("disabled", false);
  ...

  send = true;
  return false;
});
$(".edit").click(function(){
  send = false;

  $("h1").text("Zpráva");
  $("#form :input").attr("disabled", false);
  $(".submit").val("Náhled");
  ...

});
</script>

Tohle by před odesláním všechny formulářové prvky zakázalo, a změnilo tlačítko z „Náhled“ na „Uložit“ .. a pro příklad ještě změnilo titulek zprávy.

A je to tedy udělané, tak aby při vyplé JS, to prostě náhled ignorovalo, ale jak již jsem četl někde, zde na fóru, tak JS už má i sekačka na trávu :)

richard
Člen | 60
+
0
-

Chtel bych jeste stravit chvilku na koumani jine cesty. Nejde nejak jednoduse udelat objekt $form (nebo komponentu) perzistenti v tom stavu v jakem byl submitovan a popripade se k nemu vracet? Potom by pouze stacilo v handleru podsunout template, kde se pouze vypisi values a v dalsim handleleru form zpracovat. Neco jako:

<?php
use Nette\Application\UI\Form;

class FormsPresenter extends BasePresenter
{
	/** @persistent(form) */

	public function formVerify()
	{
		if ($form['next']->isSubmittedBy()) {
			/*
			* In this view I render only raw values
			* and link submit handler
			*/
			$this->setView('verify');
		}
	}

	public function handleSubmit()
	{
		// do stuff and...
		$this->setView('submit');
	}

	protected function createComponentForm()
	{
	    $form = new Form(NULL, 'form');
	    $form->addText("input", "Input:");
	    $form->addSubmit('next', 'Next');
	    $form->onSuccess[] = callback($this, 'formVerify');
	    return $form;
	}
}
?>

Nejde mi to, mozna proto, ze to nejde a opravdu tudy cesta nevede. Ale bylo by to krasne…
Omlouvam se, jsem neverici Tomas.

frosty22
Člen | 373
+
0
-

Persistentní parametry se předávají v URL (pokud není roven výchozímu), čili u formuláře je to relativně nepraktické. Osobně tedy nevidím důvod, proč nepoužít session?

Jednoduše něco jako (píšu z hlavy, jen nástřel!):

<?php
private $sessionSection;

/**
* Uložím si sekci session do property presenteru
*/
public function startup()
{
  parent::startup();
  $this->sessionSection = $this->context->session->getSection("previewMujForm");
}

/*
* Vykreslení formuláře, v případě že již existují data v SESSION předvyplním
*/
public function actionShow()
{
if (!empty($this->sessionSection["values"])) $this["mujForm"]->setDefaults($this->sessionSection["values"]);
}

/*
* Předání dat šabloně pro náhled, pokud nejsou data přesměruju na formulář
*/
public function actionPreview()
{
if (empty($this->sessionSection["values"]))
  $this->redirect("show");
$this->template->values = $this->sessionSection["values"];
}

/*
* Přidám data do databáze ze session, pokud nejsou data tak přesměruju na formulář
* Smažu session
*/
public function actionSend()
{
if (empty($this->sessionSection["values"]))
  $this->redirect("show");

.. INSERT INTO bla VALUES $this->sessionSection["values"]

$this->sessionSection["values"] = null;
}

/**
* Komponenta pro formulář
*/
protected function createComponentMujForm($name)
{
...
$form->onSuccess[] = array($this, "mujFormSuccess");
}

/**
* Po úspěšném validním odeslání uložím do session
*/
public function mujFormSuccess($form)
{
$this->sessionSection["values"] = (array)$form->getValues();
$this->redirect("preview");
}

?>

show.latte

  • vykreslení formuláře
{control mujForm}

preview.latte

  • vykreslení náhledu dat a odkazy na editaci / případně potvrzení odeslání
<p>Jméno: {$values["name"]}</p>
....
<p><a href="{plink Presenter:show}">Upravit</a></p>
<p><a href="{plink Presenter:send}">Odeslat</a></p>
richard
Člen | 60
+
0
-

Dik, udelam to jak rikas.