Nefunkční link na první stranu VisualPaginatoru
- jenda87
- Člen | 20
Ahoj,
používám VisualPaginator v componentě. V podstatě stejně jako tady.
Všechno mi funguje až na jednu věc. Když si odskáču stránkováním na další strany, pak se zkusím vrátit na první stranu paginátoru(tedy natu, kde paginator nepřidává žádný „text“ do url), tak to nefunguje. Žádný json nepřijde, nic.
Mám to ajaxově. Takže když kliknu na stránku č. 1, tak se nestane vůbec nic.
Dokonce i vidím, že proběhly sql příkazy, které měly proběhnout. Jen se výstup z nějakého důvodu nezobrazil.
Když přesměruji na první stranu tímto způsobem
$this['paginator']->page = $this['paginator']->paginator->page = 1;
, tak to také funguje, ajaxově.
Nevíte co s tím?
Řekl bych, že nemám něco z invalidováno, ale nevím.
FireLogger nehlásí žádné chyby. Jen to nefunguje.
Honza
Editoval jenda87 (2. 12. 2010 23:00)
- jenda87
- Člen | 20
Vážně nikdo neví?
Zkusím problém lépe popsat.
Výpis komponenty:
<?php
class ForumControl extends NControl {
public function __construct()
{
parent::__construct();
}
/** @var EntriesModel */
protected $entriesModel;
/**
* Lazy getter for EntriesModel
* @return EntriesModel
*/
//id = pobocka_url z linku
protected $pobocka_url;
//ziska pobocka_url z linku
function loadState(array $params)
{
parent::loadState($params);
$this->pobocka_url = $this->presenter->getParam('id');
}
public function getEntries()
{
if ($this->entriesModel === NULL) {
$this->entriesModel = new EntriesModel();
$this->entriesModel->pobocka_url = $this->pobocka_url;
$this->entriesModel->VypisPobockaIdZPobockaUrl();
}
return $this->entriesModel;
}
public function beforeRender()
{
if ($this->presenter->isAjax())
$this->invalidateControl('seznam');
}
public function render()
{
$template = $this->template;
$template->setFile(dirname(__FILE__) . '/ForumControl.phtml');
$dataSource = $this->entries->getDataSource();
$dataSource->where('pobocka_id = %i',$this->entries->pobocka_id)->orderBy('posted', dibi::DESC);
$paginator = $this['paginator']->getPaginator();
$paginator->itemCount = count($dataSource);
$dataSource->applyLimit($paginator->itemsPerPage, $paginator->offset);
$this->template->entries = $dataSource;
//if ($this->presenter->isAjax()) {
$this->invalidateControl('seznam');
// }
$template->render();
}
public function afterRender()
{
if ($this->presenter->isAjax() && $this->presenter->hasFlashSession())
$this->invalidateControl('flashes');
}
protected function createComponentPaginator()
{
$visualPaginator = new VisualPaginator();
$visualPaginator->paginator->itemsPerPage = 10;
if ($this->presenter->isAjax())
$visualPaginator->invalidateControl('seznam');
return $visualPaginator;
}
protected function createComponentPostForm()
{
$form = new NAppForm();
$form->getElementPrototype()->class('ajax');
//.......
$form->addSubmit('save', 'Přidat příspěvek');
$form->onSubmit[] = array($this, 'postForm_onSubmit');
return $form;
}
public function postForm_onSubmit(NAppForm $form)
{
$entry = $form->getValues();
//pole nospam nechci davat do db
unset($entry['nospam']);
$entry['posted'] = new DateTime();
$entry['ip'] = NEnvironment::getHttpRequest()->remoteAddress;
$this->entries->insert($entry);
$this['paginator']->page = $this['paginator']->paginator->page = 1;
$this->flashMessage('Váš příspěvek byl uložen. Děkujeme za Váš čas.');
if (!$this->presenter->isAjax())
$this->presenter->redirect('this');
else {
$this->invalidateControl('form');
$form->setValues(array(), TRUE);
}
}
}
Výpis šablony:
{**
* The Forum control template
*
*
* @param Presenter $presenter
* @param Control $control
* @param Template $template
*}
<h1>Kniha návštěv</h1>
{snippet form}
{control postForm}
{/snippet}
{snippet seznam}
<script type="text/javascript">
$(function() {
$(".nospam").hide();
$("input.nospam").val("no" + "spam");
});
</script>
<div class="list">
{if count($entries) > 0}
{control paginator}
{foreach $entries as $entry}
<div class="entry">
<div class="author">{$entry->author}</div>
<div class="text">{!$entry->text|escape|nl2br}</div>
<div class="posted">{$entry->posted|date}</div>
</div>
{/foreach}
{control paginator}
{else}
<div class="notice">Diskuze zatím neobsahuje žádné příspěvky.</div>
{/if}
</div>
{/snippet}
Všechno funguje jak má,kromě odkazu na první stranu paginatoru. Všude jinde mi paginator funguje i ajaxove na 100%.
- bojovyletoun
- Člen | 667
Vzpomněl jsem si na toto:tUTORIJÁL
před kapitolou závěr.
Není to ten problém?
Citace:
Také by bylo vhodné uživateli po odeslání formuláře zobrazit první stránku s jeho příspěvkem. Přidáme tedy do metody postForm_onSubmit následující řádek:
$this['paginator']->page = $this['paginator']->paginator->page = 1;
Řádek obsahuje dvě přiřazení – bohužel je nutné současnou stránku zvlášť nastavit komponentě VisualPaginator a zvlášť třídě Paginator, kterou komponenta obsahuje.
>
>
Případně zkusit zaměnit $this[‚paginator‘]->paginator->page za $this[‚paginator‘]->page a naopak
Editoval bojovyletoun (21. 1. 2011 11:10)
- jenda87
- Člen | 20
No nejak mi to nejde implementovat. Je pravda, ze kdyz zavolam
$this['paginator']->page = $this['paginator']->paginator->page = 1;
v render, tak mam prvni stranu. Jenze nevim, jak overit, ze zrovna odkazuju na prvni stranu.
co je teda wtf:
Kdyz dam v metode render
NDebug:firelog($paginator)
tak vidim, v property ‚page‘ paginatoru jak se meni aktualni strana
(v loggeru)
jenze, kdyz si vypisuju $paginator->page, tak to haze pouze prvni
stranku(tedy hodnotu 1).
Chapete to? Ja ne :-D
- Filip Procházka
- Moderator | 4668
Teoreticky by mělo stačit označit komponentu paginator za persistentní. Ale to je jen nápad, nechce se mi to zkoušet:P
- Werkov
- Člen | 17
Když jsem ve VisualPaginatoru upravil
/** @persistent */
public $page = 1;
na
/** @persistent */
public $page;
tak to fungovalo (nastavení jedničky jsem dal do ctoru). Ale zase první stránka měla v URL i to číslo stránky, když se na ni odkazovalo.
Dokáže někdo vysvětlit tohle chování? (U mě stejné, jako je popisováno výše.)
- Filip Procházka
- Moderator | 4668
Oh my… výchozí hodnota se automaticky skrývá. Proto je nutné upravit ten parametr v Routě
$router[] = new Route('/<module>/<presenter>/<action>[!/<vp-page [0-9]+>]', array(
...
));
kde vp je visualPaginator
- Martin
- Člen | 171
To máš samozřejmě pravdu. Já reagoval na něco jiného – při původním nastavení VP nefungoval odkaz na první stránku, pokud jsem byl aktuálně na jiné než první. Míněno odkaz klikem na číslíčko paginátoru.
Edit: Pardon, to byla moje nepozornost. Co jsem napsal, platí, ale jen v jedné mé aplikaci, kde jsem chtěl „extra cool URL“ a tlouklo se to s persistentním parametrem. Obecně je to samozřejmě nesmysl.
Editoval Martin (4. 5. 2011 22:48)
- Ot@s
- Backer | 476
HosipLan napsal(a):
Oh my… výchozí hodnota se automaticky skrývá. Proto je nutné upravit ten parametr v Routě
$router[] = new Route('/<module>/<presenter>/<action>[!/<vp-page [0-9]+>]', array( ... ));
Nj, co když je ale paginator
uvnitř různých komponent? Pak
je toto řešení nedostatečné. Jak jste tento problém nakonec vyřešili
(tak, aby to bylo košer)?
- Filip Procházka
- Moderator | 4668
@**Ot@s** nepoužiješ VisualPaginator, ale jenom nějaký
osekaný, bez persistentního parametru a budeš nastavovat $page
podle presenteru, nebo podle nadrazene komponenty.
Zajímá tě třída ComponentPaginator
: https://github.com/…ualPaginator
Editoval HosipLan (28. 12. 2011 14:42)