Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > XML > SimpleXML
SimpleXML Forum d'entraide pour l'extension SimpleXML, qui permet de manipuler des documents XML en PHP (approche DOM).
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 18/11/2011, 21h45   #1
Invité de passage
 
pat ludo
Inscription : novembre 2009
Messages : 29
Détails du profil
Informations personnelles :
Nom : pat ludo

Informations forums :
Inscription : novembre 2009
Messages : 29
Points : 0
Points : 0
Par défaut afficher en fonction d'un prix maximun

Bonjour,

Je cherche à afficher une liste de produits en fonction d'un prix maximum
je suis donc passé par la boucle foreach en fixant un prix maxi, le problème c'est que j'affiche avec une pagination de 10 produits par page donc sur une page je me retrouve avec 5 produits puis sur une autre 8, 6, au lieu de 10 etc., bref imprésentable. Donc y'a 'il un moyen de faire une requête directe fixant un prix maxi de 100 euros, à partir de $liste, par exemple n'ayant pas trouvé d'exemple, je coince sur le sujet !

merci par avance de votre aide !
manuso

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
 
$document = simplexml_load_file('http://test.com/export/'); 
define('NB_PAR_PAGE', 10); 
 
if (isset($_GET['ob'])) { $objet=$_GET['ob']; } else {$objet = "";} 	// On récupère la ville
 
$page = isset($_GET['page']) ? intval($_GET['page']) : 1;  	// Recuperer le n° de page ou on est pagination 
 
 $liste = $document->xpath(utf8_encode("//products/product[fields/_POSTCODE=\"$city\"]"));
 
$count = count($liste);
$debut_pos = ($page - 1) * NB_PAR_PAGE;
$fin_pos = $page * NB_PAR_PAGE + 1;	
$derniere_page = ceil($count / NB_PAR_PAGE);
$produits = array_slice($liste, $debut_pos, NB_PAR_PAGE);
 
// print_r($produits);
 
$cpt = 1; 
foreach ($produits as $produit) { if ($cpt == "10") break; 
 
$prixproduit = utf8_decode((string) $produit->price);
 
// Si le prix est inferieur à 100 euros on affiche
$maxi="100.00";
 
if ($prixproduit<$maxi) {
 
echo'
<p>'. utf8_decode($produit->name) .'</p><
<p>'. utf8_decode($produit->price) .'</p>
 }
 
$cpt++; 
 }
manuso est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2011, 10h15   #2
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 823
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

Informations professionnelles :
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2005
Messages : 2 823
Points : 3 454
Points : 3 454
Citation:
y'a 'il un moyen de faire une requête directe fixant un prix maxi de 100 euros
A faire sur le XPath :

//products/product[fields/_POSTCODE="$city" and price <= 100]
__________________
Un problème exposé clairement est déjà à moitié résolu
Keep It Smart and Simple
Séb. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2011, 11h22   #3
Invité de passage
 
pat ludo
Inscription : novembre 2009
Messages : 29
Détails du profil
Informations personnelles :
Nom : pat ludo

Informations forums :
Inscription : novembre 2009
Messages : 29
Points : 0
Points : 0
Citation:
Envoyé par Séb. Voir le message
A faire sur le XPath :

//products/product[fields/_POSTCODE="$city" and price <= 100]
Merci Seb, c'est parfait

j'ai le même souci avec les doublons, j'ai parfois le même produit avec les mêmes descriptions logique mais des prix différents,
mon ojectif garder à l'affichage uniquement un produit unique avec un seul prix.
Donc dans mon cas, la solution ci-dessous ne conviens pas, je teste $description dans mon tableau intermédiaire
si le contenu existe je vide ma variable $description fonctionne très bien, mais je reste avec tous mes produits identiques à prix différents. Deuxièmement, si je vide toutes les autres variables, je me retrouve avec des pages à 3, 6,8 produits puisque j'ai ma pagination.

Donc est ce qu'il est possible d'imaginer une requête xpath ou un arrêt unique à ce niveau, qui puisse apporter une solution, donc des pages avec 10 produits et des doublons supprimés ?

merci

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
 
$document = simplexml_load_file('http://test.com/export/'); 
define('NB_PAR_PAGE', 10); 
 
if (isset($_GET['ob'])) { $objet=$_GET['ob']; } else {$objet = "";} 	// On récupère la ville
 
$page = isset($_GET['page']) ? intval($_GET['page']) : 1;  	// Recuperer le n° de page ou on est pagination 
 
 $liste = $document->xpath(utf8_encode("//products/product[fields/_POSTCODE=\"$city\"]"));
 
$count = count($liste);
$debut_pos = ($page - 1) * NB_PAR_PAGE;
$fin_pos = $page * NB_PAR_PAGE + 1;	
$derniere_page = ceil($count / NB_PAR_PAGE);
$produits = array_slice($liste, $debut_pos, NB_PAR_PAGE);
 
// print_r($produits);
 
$cpt = 1; 
 
// initialisation du tableau intermediaire
$tab_desc = array();
 
foreach ($produits as $produit) { if ($cpt == "10") break; 
 
$description = utf8_decode((string) $produit->description);
 
// TEST
if (!in_array($description,$tab_desc))
{
$description = $description;
array_push($tab_desc,$description);
}
else
{
//sinon on vide la variable description
$description = "";
}
 
echo'
<p>'. utf8_decode($produit->name) .'</p>
<p>'. $description .'</p>
<p>'. utf8_decode($produit->price) .'</p>
 }
 
$cpt++; 
 }  
 
XML
- <products>
- <product>
  <name></name> 
  <productUrl></productUrl> 
  <imageUrl></imageUrl> 
  <description></description> 
  <price></price> 
