Předání dat z formuláře v rámci prezenteru

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

Ahoj, nějak jsem se ztratil v úkolu, který se mi zpočátku zdál jednoduchý, ale nyní narážím na problém.

Mám aplikaci, která vypisuje položky.

Na jedné stránce zobrazuje pouze položky z nějakého zdroje (source). K tomu mám vytvořený SourcePresenter.php, který v metodě renderDefault($id) vypisuje na této stránce pouze položky podle (v odkazu předaného) $id.

Nyní bych chtěl na této stránce vytvořit filtrování podle data. Vytvořil jsem si komponentu:

<?php
 public function createComponentDateForm() {
        Container::extensionMethod('addDatePicker', function (Container $container, $name, $label = NULL) {
                    return $container[$name] = new JanTvrdik\Components\DatePicker($label);
                });
        $today = array(
            'dateTo' => new DateTime()
        );
        $form = new Form();
        $form->addHidden('id', $this->getParam('id'));
        $form->addDatePicker('dateFrom', 'Od:')
                ->addRule(Form::FILLED, 'Zadejte počáteční datum');
        $form->addDatePicker('dateTo', 'Do:')
                ->addRule(Form::FILLED, 'Zadejte koncové datum');
        $form->addSubmit('dateShow', "Zobraz");
        $form->setDefaults($today);
        $form->onSuccess[] = callback($this, 'dateFormSubmitted');
        return $form;
    }
?>

Dále jsem si myslel, že provedu zpracování toho formuláře, uložím si hodnoty a předám to do metody renderMyDate($data)

<?php
    public function dateFormSubmitted(Form $form) {
        //$this->source = $this->sourceRepository->findSourceById($form->values->id);

        $data = array(
            'dateFrom' => $form->values->dateFrom,
            'dateTo' => $form->values->dateTo,
            'id' => $form->values->id
        );

        $this->flashMessage("dateFormSubmitted - provedeno", 'success');
        $this->redirect('MyDate', $data);
    }
?>

Zde by se provedl dotaz a data by se vypsala.

<?php
  public function renderMyDate($data) {
        //$this->template->source = $this->source;
        $this->template->source = $this->sourceRepository->findSourceById($this->getParam('id'));
        $this->items = $this->sourceRepository->getItemsBySourceAndDate($this->getParam('id'), $data['dateFrom'], $data['dateTo']);
    }
?>

Pro výpis mám vytvořenou komponentu

<?php
    public function createComponentListBySource() {
        $items = $this->items;
        $control = new Osint\ItemListControl($items, $this->itemRepository);
        $control->displayCreated = TRUE;
        $control->displayInserted = TRUE;
        $control->displayAuthor = TRUE;
        $control->displayDelete = TRUE;
        $control->displayUpdate = TRUE;
        $control->displaySource = FALSE;
        $control->displayTopic = TRUE;
        $control->displayRegion = TRUE;
        return $control;
    }
?>

Akce neskončí chybou. Jen nic nenajdu. Nejsem totiž schopen přenést pole $data.

Můžete mi s tímto prosím pomoci jak toto vyřešit? Řeším to principiálně správně nebo bych to měl dělat jinak?

Díky moc!

Dismember
Člen | 50
+
0
-

opravdu mi nikdo není schopen pomoci??

Nakonec jsem to udělal takto:

<?php
    public function actionMyDate($id) {
        $dateFrom = $this->getParam('dateFrom');
        $dateTo = $this->getParam('dateTo');

        if($dateFrom['date'] > $dateTo['date']){
            $this->flashMessage('Špatně zadané rozpětí. Datum OD musí předcházet datu DO. Zkuste to ještě jednou :-)', 'info');
            $this->redirect('this');
        }

        $this->source = $this->sourceRepository->findSourceById($id);
        $this->items = $this->sourceRepository->getItemsBySourceAndDate($this->getParam('id'), $dateFrom['date'], $dateTo['date']);
    }

?>

Tímto způsobem mi to funguje.

mildhouse
Člen | 27
+
0
-

Před chvilkou jsem odeslal odpověď, vložila se 2× a když jsem 1 smazal, smazali se obě, takže znova :

Ahoj,

pokud máš :

$this->redirect('MyDate', $data);

kde

$data == array('dateFrom' => x, 'dateTo' => y, 'id' => z);

tak to přesměruje na
.../my-date/?dateFrom=x&dateTo=y&id=z

proto platí

public function renderMyDate($data) {
	dump($data) // NULL
	dump($this->getParameter('dateFrom')) // x
	dump($this->getParameter('dateTo')) // y
	dump($this->getParameter('id')) // z

}
Dismember
Člen | 50
+
0
-

jo jo, díky za vysvětlení :-)

Vlastně jsem na to po těch pár dnech přišel, že se to přenáší v odkazu a že to z tama dostanu pomocí getParameter().