vyhladavaci formular cez komponentu a renderovanie

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

Zdravím,

mám jeden problémik. Vytvoril som si v presenteru komponentu, ktorá predstavuje vyhľadávací formulár:

protected function createComponentSearchForm()
{
	$form = new AppForm;

	$form->getElementPrototype()->class('ajaxjQueryForm');

        $form->addSelect('kde', 'Kde:', $this->whereToSearch)
		->getControlPrototype()
            	//priradi CSS triedu
		->class('select');

	$form->addText('predmet', 'Predmet:', 18, 30)
		->setEmptyValue('hľadaný predmet ...')
		->addRule(Form::FILLED, 'Predmet je povinný.')
		->getControlPrototype()
		    ->onfocus("this.value = ''; this.onfocus = null")
     		->class('input');

	......


	$form->addImage('send', WWW_ROOT.'/obr/btn_search.gif')
		->getControlPrototype()
		->title('Odoslať')
		->class('loginSubmit');

	$form->onSubmit[] = array($this, 'searchFormSubmitted');
//  $form->onSuccess[] = callback($this, 'searchFormSubmitted');  -- KED DAM TOTO TAK ERROR
	return $form;
}

potom mám ďalej metódu na spracovanie dát:

public function searchFormSubmitted(AppForm $form)
{
	// tuto chcem poslať dopyt cez model do DB
	// a výsledok vyrenderovat

        $this->redirect('search');
}

no a po presmerovaní na pohľad „Search“ sa mi nezobrazia hodnoty, ktoré som odoslal cez formulár:

public function renderSearch()
{
	$form = $this['searchForm'];

	$values = $form->getValues();

        print_r($values);  // NEZOBRAZI ODOSLANE HODNOTY
}

naviac ak skúsim v metóde „public function searchFormSubmitted(AppForm $form)“ otestovať odoslanie, tak mi ľahne server ⇒ server error 500

if ($form->isSubmittedBy()){
	$values = $form->getValues();
}

No a v šablóne koponentu vykresľujem štandardne pomocou:

{control searchForm}

Skúšal som pozerať po fóre a niečo podobné bolo tuto, ale tam to funguje, lenže mne nie.

Vdaka za pomoc.

Editoval ixod (19. 2. 2012 11:59)

RDPanek
Člen | 189
+
0
-

V

searchFormSubmitted

ty hodnoty máš k dispozici?

v

$this['searchForm'];

v renderu máš k dispozici komponentu formulare a jeho defaultní hodnoty nikoly, ty které jsi poslal…

tzn. v

searchFormSubmitted

zpracuj data a přenes si v http id toho co jsi ulozil a pak v

actionDefault

si je vytahni, nebo si hodnoty uloz do persistentnich promennych

22
Člen | 1478
+
0
-

To bude asi tím, že se do toho view nemají ty hodnoty jak dostat.. redirect ty hodnoty zahodí, takže máš formulář zase prazdný.

dubak
Člen | 41
+
0
-

22 napsal(a):

To bude asi tím, že se do toho view nemají ty hodnoty jak dostat.. redirect ty hodnoty zahodí, takže máš formulář zase prazdný.

Áno, mne je jasné že redirect tie hodnoty zahodí, mne išlo skôr o radu, akým spôsobom si dáta preniesť (nejaké best practices od skúsenejších kolegov).

dubak
Člen | 41
+
0
-

RDPanek napsal(a):

V

searchFormSubmitted

ty hodnoty máš k dispozici?

Áno, mám, keď si dám vypísať niečo takéto:

$values = $form->getValues();
print_r($values);
die('YYY');

tak mi príde response zo serveru.

v

$this['searchForm'];

v renderu máš k dispozici komponentu formulare a jeho defaultní hodnoty nikoly, ty které jsi poslal…

Áno, to som si všimol, keď som si dal „print_r($form)“

tzn. v

searchFormSubmitted

zpracuj data a přenes si v http id toho co jsi ulozil a pak v

actionDefault

si je vytahni, nebo si hodnoty uloz do persistentnich promennych

Ale ja nič neukladám, ja len vytiahnem info z databázy (podľa mňa najlepšie v „searchFormSubmitted“) a potom to chcem vykresliť do pohľadu „Search“, čiže keď sa mi vráti dlhý zoznam, tak to nebudem prenášať cez HTTP. To sa mi nejako nepozdáva.

Nedal by sa paste-núť kúsok kódu?
Vďaka

RDPanek
Člen | 189
+
0
-

V presenteru si vytvoř persistentní parametry

/** @persistent */
public $kde = NULL;

/** @persistent */
public $predmet = NULL;

po odeslani form

public function searchFormSubmitted(AppForm $form)
{
   $this->kde = $form->getValues()->kde;

   $this->predmet = $form->getValues->predmet;

   $this->redirect('search');
}

po redirectu pripravis data pro view v

public function renderSearch()
{
 $this->template->results = $this->model->articleSearch( $this->kde, $this->premet );
}

v rychlosti asi takto.

duke
Člen | 650
+
0
-

Presenter:

public function searchFormSubmitted(AppForm $form)
{
	$values = $form->getValues();
	$this->redirect('search', array(
		'where' => $values['kde'],
		'subject' => $values['predmet'],
	));
}

public function renderSearch($where, $subject)
{
	$this->template->matches = $this->context->searchModel->search($where, $subject);
}

Šablona:

{if}
<ul>
	<li n:foreach="$matches as $match">{$match['title']}</li>
</ul>
{/if $iterations}
{control searchForm}

EDIT: Nebo můžeš použít persistentní parametry, jak uvádí @RDPanek.

Editoval duke (19. 2. 2012 14:41)

dubak
Člen | 41
+
0
-

Tak už sa mi to podarilo medzitým rozbehať, pre ukážku ako som to poriešil:

public function searchFormSubmitted(AppForm $form)
{
      $values = $form->getValues();

      $this->redirect('News:search', array('kde' => $values['kde'],
					   'predmet' => $values['predmet'],
					   'rok' => $values['rok'] ));

}

no a veci mám tým pádom pekne v URL a v action už potom idem do modelu, ktorý mi pohľadá čo treba:

public function actionSearch()
{
       print_r($_GET);	// sú tu :-)

       // prippojenie na model
}

a potom to už len vykreslím cez render:

public function renderSearch($form)
{
       // vykreslenie
}

Vďaka kolegovi RDPanek

Snáď toto vlákno pomôže niekomu ďalšiemu v budúcnosti

dubak
Člen | 41
+
0
-

duke napsal(a):

Presenter:

public function searchFormSubmitted(AppForm $form)
{
	$values = $form->getValues();
	$this->redirect('search', array(
		'where' => $values['kde'],
		'subject' => $values['predmet'],
	));
}

public function renderSearch($where, $subject)
{
	$this->template->matches = $this->context->searchModel->search($where, $subject);
}

Šablona:

{if}
<ul>
	<li n:foreach="$matches as $match">{$match['title']}</li>
</ul>
{/if $iterations}
{control searchForm}

EDIT: Nebo můžeš použít persistentní parametry, jak uvádí @RDPanek.

Akurát sme takmer súbežne publikovali riešenie :-) Aj tebe vďaka za tvoj príspevok.