- <fields>
  <EQUIPEMENTS></EQUIPEMENTS> 
  <_POSTCODE></_POSTCODE> 
  </fields>
  </product>
- <product>
manuso est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2011, 11h56   #4
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 823
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

Informations professionnelles :
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2005
Messages : 2 823
Points : 3 454
Points : 3 454
Donne un extrait significatif et valide du XML source.
__________________
Un problème exposé clairement est déjà à moitié résolu
Keep It Smart and Simple
Séb. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2011, 16h43   #5
Invité de passage
 
pat ludo
Inscription : novembre 2009
Messages : 29
Détails du profil
Informations personnelles :
Nom : pat ludo

Informations forums :
Inscription : novembre 2009
Messages : 29
Points : 0
Points : 0
Citation:
Envoyé par Séb. Voir le message
Donne un extrait significatif et valide du XML source.

Bon

Pou faciliter la compréhension du probleme j'ai mis un fichier xML
classique valide XML sur internet.

J'ai un peu modifié le code je teste $description dans mon tableau intermédiaire si le contenu existe déjà , j'affiche pas les produits sinon j'affiche, simple rest que c'est la pagaille avec la pagination car $count
n'est pas bon.
Avec le code ci-dessous donc on supprime
les doublons mais par page, ensuite on constate avec la pagination
page1 7 affichages et 3 doublons
page2 6 affichages et 4 doublons
page3 3 affichages

Au total 23 résultats, sans les doublons 16, donc comment calculer ($count) 16 et non pas 23 résultats pour modifier la pagination et obtenir page1=10 produits et page2=6 produits.
En ce qui qui concerne la suppression des doublons, il y a peut-être une meilleure solution, un produit identique en pag1 et 3 n'est pas supprimé, peut-on faire un classement par <name> ce qui permet alors de supprimer l'ensemble des doublons !

merci,

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
 
<?php  
 
// evidemment rajouter http://
 
$document = simplexml_load_file('pf.tradedoubler.com/export/export?myFeed=1321483955566130&myFormat=1321483955566130'); // SKI
 
define('NB_PAR_PAGE', 10); 
 
if (isset($_GET['ob'])) { $objet=$_GET['ob']; } else {$objet = "";} 	// On récupère la ville
 
$city="74110"; //code postale
 
$liste = $document->xpath(utf8_encode("//products/product[fields/_POSTCODE=\"$city\"]")); 
 
$page = isset($_GET['page']) ? intval($_GET['page']) : 1;  	// Recuperer le n° de page ou on est pagination 
 
$count = count($liste);
$debut_pos = ($page - 1) * NB_PAR_PAGE;
$fin_pos = $page * NB_PAR_PAGE + 1;	
$derniere_page = ceil($count / NB_PAR_PAGE);
$produits = array_slice($liste, $debut_pos, NB_PAR_PAGE);
 
// NBRE DE PRODUITS
echo "<p>$count -  resultat</p>";
 
$cpt = 1; 
// TABEAU INTERMEDIAIRE
 
$tab_desc = array();
foreach ($produits as $produit) { 
 
$description = utf8_decode((string) $produit->description);
 
// ON TESTE
if (!in_array($description,$tab_desc))
{
$description = $description;
array_push($tab_desc,$description);
 
// 
$phrase=explode(". ", $description);
$texte="$phrase[1]."; // 
$max=340; 
 if(strlen($texte)>$max){$texte=substr($texte,0,$max); $espace=strrpos($texte," "); $texte=substr($texte,0,$espace)." ..."; 
}
 
echo'
<p>'. utf8_decode($produit->name) .'</p>
<br />
<p>'. utf8_decode($produit->price) .' &euro; </p>
<p>'. $texte .'</p>
';
 
}
else
{
//sinon on affiche pas
echo'<p>DOUBLON</p>';
}
 
// }
$cpt++; 
 }
?>
 
 
<?
/*     *	     *    DEBUT  PAGINATION   *      * 	   *       *     	*/
$x="hebergement-vacances-";
 
  echo'<br /><div class="pagination">';
     if ($page > 1) {  
      //  echo '<div class="prev"><a href="' . basename(__FILE__) . '?page=' . ($page - 1) . '">Pr&eacute;c.</a></div>';
         echo '<div class="prev"><a href=" ' .$x. ''.$objet.'-' . ($page - 1) . '.htm">Pr&eacute;c.</a></div>'; 
    }  else {  echo '<span class="current next">Pr&eacute;c.</span>';   } 
 
 //   for ($i = 1; $i <= $derniere_page; $i++) { 
if($page > 5) { $d = $page - 5; } else {$d = 1;} //
 if($page > $derniere_page) { $f = $page + 5; } else {$f = $derniere_page;}  
   for ($i = $d; $i <= $f; $i++) {
        if ($i == $page) {
            echo '<span class="current">' . $i . '</span>';
        } else { if ($i > $page + 5) break;
      //    echo ' <a href="' . basename(__FILE__) . '?page=' . $i . '"> ' . $i . ' </a> ';
	 	 echo ' <a href="' .$x. ''.$objet.'-' . $i . '.htm"> ' . $i . ' </a> '; 
        }  
    }
    if ($page < $derniere_page) {
    //    echo '<div class="next"></div>';
 echo '<div class="next"><a href=" ' .$x. ''.$objet.'-' . ($page + 1) . '.htm">Suiv.</a></div>'; 
    } else {  echo '<span class="current next">Suiv.</span>';   }   
?>
manuso est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h23.


 
 
 
 
Partenaires

Hébergement Web