Proč se proměnná zapíše do adresy

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

Zdravím,

mám takový problém. Vytvořil jsem si takovou vlastní komponentu, takový datalist. Je založen na datagridu v příkladech, akorát je zde možnost určit jak šablonu pro ‚grid‘, v mém případě list a pro paginator.

Prvně ukážu nějaký ten kód a pak povím, kde je problém.

DataList.php

<?php

class DataList extends Control
{
	/** @persistent */
	public $page = 1;

	/** @persistent */
	public $order = '';

	/** @persistent */
	public $listFile;

	public $paginatorFile;

	/** @var int */
	public $rowsPerPage = 1;

	/** @var DibiDataSource */
	protected $dataSource;

	/** @var Paginator */
	protected $paginator;


	public function __construct($listFile, $paginatorFile = null)
	{
		parent::__construct();
		$this->paginator = new Paginator;
		$this->paginator->itemsPerPage = $this->rowsPerPage;

		if($paginatorFile)
		  $this->paginatorFile = $paginatorFile;

		$this->listFile = $listFile;
	}



	public function bindDataTable(DibiDataSource $dataSource)
	{
		$this->dataSource = $dataSource;
		$this->paginator->itemCount = count($dataSource);
	}



	/********************* paginator ****************d*g**/



	/**
	 * Changes page number.
	 */
	public function handlePage($page)
	{
		// $this->page = $page; - is done automatically
		$this->invalidateControl('list');
	}


	/**
	 * Changes page number.
	 */
	public function handleList($list)
	{
		$this->listFile = $list;
		$this->invalidateControl('list');
	}


	/**
	 * Renders paginator.
	 */
	public function renderPaginator()
	{
		if ($this->paginator->pageCount < 2) return;

		$this->paginator->page = $this->page;

		// paginator steps
		$arr = range(max($this->paginator->firstPage, $this->paginator->page - 3), min($this->paginator->lastPage, $this->paginator->page + 3));
		$count = 4;
		$quotient = ($this->paginator->pageCount - 1) / $count;
		for ($i = 0; $i <= $count; $i++) {
			$arr[] = round($quotient * $i) + $this->paginator->firstPage;
		}
		sort($arr);

		// render
		$template = $this->createTemplate();
		$template->paginator = $this->paginator;
		if ($this->paginatorFile)
		  $template->setFile(dirname(__FILE__) . '/paginators/'.$this->paginatorFile.'.phtml');
		else
			$template->setFile(dirname(__FILE__) . '/paginators/paginator.phtml');

		$template->steps = array_values(array_unique($arr));
		$template->render();
	}

	/**
	 * Renders data list.
	 */
	public function renderList()
	{
		$dataSource = $this->dataSource;

		// paging
		$this->paginator->page = $this->page;
		$dataSource->applyLimit($this->paginator->length, $this->paginator->offset);


		// render
		$template = $this->createTemplate();
		$template->rows = $dataSource->getIterator();
		$template->columns = $dataSource->getResult()->getColumnNames();
		$template->setFile(dirname(__FILE__) . '/lists/'.$this->listFile.'.phtml');
		$template->render();
	}

}

?>

Presenter, kde vytvářím komponentu:

<?php



class Front_CategoryPresenter extends BasePresenter
{



	public function actionDefault($id)
	{
	  $idGroup = $id;
    	  $group = new GameGroups;
	  $row = $group->find($idGroup);

	  $this->template->name = $row->name;
	  $this->template->list = $this->getComponent('gameList');
  }


	protected function createComponentGameList($name)
	{
  		$list = new DataList('textGames');
  		$game = new Games;
  		$idGameGroup = $this->getParam('id');
	    $idGameGroup = Tool::getId($idGameGroup);
  		$list->bindDataTable($game->findByGroup($idGameGroup)->orderBy('created', Dibi::DESC));
  		return $list;
	}



}
?>

default.phtml

<h1>{$name}</h1>

@{control gameList:list}
@{control gameList:paginator}

textGames.phtml – něco jako grid.phtml v případě starého datagridu, nastavuje se v konstruktoru datalistu

{snippet list}

<a href="{link list 'imageGames'}" class="ajax">Přepnout na obrázkový režim</a>

  {foreach $rows as $row}

  <hr>
  {$row->title} <br />
  {$row->description}
  <br />

  {/foreach}


{/snippet}

Tady si můžete všimnout odkazu, který změní typ listu na obrázkový.

A teď problém. Všechno funguje ajaxově jak má, ale v adrese se mi nelíbí tahle věc.

…/category/1/?gameList-listFile=textGames

Proř si vkládá parametr do adresy, když vše funguje ajaxově? Pochopil bych to, kdyby se tam zapsal i údaj o aktuální stránce, ale ten tam není, proto nechápu, proč se tam zapisuje právě ten název listu. Přitom při změně listu se ta změna v adrese neprojeví, jelikož jak už jsem řekl, jde to ajaxově. Navíc, název listu je danej při vytváření komponenty, takže o důvod víc, proč nerozumím tomu, že se název zapíše do adresy.

V čem by podle Vás mohl být problém, či naopak co musím pozměnit?

Předem díky za případnou pomoc a omlouvám se, pokud jsem napsal trochu delší příspěvek, ale raději celý kód než to sem pak případně dodávat.

Jod
Člen | 701
+
0
-

Lebo je to perzistentný parameter komponenty a nemáš ho v routu definovaný.

Jirda
Člen | 103
+
0
-

Jod napsal(a):

Lebo je to perzistentný parameter komponenty a nemáš ho v routu definovaný.

Nj, ale tam neni ani page a pritom se nezobrazuje.

A ano, testoval jsem to a mas pravdu s tou perzistencí…

Ale i tak, proc se nezobrazuje pak udaj o page, ci neda se to resit jinak krom toho zpusobu pres routy? Co treba session, slo by to?

Editoval Jirda (15. 7. 2009 20:56)

Jirda
Člen | 103
+
0
-

Jirda napsal(a):

Jod napsal(a):

Lebo je to perzistentný parameter komponenty a nemáš ho v routu definovaný.

Nj, ale tam neni ani page a pritom se nezobrazuje.

A ano, testoval jsem to a mas pravdu s tou perzistencí…

Ale i tak, proc se nezobrazuje pak udaj o page, ci neda se to resit jinak krom toho zpusobu pres routy? Co treba session, slo by to?

Vyreseno. Pro uplnost, reknu jak. Promenna $listFile je protected, ne perzistentni. Vytvoril jsem ale perzistentni promennou $changeListFile, ktera ma defaultne nastaveno $changeListFile = '', pak mam handler, ktery meni jeji obsah, tak jako treba u page. Pote, kdyz vykresluju list, zjistim, zda $changeListFile neni prazdna a pokud neni, jeji hodnotu aplikuju jako sablonu listu.

Tim se zbavim te hnusne url.

I tak diky za pomoc.