„Zpět na přehled“ a VisualPaginator

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

Tak další začátečnický dotaz… Zatím jsem si vše dohledal na fóru, v dokumentaci či za cenu dlouhého bádání sám „objevil“, ale teď už bych se rád zeptal.

Používám VisualPaginator pro výpis položek, kdy každá položka je odkazem na view Edit a předává se jí $id parametr, prostě taková klasika. Z toho Edit pohledu bych chtěl uživateli nabídnout cosi jako „zpět na přehled položek“, kdy bych ale chtěl, aby se vrátil na tu stránku paginatoru, na které se ona položka nachází (tj. ne jen na nějaký view Default). Zkoušel jsem předávat do Edit pohledu přes parametry a podle nich poté při návratu VisualPaginator nějak přednastavovat, ale žádné mé řešení mi nefungovalo dobře a hlavně mi připadalo, že na to jdu strašně neelegantně.

Existuje nějaké hezké řešení? Nepotřebuji přímo kód, stačí nástin v Nette pojmech. Díky předem.

Majkl578
Moderator | 1364
+
0
-

tak tohle by mě také celkem zajímalo, když jsem to naposledy potřeboval, vyřešil jsem to nastavením extra parametru do url , myslím, že ve tvaru paginator-page=X. to se mi ale nelíbí, jelikož by se to zbortilo při změně názvu komponenty. :|

JakubKohout
Člen | 92
+
0
-

Mno tohle by asi framework nemel umět, ale napadá mě ne zcela elegatni řešení a to přidat si filtr který by vycházel z {plink} kde bych si vzal http_referer a pokud se presenter, view rovna aktuálnímu zadanému tak přidej všechny predhozi parametry.

redhead
Člen | 1313
+
0
-

a co použít (re)storeRequest() ???

JakubKohout
Člen | 92
+
0
-

redhead napsal(a):

a co použít (re)storeRequest() ???

Aaa jasné ze použit toto zase sem o funkci chytřejší :)

Tharos
Člen | 1030
+
0
-

Tak, nakonec se mi to vyřešit podařilo, takže se samozřejmě podělím. Buďto totiž vyjde najevo, že se to dá řešit lépe, anebo to aspoň bude dalším k užitku.

Od použití (re)storeRequest() jsem upustil, protože jak jsem tu již v nějakém vlákně četl přímo od Davida, tato funkce je primárně určená k něčemu jinému a má svá specifika (expirace po deseti minutách) atd.

Výsek z mého UserPresenteru vypadá nakonec následovně:

public function renderDefault($back)
{

	$users = new Users();
	$vp = new VisualPaginator($this, 'vp');

	$paginator = $vp->getPaginator();
	$paginator->itemsPerPage = 1; // to je jenom kvůli testování
	$paginator->itemCount = $users->getUsersCount();

	if (!is_null($back)) {
		$vp->loadState(array('page'=>$back));
		unset($this->params['back']);
		$this->redirect('this');
	}

	$this->template->users = $users->getUsers($paginator->itemsPerPage,$paginator->offset);;
	$this->template->back = $vp->getParam('page');

}

public function renderEdit($id,$back) {

	$form = $this['userForm'];
	if (!$form->isSubmitted()) {
		$users = new Users;
		$user = $users->getUser($id);
		if (!$user) {
			throw new BadRequestException('Požadovaný uživatel neexistuje.');
		}
		$form->setDefaults($user);
	}
	$this->template->back = $back;

}

protected function createComponentUserForm() {

	$form = new AppForm;
	/** bla bla bla, definice formuláře **/
	return $form;

}

public function userFormSubmited(AppForm $form)
{

	$users = new Users();

	$id = $this->getParam('id');

	if ($id > 0) {
		$users->updateUser($id,$form->getValues());
		$this->flashMessage('Uživatel byl úspěšně upraven.');
		$this->redirect('default',$this->getParam('back'));
	} else {
		// TODO vkládání nového uživatele
		$this->redirect('default');
	}
}

default.phtml pak následovně:

{block #content}

<h2>Správa uživatelů</h2>

{if $users}
<table>
	<thead>
		<tr><th>Jméno a příjmení</th><th>E-mail</th></tr>
	</thead>
	<tbody>
	{foreach $users as $user}
	<tr><td><a href="{plink edit $user['id'],$back}">{$user['name']} {$user['surname']}</a></td><td>{$user['email']}</td></tr>
	{/foreach}
	</tbody>
</table>
{control vp}
{else}
<p><em>Nebyli nalezeni žádní uživatelé.</em></p>
{/if}

a edit.phtml následovně:

{block #content}

<a href="{plink default $back}">Zpět na přehled uživatelů</a>

<h2>Upravit uživatele</h2>

{control userForm}

S úspěchem používám metodu loadState() VisualPaginatoru. Snad je tohle „správné“ řešení. :)

Editoval Tharos (28. 1. 2010 0:41)