Proč se proměnná zapíše do adresy
- Jirda
- Člen | 103
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.
- Jirda
- Člen | 103
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
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.