Přesměrování ve formuláři
- Jonge17
- Člen | 4
Zdravím, předem říkám že jsem úplný začátečník a asi to bude triviální problém. Mám jednoduchý select box ve kterém vybírám rok, a podle vybraného roku se mi na stejné stránce načte článek z DB. Články se mi načítají (když dám natvrdo url /annual-reports/2012), jenom mám problém s tím, jak do URL ten rok dostat.
V bootstrapu mám tuto routu:
$container->router[] = new Route('annual-reports/<year [0-9]{4}>', 'Main:annualReports');
V presenteru (mimo jiné):
protected function createAnnualReportsForm() {
$form = new Form;
$reportsYears = $this->annualReportsRepository->findYears()->fetchPairs("year", "year");
$form->addSelect("year", "Year:", $reportsYears);
$form->addSubmit("send", "Select");
$form->onSuccess[] = $this->annualReportChanged;
return $form;
}
public function renderAnnualReports($year) {
$this->template->yearsForm = $this->createAnnualReportsForm();
$this->template->annualReport = array();
if (!empty($year)) {
$this->template->annualReport = $this->annualReportsRepository->findReport($year);
}
}
Co mám dát do metody annualReportChanged aby se mi změnila ta adresa? Případně mám ještě něco blbě?
A ještě menší dotaz: metoda findReport($year) vrací z DB vždy jeden (nebo žádný) řádek. Jak z toho ten jeden řádek dostat a uložit do proměnné, abych nemusel v šabloně mít {foreach}?
- jiri.pudil
- Nette Blogger | 1032
$this->redirect('Main:annualReports', $year);
$year si samozřejmě vytáhneš z formuláře.
K menšímu dotazu (předpokládám, že findReport()
vrací
Selection):
...->findReport($year)->fetch();
- Jonge17
- Člen | 4
Díky moc, fetch funguje. S tím redirectem – zjišťuju, že chyba bude jinde. Přesně tak jsem to totiž měl. Ta metoda se vůbec nezavolá. (Zkoušel jsem tam hodit třeba flashMessage a taky nic.)
Kde by ještě mohla být chyba? Něco jsem poměnil, mám to teď takto:
protected function createComponentAnnualReportsForm($name) {
$form = new Form();
$reportsYears = $this->annualReportsRepository->findYears()->fetchPairs("year", "year");
$form->addSelect("year", "Year:", $reportsYears);
$form->addSubmit("send", "Select");
$form->onSuccess[] = $this->annualReportsSubmitted;
return $form;
}
public function annualReportsSubmitted(Form $form) {
$this->redirect("Main:annualReports", $form->values->year);
}
public function renderAnnualReports($year) {
if (!empty($year)) {
$this->template->annualReport = $this->annualReportsRepository->findReport($year)->fetch();
} else {
$this->template->annualReport = $this->annualReportsRepository->findLatestReport()->fetch();
}
}
Ještě v šabloně latte:
{form annualReportsForm}
{label year /} {input year}
{input send}
{/form annualReportsForm}
- Tomáš Votruba
- Moderator | 1114
Nette\Forms\Form
se používá v aplikacích, které
nemají MVC architekturu (např. jednoduchá statická stránka
o 1 souboru + nette.min.php
, kde je kontaktní formulář).
Naproti tomu je Nette\Application\UI\Form
svou funkčností
spojený s presenterem.