vyhladavaci formular cez komponentu a renderovanie
- dubak
- Člen | 41
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
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
- dubak
- Člen | 41
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
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
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
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
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
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.