AJAX Stránkování
18.09.2008Komentáře (9) Kategorie: Tvorba webu » AJAX

V tutoriále AJAX znovunačtení obsahu stránky jsme si vytvořili 3 soubory: index.php, functions.php xmlhttpreq.js. Tyto soubory budeme v následujícím tutoriále potřebovat, protože je pouze rozšíříme o další funkci. Tyto soubory můžete stáhnout ZDE

Otevřeme soubor functions.php a vytvoříme funkci getTuts() s jedním argumentem jménem page. V této funkci nejprve zjistíme počet tutoriálů. Podmíníme přístup – „kdyby náhodou“. Vytvoříme stránkovací string s odkazy na javascriptové funkce. A vybereme z databáze příslušné tutoriály pro danou stránku a nakonec je necháme vypsat.


<?php
mysqlConnect();
if($_POST['sender'] == "sendRequest")
{
  if($_POST['type'] == "new_tuts")
    getNewTuts();
}
function mysqlConnect()
{
  mysql_connect("HOST", "USER", "PASS");
  mysql_select_db("DB");
  mysql_query("SET NAMES UTF8");
}
function getNewTuts()
{
  $q = mysql_query("SELECT * FROM new_tuts ORDER BY RAND() LIMIT 4");
  while($res = mysql_fetch_assoc($q))
  {
    echo '           <div class="cla-nahled">
               <img src="'
.$res['thumb'].'" border="0" alt="'.$res['title'].'" align="left" class="nahled">
               <h2><strong>'
.$res['title'].'</strong></h2>
               '
.$res['desc'].'<br>
               <div class="cla-info">
               <span class="datum">'
.date("d.m.y", $res['time']).'</span>
               </div>
             </div>
             '
;
  }
}
function getTuts($page)
{
  $tmp = mysql_fetch_assoc(mysql_query("SELECT count(id) FROM new_tuts"));
  $count = $tmp['count(id)'];
  if($page > 0 && ($page - 1) <= (int)($count / 4))
  {
    if($page != 1)
      echo '<a href="javascript:getTuts('.($page - 1).')">« Zpět</a> ';
    for($i = 0; $i <= (int)($count / 4); $i++)
      echo '<a href="javascript:getTuts('.($i+1).')">'.($page == ($i+1) ? '<strong>'.($i+1).'</strong>' : ($i+1)).'</a>  ';
    if($page <= (int)($count / 4))
      echo '<a href="javascript:getTuts('.($page + 1).')">Další »</a> ';
    $q = mysql_query("SELECT * FROM new_tuts ORDER BY title LIMIT " . (($page - 1) * 4) . ",4");
    while($res = mysql_fetch_assoc($q))
      echo '           <div class="cla-nahled">
               <img src="'
.$res['thumb'].'" border="0" alt="'.$res['title'].'" align="left" class="nahled">
               <h2><strong>'
.$res['title'].'</strong></h2>
               '
.$res['desc'].'<br>
               <div class="cla-info">
               <span class="datum">'
.date("d.m.y", $res['time']).'</span>
               </div>
             </div>
             '
;
  }
}
?>
 

Nyní příjde na řadu náš xmlhttpreq.js soubor. Vytvoříme funkci jménem getTuts() opět s jedním argumentem jménem page, která bude vykreslovat tutoriály do našeho obsahu stránky, ale tentokrát použijeme identifikátor my_content_p – musíme tedy upravit index.php.


var xmlHttpReq;
if(typeof XMLHttpRequest != 'undefined')
{
  try
  {
    xmlHttpReq = new XMLHttpRequest();
  }
  catch(e)
  {
          try {
            xmlHttpReq = new ActiveXObject("Msxml2.XMLHTTP");
          } catch (e) {
          try {
            xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
          } catch (E) {
            xmlHttpReq = false;
          }
         }
  }
}
else
{
  try {
          xmlHttpReq = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
        try {
          xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
        } catch (E) {
          xmlHttpReq = false;
        }
  }
}

var data = sendRequest("POST", "functions.php", "sender=sendRequest&type=new_tuts");

function reloadNewTuts()
{
  document.all['my_content'].innerHTML = data;
  data = sendRequest("POST", "functions.php", "sender=sendRequest&type=new_tuts");
}

function getTuts(page)
{
  document.all['my_content_p'].innerHTML = sendRequest("POST", "functions.php", "sender=sendRequest&type=tuts&page=" + page);
}

function sendRequest(getOrPost, page, params)
{
  var strResult;
  if(getOrPost.toUpperCase() == "POST")
  {
    xmlHttpReq.open("POST", page, false);
    xmlHttpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    xmlHttpReq.send(params);
  }
  else
  {
    xmlHttpReq.open("GET", page + "?" + params, false);
    xmlHttpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    xmlHttpReq.send(null);
  }
  strResult = xmlHttpReq.responseText;
  return strResult;
}
 

index.php


