Přesměrování ve formuláři

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

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

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}
HonzaMac
Člen | 40
+
0
-

Viděl bych problém ve formuláři. Takto by se ta metoda měla zavolat určitě:

$form->onSuccess[] = callback($this, 'annualReportsSubmitted');

Jonge17
Člen | 4
+
0
-

Vyřešeno, chyba byla jinde. Měl jsem špatný namespace:

use Nette\Forms\Form;

Toto jsem změnil na:

use Nette\Application\UI\Form;
Siam
Člen | 54
+
0
-

Z těchto dvou namespace jsem pořád docela zmatený. V dokumentaci se píše, kde se používá Nette\Application\UI\Form, ale já netuším, kde se používá zrovna to Nette\Forms\Form. Používám jak v presenterech, tak v komponentách UI\Form a funguje to v obojím.

Tomáš Votruba
Moderator | 1114
+
0
-

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.

Siam
Člen | 54
+
0
-

Schmutzka:
Aha, díky za vysvětlení! :)