Formular: zadej data + (next) → vypis data + (zpet/submit)
- richard
- Člen | 60
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
Možnosti máš v podstatě dvě. Buď session, nebo hidden fields, jak sám píšeš.
- frosty22
- Člen | 373
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
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
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>