Prenasanie vysledku vyhladavania pocas strankovania
- piler
- Člen | 111
Zdravim,
potreboval by som poradit, ako spravit vyhladavanie s moznostou strankovania, tak aby sa hodnoty so search formu prenasali strankovanim.
Na stranke ma vyhladavaci form, zobrazenie vysledkov a VisualPaginator…Na form som nastavil metodu get, ale neviem ako preniest vsetky premenne na dalsiu stranku, ked klikam na stranky z paginatora…
Vdaka za pomoc.
- kravčo
- Člen | 721
Skôr možno
class SearchPresenter extends BasePresenter
{
/** @persistent int page number*/
public $page;
/** @persistent string search text */
public $text;
// ...
}
Kde si ale budeš musieť zakažným sám vypĺňať formulárové políčko… Elegantnejší by mohol byť perzistentný formulár… Nejako takto asi…
/**
* @persistent(searchForm)
*/
class SearchPresenter extends BasePresenter
{
/** @persistent int page number*/
public $page;
protected function createComponentSearchForm()
{
// továrnička ...
}
// ...
}
- piler
- Člen | 111
Mozno som sa zle vyjadril, tak skusim uviest priklad:
Takto zjednodusene vyzera Presenter:
<?php
class CompaniesPresenter extends LoggedPresenter
{
public function actionDefault()
{
// search
$where = NULL;
if ($this['search']->isSubmitted()) {
$where = array();
$where['companyName'] = $this['search']['companyName']->getValue();
}
$paginator = $this['pager']->getPaginator();
$paginator->itemCount = Company::getCount($where);
$this->template->companies = Company::getAll($where, $paginator->getLength(), $paginator->getOffset());
$this->template->title = 'Companies';
}
public function createComponentSearch()
{
$form = new AppForm();
$form->setMethod('get');
$form->addText('companyName', 'Company name:')
->addRule(Form::FILLED, 'Please provide company name!');
$form->addSubmit('search', 'Search');
return $form;
}
}
?>
Kedze ma form method get, tak sa vysledky z formulara nachadzaju v URL. Ale odkaz, ktory sa nachadza v paginatore, prenasa len svoje parametre. Ja by som ale potreboval, aby sa prenasala cela URL, kvoli tomu formularu.
Nemam paru, ako to vyriesit elegatne v nette. Skusal som tie persistentne parametre, ale s tym sa mi to nepodarilo.
Mam urobeny vlastny pager (nie pod nette)a ten funguje tak, ze zoberie celu URL a prida do nej svoje parametre a vytvori link.
Dik za kazdu dobre mienenu radu.
- piler
- Člen | 111
kravčo napsal(a):
piler napsal(a):
Mozno som sa zle vyjadril, tak skusim uviest priklad:
Presne tak, ako si to popísal, som to (aj predtým) pochopil.
Cize toto
/**
* @persistent(searchForm)
*/
prdstavuje tu persistentnost? Cize takto sa bude formular prenasat medzi requests? Som si to vsimol az potom, co si ma upozornil a fakt som nevidel takyto zapis @persistent(searchForm)…je niekde k tomu blizia dokumentacia ako pracovat s @persistent?
Dik za help.
- David Grudl
- Nette Core | 8228
Persistentní komponenta = přenos persistentních parametrů komponenty. Protože formulář žádné takové nemá, přenášet se nebude. Řešením je skutečně přenášet jen ten hledaný text ve vlastním parametru.
- piler
- Člen | 111
David Grudl napsal(a):
Persistentní komponenta = přenos persistentních parametrů komponenty. Protože formulář žádné takové nemá, přenášet se nebude. Řešením je skutečně přenášet jen ten hledaný text ve vlastním parametru.
A neda sa to urobit druhou cestou? Aby paginator prenasal vsetko co je
v URL pridal si tam len svoje page=…
Alebo toto riesenie nedoporucujes?
Jedna sa mi o to, ze ked formular obsahuje napr. 20 poloziek, tak musimi vytvarat 20 persistent parametrov a tie potom naplnat.
dik
- kravčo
- Člen | 721
piler napsal(a):
Cize toto
/** * @persistent(searchForm) */
prdstavuje tu persistentnost? Cize takto sa bude formular prenasat medzi requests? Som si to vsimol az potom, co si ma upozornil a fakt som nevidel takyto zapis @persistent(searchForm)…
Áno, perzistenciu komponentu s názvom „searchForm“.
je niekde k tomu blizia dokumentacia ako pracovat s @persistent?
dokumentace.search?q=persistent
forum.search?q=persistent
Vlákno o značení perzistentných komponentov.
David Grudl napsal(a):
Persistentní komponenta = přenos persistentních parametrů komponenty. Protože formulář žádné takové nemá, přenášet se nebude. Řešením je skutečně přenášet jen ten hledaný text ve vlastním parametru.
Pravda, to by bolo nutné formulár podediť, spraviť mu perzistentný parameter a implementovať rovnakú réžiu ako s perzistetným parametrom prezentera… Takže nakoniec sa možnosť číslo 1 javí jednoduchšia…
- BigCharlie
- Člen | 283
Řešil jsem podobný problém jako piler, vyřešil jsem ho také persistentních proměnných. Narazil jsem ale na záludný problém, se kterým si nevím úplně rady.
Vyhledávací formulář má čtyři položky, jejichž obsah je ukládán do persistentních proměnných, vyhledávání funguje, jak má. Persistnentní parametry se přenášejí v URL. Ovšem pokud někdo pojme myšlenku, že předá vyhledané výslekdy někomu ve formě URL (což se může stát), může narazit – přenášené parametry v adresní řádkce prohlížeče jsou o krok pozadu, jak je možné vyzkoušet v analogickém příkladu:
class BasePresenter extends Presenter
{
/** @var string */
public $name;
public static function getPersistentParams()
{
return array(
'name',
);
}
/**
* @return ITemplate
*/
protected function createTemplate()
{
$template = parent::createTemplate();
$template->registerFilter('Nette\Templates\CurlyBracketsFilter::invoke');
return $template;
}
/**
* Login form component factory.
* @return mixed
*/
protected function createComponentLoginForm($name)
{
$form = new AppForm($this, $name);
$form->addText('username', 'Uživatel');
$form->addText('password', 'Heslo');
$form->addSubmit('login', 'Přihlásit');
$form->onSubmit[] = array(
$this,
'loginSubmitted'
);
return $form;
}
public function loginSubmitted(AppForm $form) {
$values = $form->getValues();
$this->name = $values['username'];
echo $this->name;
}
}
Kde se skrývá chyba? Zřejmě v tom, že zpracování parametrů se zřejmě provádí pozdě, již po vykreslení, pokud jsem to správně pochopil. Ale kdy jindy, když je to reakcí na odeslaný formulář? A jak to vyřešit?
Editoval BigCharlie (2. 9. 2009 15:22)