Prenasanie vysledku vyhladavania pocas strankovania

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

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.

jasir
Člen | 746
+
0
-

Proměnné presenteru / controlu, které chceš aby se přenášely mezi jednotlivými požadavky, označ pomocí annotace @persistent.

class MyPresenter extends Presenter {
	/** @persistent int */
	public $id;
}

Hledej v dokumentaci a na fóru.

kravčo
Člen | 721
+
0
-

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

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.

kravčo
Člen | 721
+
0
-

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.

piler
Člen | 111
+
0
-

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

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

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

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

Ř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)

jasir
Člen | 746
+
0
-

Po submitu by jsi měl VŽDY provést přesměrování, přidej si na konec loginSubmitted":

	$this->redirect('this');

Editoval jasir (2. 9. 2009 15:29)

BigCharlie
Člen | 283
+
0
-

Jak prosté. Dík za bleskurychlou odpověď.