Předání dat z formuláře v rámci prezenteru
- Dismember
- Člen | 50
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
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
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
}