Pagination php + XML
Posté : 14 sept. 2011, 10:27
Bonjour à tous,
Je développe un moteur de recherche avec l'api yahoo boss vous pouvez regarder à cette adressehttp://soliwave.com/test).
Si vous allez visiter, ne prenez pas peur, pour le moment, je test, donc vous verrez le résultat de la réponse xml...
Le principe est simple : on envoi la requête et l'api renvoi du xml que l'on affiche.
J'ai trouvé sur le net une fonction de pagination assez sympa à cette adresse http://seebz.net/34-pagination-2-comme- ... mieux.html et je l'ai adapté (le mot est large car je ne suis pas un pro de la prog php, loin de la...[biggrin]).
Bref, je suis bloqué sur ce système de pagination, il s'affiche comme ceci :
<< Précédent 1 2 3 ... 327548 Suivant>>
Pour le moment, seul les liens 1 2 3 fonctionnent (et encore, c'est une grand mot).
Je souhaiterais avoir des conseils pour mieux comprendre et mettre en place ce système et ainsi finir de mettre en place mon site (ca fais deux jours que je bloque là dessus).
Voici mes codes :
Fonction de pagination :
Enfin voilà, en espérant avoir quelques conseils pour me dépatouiller de cette galère, je vous remercie d'avance pour vos retour.
CDT,
Thomas
Je développe un moteur de recherche avec l'api yahoo boss vous pouvez regarder à cette adressehttp://soliwave.com/test).
Si vous allez visiter, ne prenez pas peur, pour le moment, je test, donc vous verrez le résultat de la réponse xml...
Le principe est simple : on envoi la requête et l'api renvoi du xml que l'on affiche.
J'ai trouvé sur le net une fonction de pagination assez sympa à cette adresse http://seebz.net/34-pagination-2-comme- ... mieux.html et je l'ai adapté (le mot est large car je ne suis pas un pro de la prog php, loin de la...[biggrin]).
Bref, je suis bloqué sur ce système de pagination, il s'affiche comme ceci :
<< Précédent 1 2 3 ... 327548 Suivant>>
Pour le moment, seul les liens 1 2 3 fonctionnent (et encore, c'est une grand mot).
Je souhaiterais avoir des conseils pour mieux comprendre et mettre en place ce système et ainsi finir de mettre en place mon site (ca fais deux jours que je bloque là dessus).
Voici mes codes :
Fonction de pagination :
function pagination($current_page, $nb_pages, $link='?page=%d', $around=3, $firstlast=1)
{
$pagination = '';
$link = preg_replace('`%([^d])`', '%%$1', $link);
if ( !preg_match('`(?<!%)%d`', $link) ) $link .= '%d';
if ( $nb_pages > 1 ) {
// Lien précédent
if ( $current_page > 1 )
$pagination .= '<a class="prevnext" href="'.sprintf($link, $current_page-1).'" title="Page précédente">« Précédent</a>';
else
$pagination .= '<span class="prevnext disabled">« Précédent</span>';
// Lien(s) début
for ( $i=1 ; $i<=$firstlast ; $i++ ) {
$pagination .= ' ';
$pagination .= ($current_page==$i) ? '<span class="current">'.$i.'</span>' : '<a href="'.sprintf($link, $i).'">'.$i.'</a>';
}
// ... après pages début ?
if ( ($current_page-$around) > $firstlast+1 )
$pagination .= ' …';
// On boucle autour de la page courante
$start = ($current_page-$around)>$firstlast ? $current_page-$around : $firstlast+1;
$end = ($current_page+$around)<=($nb_pages-$firstlast) ? $current_page+$around : $nb_pages-$firstlast;
for ( $i=$start ; $i<=$end ; $i++ ) {
$pagination .= ' ';
if ( $i==$current_page )
$pagination .= '<span class="current">'.$i.'</span>';
else
$pagination .= '<a href="'.sprintf($link, $i).'">'.$i.'</a>';
}
// ... avant page nb_pages ?
if ( ($current_page+$around) < $nb_pages-$firstlast )
$pagination .= ' …';
// Lien(s) fin
$start = $nb_pages-$firstlast+1;
if( $start <= $firstlast ) $start = $firstlast+1;
for ( $i=$start ; $i<=$nb_pages ; $i++ ) {
$pagination .= ' ';
$pagination .= ($current_page==$i) ? '<span class="current">'.$i.'</span>' : '<a href="'.sprintf($link, $i).'">'.$i.'</a>';
}
// Lien suivant
if ( $current_page < $nb_pages )
$pagination .= ' <a class="prevnext" href="'.sprintf($link, ($current_page+1)).'" title="Page suivante">Suivant »</a>';
else
$pagination .= ' <span class="prevnext disabled">Suivant »</span>';
}
return $pagination;
}
L'index du site (sans le html ...) :// messages to display
$noresultsmessage = 'Pas de résultats pour cette recherche.';
$resultsmessage = 'Résultats $nb_start à $end sur $all pour';
$badtermmessage = 'Recherche interdite';
//debut du code
require("OAuth.php");
// Numero de page (1 par défaut)
if( isset($_GET['page']) && is_numeric($_GET['page']) )
$page = $_GET['page'];
else
$page = 1;
if(!empty($_GET['q'])){
$query = $_GET['q'];
}
if(!empty($_GET['count'])){
$nb_count = $_GET['count'];
}
else $nb_count = '10';
if( isset($_GET['start']) ){
if ($page > 1)
$nb_start = $page*$nb_count;
else if ($page = 1)
$nb_start = '0';
}
else $nb_start = '0';
$cc_key = "dj0yJmk9dTNzJmQ9WVdrOVZVZ00Yw--";
$cc_secret = "9b8e28689";
$url = "http://yboss.yahooapis.com/ysearch/web";
$args = array();
$args["q"] = $query;
$args["format"] = "xml";
$args["market"] = "fr-fr";
$args["count"] = $nb_count;
$args["start"] = $nb_start;
$consumer = new OAuthConsumer($cc_key, $cc_secret);
$request = OAuthRequest::from_consumer_and_token($consumer, NULL,"GET",
$url, $args);
$request->sign_request(new OAuthSignatureMethod_HMAC_SHA1(), $consumer, NULL);
$url = sprintf("%s?%s", $url, OAuthUtil::build_http_query($args));
$ch = curl_init();
$headers = array($request->to_header());
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$rsp = curl_exec($ch);
$results = new SimpleXMLElement($rsp);
//print_r ($results);
$all = $results->web[totalresults];
echo "<br/>";
$format_url = 'index.php?type=web&q=' . $_GET['q'] . '&start='.$nb_start.'&count=' . $nb_count . '&page=%d';
//test avec ancien code version V1
// if there are no results, display the no results message
if($all < 1){
echo '<p id="resultcounter">'.$noresultsmessage.'</p>';
// otherwise display the results message and replace the placeholders
// with the real data
} else {
$resultsmessage = str_replace('$nb_start',$nb_start+1,$resultsmessage);
$end = $all >$nb_start+ $nb_count ? $nb_start+ $nb_count : $all;
$resultsmessage = str_replace('$end',$end,$resultsmessage);
$resultsmessage = str_replace('$all',$all,$resultsmessage);
echo '<p id="resultcounter">'.$resultsmessage.'<span style="font-weight: bold"> '.$_GET['q'].'</span></p>';
}
// Nombre d'info par page
$pagination = $nb_count;
// Numéro du 1er enregistrement à lire
$limit_start = ($page - 1) * $pagination;
require("pagination.php");
// Affichage des résultats Web
echo '<p>';
// On boucle sur tous les résultats et on afficher les bonnes données
foreach($results->web->results->result as $resultat){
echo '<li><h2 ><a href="'.$resultat->clickurl.'" target="_blank">'.$resultat->title.'</a></h2><p>'.$resultat->abstract.'<br/>
<span style="color:green;">'.$resultat->dispurl.'</span></p>
</li>';
};
// Fin de l'affichage
echo '</p>';
$results = str_replace("/<term><!\[CDATA\[/",'<term>',$results);
$results = str_replace("/\]\]><\/term>/",'</term>',$results);
// Nb d'enregistrement total
$nb_total = $all;
// Pagination
$nb_pages = ceil($nb_total / $pagination);
// Affichage
echo '<p class="pagination">' . pagination($current_page, $nb_pages, $format_url) . '</p>';
Bon je pense que beaucoup d'entre vous vont avoir les poils qui s'hérisse en voyant mes codes mais bon, je ne peux qu'apprendre (ca c'est sure...).Enfin voilà, en espérant avoir quelques conseils pour me dépatouiller de cette galère, je vous remercie d'avance pour vos retour.
CDT,
Thomas