<?php
require_once "functions.php";
?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  <meta http-equiv="content-type" content="text/html; charset=utf-8">
  <meta name="author" content="Marek Čapla - marek.capla@centrum.cz">
  <meta name="keywords" content="tutoriály, photoshop, tvorba webu, php, html, java script, css, ps, ps cs, ps cs2, corel, corel draw, corel rawe, tut, tuty, české, české tutoriály, tutorialy, tutorialy.com, com, download, brushe, paterny, rendery, příručka, návod, výuka, image ready, sig, speciální efekty, textové efekty, tvorba sigů, úprava fotek, webdesign, design, web, základy, programování, pagerank, google pagerank, validátor, rss, články, 3D Studio Max, Adobe Illustrator, Flash, adobe, adobe pohotoshop, Sony Vegas, video, zpracování videa, seo, seo optimaliztace, minitutorialy, diskuzní fórum, ISSN 0322-9289">
  <meta name="description" content="Tutorialy.com - Portál s tutoriály Adobe Photoshop, tvorby webu, 3D a 2D grafiky a hudby v Sony Vegas.">
  <meta name="DC.Identifier" content="(SCHEME=ISSN) 0322-9289">
  <meta http-equiv="Content-language" content="cs">
  <meta name="robots" content="all">
  <script type="text/javascript" src="xmlhttpreq.js"></script>
  <link rel="shortcut icon" href="http://tutorialy.com/templates/ikonky/favicon.gif">
  <link rel="stylesheet" type="text/css" href="http://tutorialy.com/templates/rating.css">
  <title>Tutorialy.com | internetový časopis o grafice a tvorbě webu</title>
  <link rel="stylesheet" href="http://tutorialy.com/templates/style.css">
  </head>
  <body>
   <iframe src="http://www.eclan.cz/lista/lista.php?from=Tutorialy.com&style=tutorialy.css" name="lista" width="100%" height="18" scrolling="no" frameborder="0"></iframe>
   <div align="center">
   <div id="line">
     <div id="header">
       <h1>Tutorialy.com - internetový časopis o grafice a tvorbě webu</h1>
       <div id="logo">
         <a href="http://www.tutorialy.com/"> </a>
       </div>
     </div>
   </div>
   <div id="main">
     <div id="obsah">
       <div class="blok">
         <div class="lista2">
           <a href="javascript:reloadNewTuts()">Nové tutoriály</a>
         </div>
         <div class="text" id="my_content"> <!-- Zde bude náš měnící se obsah stránky -->
          <?php
            getNewTuts();
          ?>

         </div>
       </div>
     </div>
     <!-- Stránkování -->
     <div id="obsah">
       <div class="blok">
         <div class="lista2">
           Stránkování
         </div>
         <div class="text" id="my_content_p"> <!-- Zde bude náš měnící se obsah stránky -->
          <?php
            getTuts(1); // Vykreslí první stránku
          ?>

         </div>
       </div>
     </div>
     <!-- /Stránkování -->
    </div>
  </div>
  </body>
</html>
 

A teď konečná fáze – podmínky do scriptu functions.php. V minulém tutoriále jsme přidali podmínky, které kontrolovali poslání POST proměnných. Totéž uděláme i teď, ale s výjimkou. My jsme poslali pomocí JS funkce sendRequest proměnnou type = tuts a page = NAŠE_STRÁNKA. Proto musíme napsat podmínku, která bude kontrolovat hodnotu proměnné type.


<?php
mysqlConnect();
if($_POST['sender'] == "sendRequest")
{
  if($_POST['type'] == "new_tuts")
    getNewTuts();
  elseif($_POST['type'] == "tuts")
    getTuts($_POST['page']);
}
function mysqlConnect()
{
  mysql_connect("HOST", "USER", "PASS");
  mysql_select_db("DB");
  mysql_query("SET NAMES UTF8");
}
function getNewTuts()
{
  $q = mysql_query("SELECT * FROM new_tuts ORDER BY RAND() LIMIT 4");
  while($res = mysql_fetch_assoc($q))
  {
    echo '           <div class="cla-nahled">
               <img src="'
.$res['thumb'].'" border="0" alt="'.$res['title'].'" align="left" class="nahled">
               <h2><strong>'
.$res['title'].'</strong></h2>
               '
.$res['desc'].'<br>
               <div class="cla-info">
               <span class="datum">'
.date("d.m.y", $res['time']).'</span>
               </div>
             </div>
             '
;
  }
}
function getTuts($page)
{
  $tmp = mysql_fetch_assoc(mysql_query("SELECT count(id) FROM new_tuts"));
  $count = $tmp['count(id)'];
  if($page > 0 && ($page - 1) <= (int)($count / 4))
  {
    if($page != 1)
      echo '<a href="javascript:getTuts('.($page - 1).')">« Zpět</a> ';
    for($i = 0; $i <= (int)($count / 4); $i++)
      echo '<a href="javascript:getTuts('.($i+1).')">'.($page == ($i+1) ? '<strong>'.($i+1).'</strong>' : ($i+1)).'</a>  ';
    if($page <= (int)($count / 4))
      echo '<a href="javascript:getTuts('.($page + 1).')">Další »</a> ';
    $q = mysql_query("SELECT * FROM new_tuts ORDER BY title LIMIT " . (($page - 1) * 4) . ",4");
    while($res = mysql_fetch_assoc($q))
      echo '           <div class="cla-nahled">
               <img src="'
.$res['thumb'].'" border="0" alt="'.$res['title'].'" align="left" class="nahled">
               <h2><strong>'
.$res['title'].'</strong></h2>
               '
.$res['desc'].'<br>
               <div class="cla-info">
               <span class="datum">'
.date("d.m.y", $res['time']).'</span>
               </div>
             </div>
             '
;
  }
}
?>
 

