Nefunkční link na první stranu VisualPaginatoru

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

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

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%.

jenda87
Člen | 20
+
0
-

Jeste bych chtel dodat,ze pri spravne funkcnosti mi firebug ukazuje jsonovskou ajaxovou response.

Pri kliknuti na odkaz na prvni stranu to vyhodi cele html stranky mimo divu snippetu. Vpodstate inverzi k tomu, co by mel vyhodit.

Zajimave…

Nevite?

bojovyletoun
Člen | 667
+
0
-

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

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

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

jenda87
Člen | 20
+
0
-

Bohuzel nejde:

/**
* @persistent(paginator)
*/

Werkov
Člen | 17
+
0
-

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

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

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

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

@**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)