Výpis z DB a vyhledávací formulář
- Tirus91
- Člen | 199
Jak mám provést v jedné stránce to, že na ní chci udělat výpis dle daného filtru, který si uživatel může ovlivnit (vč uložení do session) a stránkování? Vím jak na výpis a stránkování, ale už netuším jak na ten vyhledávací form
Jako dokážu udělat i ten form, ale jak předám ty vyhledávané parametry k výpisu apod (vč. uložení a načtení do session)?
vše je v rámci jednoho presenteru
Editoval Tirus91 (9. 3. 2014 22:44)
- Mysteria
- Člen | 797
Presenter:
public function renderDefault($search = NULL) {
$this->template->data = $this->model->getData($search);
}
protected createComponentSearchForm() {
$form = new Form();
$form->addText('search');
$form->onSuccess[] = function(Form $form) {
$this->redirect('this', $form->getValues()->search);
};
return $form;
}
Model:
public function getData($search) {
$table = $this->database->table('table');
if ($search) $table->where('sloupec', $search);
return $table;
}
Stačí takhle?
- Tirus91
- Člen | 199
@Mysteria ->
Z části ano, ale jak s tou session?
Snažím se nějak takto
public function postSearchBoxSucceeded($form) {
if ($form->isSuccess()) {
$formData = $form->getValues();
$data = $this->getSession('TirusAdminStorySearch');
$data->setExpiration(0);
$data->applied = false;
if ($formData->title != null) {
$data->title = $formData->title;
$data->applied = true;
} else {
unset($data->title);
}
if ($formData->published_from != null) {
$data->published_from = $formData->published_from;
$data->applied = true;
} else {
unset($data->published_from);
}
if ($formData->published_to != null) {
$data->published_to = $formData->published_to;
$data->applied = true;
} else {
unset($data->published_to);
}
if (!empty($formData->article_topic_id)) {
if (!in_array('---', $formData->article_topic_id)) {
$data->applied = true;
$data->article_topic_id = $formData->article_topic_id;
} else {
$data->applied = true;
$data->article_topic_id = $formData->article_topic_id;
if (in_array('---', $formData->article_topic_id)) {
foreach ($data->article_topic_id as $row => $key) {
if ($key == '---') {
unset($data->article_topic_id[$row]);
}
}
}
}
if (count($data->article_topic_id) < 1) {
unset($data->article_topic_id);
$data->applied = false;
}
} else {
unset($data->article_topic_id);
}
$this->redirect('this');
}
}
protected function createComponentPostSearchBox() {
$data = $this->getSession('TirusAdminStorySearch');
Nette\Diagnostics\Debugger::barDump($data);
$form = new Nette\Application\UI\ Form;
$form->addText('title', 'Titulek:', self::TITLE_COLS)
->setValue($data->applied ? $data->title : null);
.....
}
Ale ta session je pak prázdná po redirectu :(
Editoval Tirus91 (9. 3. 2014 23:26)
- Mysteria
- Člen | 797
Jo, tys to chtěl přes session vlastně :)
Takže jednak if ($form->isSuccess()) { … } je zbytečný, pokud máš nastaveno $form->onSuccess[] = postSearchBoxSucceeded; protože když nebude success, tak se ta metoda ani nezavolá, takže vyhodit.
Když hodíš Nette\Diagnostics\Debugger::barDump($data); exit; před $this->redirect(‚this‘); je session taky prázdná?
- Tirus91
- Člen | 199
Mysteria napsal(a):
Jo, tys to chtěl přes session vlastně :)
Takže jednak if ($form->isSuccess()) { … } je zbytečný, pokud máš nastaveno $form->onSuccess[] = postSearchBoxSucceeded; protože když nebude success, tak se ta metoda ani nezavolá, takže vyhodit.
Když hodíš Nette\Diagnostics\Debugger::barDump($data); exit; před $this->redirect(‚this‘); je session taky prázdná?
Ano, byla prázdná, ale už je to OK (nevím kde je chyba).
ještě jedna otázka… jak tam udělat reset button?
- Tirus91
- Člen | 199
private function createComponentSearchBox(){
.....
if ($sessionData->applied) {
$form->addSubmit('reset', 'Reset');
$form['reset']->onClick[] = $this->postSearchBoxReset;
}
$form['send']->onClick[] = $this->postSearchBoxSucceeded;
return $form;
}
public function postSearchBoxReset($form) {
$data = $this->getSession('TirusAdminStorySearch');
$data->remove();
$this->redirect('this');
}
public function postSearchBoxSucceeded($form) {
$formData = $form->getParent()->getValues();
....
}
Tak jsem to vyřešil takto – je to správně?
Editoval Tirus91 (10. 3. 2014 8:16)