Tak a máme hotovo.

Zdrojový kód k dispozici ZDE



Hodnocení: 6.8/10 (52 hlasováno)

Komentáře (9)
od: lefiath 19-09-2008 14:19:51
Jednak je to úplná zbytečnost a navrch i špatné řešení. Spoléhat jenom na to, že všichni mají javascript je tragické, veselé je naopak co se stane, když přijde někdo, kdo má javascript vypnutý třeba kvůli reklamám (například já). A kdy se mi ozvete na ten e-mail, co jsem vám napsal? :-P

od: Mato 23-09-2008 13:58:31
No zbytečnost v tom nevidím. AJaxové stránkování je dobré používat např. při eshopech. Zákazník má rozkliknutý produkt a studuje parametry a najednou uvidí komentáře k produktu, které jsou vykresleny za pomocí stránkování. Když klikne na další stránku, tak se mu znovu načte stránka a ztratí přehled o tom, kde skončíl u čtení parametrů, kdežto u ajaxovém stránkování se mu stránka nenačte znova, ale pouze objekt s komentáři. A pokud někdo nepoužívá javascript, tak stačí použít atribut href tagu a na url kde je další, nebo předlešlá stránka a přidat do atributu onclick na konec javascriptového "konání" return false. <a href="odkaz na další stránku" onclick="volání funkce; return false;">Další</a>

od: lefiath 25-09-2008 02:14:04
Dobře, ale v tom případě by bylo vhodné to řešení rovnou nabídnout, člověk, co se neorientuje v ajaxu si to sám neudělá. Ono rozklikávací stránkování se dá udělat i přes css, když se to umí.

od: Mato 30-09-2008 17:27:57
Ano css je také řešení, ale kde je potom ajax ? Ajax je hlavně o tom nenačítat vše najednou a urychlit myslím si, že u css se budou muset vypsat všechny stránky stránkování a nechat je skryté display: none a pomocí css menit tyto vlastnosti při kliknutí na další atd... Kdežto ajax načte obsah dané stránky ve stránkování a tím pádem by se měl běh urychlit.

od: nethry 14-11-2008 20:13:40
Dobrej,
Měl bych problém s tímto druhem stránkování. Jeví se mi jako velmi dobrý nápad, ovšem po zabudování na můj web mi nefungovalo. Dlouho jsem hledal chybu až sem ji našel. Nevím proč, ale při nastavení indexové stránky s parametrem vaše stránkování funguje, ovšem při vložení už stránkování nereaguje na volanou stránku ( první stránka se načte, ovšem po kliku např. na str. 2 se nic nevykoná). Prosil bych o radu jestli by nešel váš kód nějak upravit, neboť mám celý web ve skoro validním XHTML a nechce si mi předělávat na HTML.

Děkuji za odpověď.

od: nethry 14-11-2008 20:17:38
Oprava : ale zřejme ochrana vašich komentářů zachytila důležité věci proto opravuji:

....nastavení indexové stránky s parametrem (DOCTYPE HTML PUBLIC ... DTD HTML 4.01 Transitional//EN) vase stránkování funguje, ovšem při vložení (DOCTYPE html PUBLIC ... //W3C//DTD XHTML 1.0 Transitional//EN) už stránkování nereagovalo...

od: Mato 04-12-2008 21:17:23
Zvláštní. Může to ovlivňovat mnoho faktorů, ale doctype? Napište na email mato ZAVINÁČ maxlight.cz a pošlete zdrojové kódy, já se vám na to podívám :-).

od: master2222 06-12-2008 20:33:50
Ahoj, měl bych dotaz na tento tutorial. Zajímalo by mě, jaký ke formát datumu, protože na tyto čísla já nejsem schopný přijít, a táke by mě zajímalo, jak nastavit vypisování třeba podle datumu nebo největšího ID.

od: Mato 21-02-2010 19:12:00
Problém s tím DOCTYPEem - zkuste namísto XMLHttpRequest použít javascriptovou knihovnu jQuery. jQuery je dnes používáno skoro všude. Je to přehledný framework a velmi jednoduše se s ním pracuje http://api.jquery.com/category/ajax/ .

  Neregistrovaní uživatelé nemohou přidávat komentáře k článkům.