Stránkování – obsah se nemění

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

Ahoj,
potřeboval bych pomoct se stránkováním.

Presenter:

	public function renderDefault()
	{
$pocet_cl = NewsModel::pocetclanku();
$vp = new VisualPaginator($this, 'vp');
$paginator = $vp->getPaginator();
$paginator->itemsPerPage = 1;
$paginator->itemCount = $pocet_cl;
$this->template->news = NewsModel::fetchAll($paginator->offset, $paginator->itemsPerPage);
	}

Model:

public static function fetchAll()
 {
     return dibi::fetchAll('
         SELECT news.*, user.username, COUNT(comments.news_id) AS pocet_komentaru
         FROM [news]
         JOIN [user]
         ON user.id = news.autor
         LEFT JOIN [comments]
         ON comments.news_id = news.id
         GROUP BY news.id
         ORDER BY news.id
         ', dibi::DESC
     );
 }

Používám VisualPaginator, který se normálně zobrazuje a funguje akorát se podle stránek nemění články zůstávají pořád stejné. Mám vytvořené tři články měl by se zobrazovat jeden článek na stránku. Stránky jsou sice tři, ale na každé jsou všechny tři články.

joe
Člen | 313
+
0
-

V presenteru voláš

NewsModel::fetchAll($paginator->offset, $paginator->itemsPerPage);

ale v modelu nemáš u té metody parametry offset a limit

public static function fetchAll($offset = NULL, $limit = NULL)

a také je doplnit do dotazu

"... ORDER BY news.id LIMIT $limit OFFSET $offset"

(jen pokud nejsou NULL)


Jestli nepoužíváš MySQL, tak se na to hodí DataSource, že to nemusíš řešit dvouma dotazama.

Editoval joe (30. 7. 2011 16:36)

Martin7
Člen | 23
+
0
-

Díky, teď to šlape. Ale narazil jsem zase na jiný problém. Dělám stránku kde budou texty pisni, na levé straně mám názvy a na pravé se mi pomocí javascriptu objevuje text pisničky na kterou kliknu. Vše fungovalo, dokud jsem nedal k názvům pisniček stránkování. Nastavím limit např. 2 pisnicky na stránku, dokud je jich méně než dvě a nezobrazuje se VisualPaginator tak vše funguje, ale pokud jsou třeba 3 zobrazí se Paginator a přestane fungovat zobrazení textu. Konzole u Firubugu mi píše document.getElementById(i) is null.

Šablona s javascritem

{block #content}
<div id="lyrics">

    <script type="text/javascript">
        var maxnumber = {!$pocetpisni};

        function ukaz(u){
            for(i=1; i <= maxnumber; i++) {
         el = document.getElementById(i).style;
        el.display = 'none';
        }
        el = document.getElementById(u).style;
        el.display = 'block';
        document.getElementById('vybertepisen').style.display = 'none';
        }
    </script>

    {if count($pisne)}
    <div id="lyrics_nazev">
        <h2 class="big">Lyrics</h2>
    <ul>
    {foreach $pisne as $pisen}
       <li><a onclick="ukaz({!$pisen->id});" href="#{$pisen->id}">{$pisen['nazev']}</a>
           {if ($user->isInRole('admin'))}
       <span class="small"><a href="{link Admin:upravitpisen $pisen['id']}" title="Upravit píseň">Edit</a></span>
       <span class="small"><a href="{link Admin:smazatpisen $pisen['id']}" title="Smazat píseň">[X]</a></span>
           {/if}
       </li>
      {control vp}
    {/foreach}

    </ul>


    </div>

    <div id="lyrics_text">
        <h2 id="vybertepisen">Vlevo vyberte píseň</h2>
        {foreach $pisne as $pisen}
            <div class="none" id="{$pisen['id']}">
                <h2>{$pisen['nazev']}</h2>
                {!$pisen['text']}
            </div>
        {/foreach}

    </div>
{else}

       Zatím nejsou žádné texty.

    {/if}
</div>
{/block}

Editoval Martin7 (5. 8. 2011 18:12)

ViPEr*CZ*
Člen | 817
+
0
-

Nemá být {control vp} až za </ul> ?
A pošlete demo.

Martin7
Člen | 23
+
0
-

jo to má, ale to problém neřeší. zde demo: vyřešeno

Editoval Martin7 (8. 8. 2011 22:05)

joe
Člen | 313
+
0
-

Problém v JavaScriptu.

Na stránce 2 máš jako texty písně jenom element, s id=„2“, tzn. že element s id=„1“, který se snažíš najít neexistuje → skončí to chybou a JavaScript nepokračuje.

Mimo to by název id neměl začínat číslicí, takže je vhodné to přejmenovat třeba na articleID (article1, article2, …)

function ukaz(id_ukaz) {
	var e;
	for(i=1; i <= maxnumber; i++) {
		e = document.getElementById(i);
		if(e) {
			e.style.display = 'none';
		}
	}
	e = document.getElementById(id_ukaz);
	if(e) {
		e.style.display = 'block';
		document.getElementById('vybertepisen').style.display = 'none';
	}
}
Martin7
Člen | 23
+
0
-

díky jsem blbej, nechápu, že mi to nedošlo.