Výpis z DB a vyhledávací formulář

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

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)

Tirus91
Člen | 199
+
0
-

Teď si pokládám otázku, zda to tu nikdo netuší a nebo nikdo není ochoten poradti. :-\

Mysteria
Člen | 797
+
0
-

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

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

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

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

Twista
Člen | 48
+
0
-

Tirus91 napsal(a):

ten send by měl mít onSuccess event,
tedy:

$form['send']->onSuccess[] = $this->postSearchBoxSucceeded;
Tirus91
Člen | 199
+
0
-

Twista napsal(a):

Tirus91 napsal(a):

ten send by měl mít onSuccess event,
tedy:

$form['send']->onSuccess[] = $this->postSearchBoxSucceeded;

To bych rád udělal, ale

Cannot read an undeclared property Nette\Forms\Controls\SubmitButton::$onSuccess. search►