8768 sujets

Développement web côté serveur, CMS

Pages :
(reprise du message précédent)

Je comprends pas trop, tu me parles de vider ton panier et ton code permet de retirer un élément Smiley eek

Si tu veux vider le panier totalement tu dois juste reset ton panier comme ça par exemple :

$_SESSION['panier']=array();


Et si tu veux retirer les objets "null" présent dans ton panier tu peux faire quelque chose comme ça :

$save=$_SESSION['panier'];
$_SESSION['panier']=array();
foreach ($save as $objet) if ($objet!=null) $_SESSION['panier'][]=$objet;


CroiSciento a écrit :

du coup quand on appuie pour supprimer le panier l'article ne se supprime pas de suite il faut cliquer une deuxieme fois

Ça veut dire que tu supprimes ton élément après l'avoir affiché Smiley sweatdrop
Du coup ton code est bon, juste mal agencé..

Ce qui donne en mélangeant un peu le tout :


//manipulation pour savoir si on doit vider le panier
if (isset($_POST['vider'])) $_SESSION['panier']=array();

//manipulation pour savoir si on doit retirer un élément
if(isset($_POST['suppr_panier']) {
    $key=htmlentities($_POST['suppr_panier']);
    if(is_numeric($key)) unset($_SESSION['panier'][$key]);
}

//manipulation pour corriger ton problème du : null
$save=$_SESSION['panier'];
$_SESSION['panier']=array();
foreach ($save as $objet) if ($objet!=null) $_SESSION['panier'][]=$objet;

//affichage ton ton panier + boutons
if (isset($_SESSION['panier']) && !empty($_SESSION['panier'])) {
    echo "<h3>Mon panier</h3>";
    foreach ($_SESSION['panier'] as $key=>$val) {
        echo $val[0]." - ".$val[1]." - ".$val[2]."<br>";
        echo '<form action="#" method="POST">';
        echo '<input type="submit" value="Supprimer du panier">';
        echo '<input type="hidden" name="suppr_panier" value="'.$key.'"></br>';
        echo '</form>';
    }
    echo "<br><br>";
}

//affichage du bouton : vider le panier
echo "
<form action='#' method='POST'>
	<input type='hidden' name='vider' />
	<input type='submit' value='Vider le panier' />
</form>";

//et un petit print_r pour vérifier le tout
echo print_r($_SESSION['panier']);


Et pour répondre à ça :
CroiSciento a écrit :

Je ne pense pas que mettre du html en php soit un bonne idée, mais je fais comme je peut. Smiley lol

Pendant ma scolarité on m'a appris à ne pas mélanger les deux pour que ton code reste lisible, pour toi ou les gens qui doivent te lire, c'est du détail comme l'indentation qui permettent de rentre ton code plus propre...

Après si tu préfères lire :

<form action='#' method='POST'>
	<input type='hidden' name='<?php echo $le_nom; ?>' />
	<input type='submit' value='<?php echo $ma_valeur; ?>' />
</form>


que :

echo "
<form action='#' method='POST'>
	<input type='hidden' name='".$le_nom."' />
	<input type='submit' value='".$ma_valeur."' />
</form>";


Je peux plus rien pour toi ! Smiley biggrin
Modifié par Derlys (05 Jun 2014 - 12:06)
Je veux ajouter un bouton qui supprime l'élément en question. Notamment sur la page du panier avec le récapitulatif des articles y'a une option comme : "Retirer cet article du panier". Mais je ne pense pas avoir la bonne méthode étant donné que cela crée un objet "null", il dois avoir une meilleure méthode non?

Je n'avais pas pensé à reset mon tableau, merci. Smiley murf

Edit : Si je reset mon panier de cette manière là, je dois appuyer deux fois pour qu'il supprime totalement l'écho des articles qui étaient précédemment dans le panier.
Modifié par CroiSciento (05 Jun 2014 - 10:37)
J'avais pas fais attention au changement de page, du coup j'ai édit le post en pensant que tu l'avais pas encore vu ! Smiley confused
Donc relis le post ci-dessus et dis moi ce qu'il en est Smiley ravi
Moi non plus à vrai dire j'avais pas vu le changement de page. Smiley sweatdrop

Merci ça marche bien, par contre je n'ai pas trop compris la ligne avec htmlentities et is_numeric, elles servent à quoi concrètement? J'ai regardé leur utilité, mais j'ai pas trop compris pourquoi on n'utilise pas la même méthode que celle pour vider le panier total ?

En ce qui concerne l'écriture, ça ne fais pas si longtemps que je fais de la programmation web (Je faisais un peu de php avant mais rien de si aussi avancé qu'un panier avec des sessions) et les tutos que j'ai suivi notamment ceux sur grafikart (et la doc de wordpress) ils utilisent cette syntaxe et ne créent pas automatiquement une variable.

Autre question, j'aimerais aussi stocker l'image de mon post (ou plutôt l'image thumbnail) dans l'array de session mais je ne sais pas si c'est possible.

 <?php the_post_thumbnail("taxonomy_pic"); ?> 


Je suis arrivé à la stocker dans une variable de tableau le seul problème c'est que pour wordpress cela affiche une affiche, et même en la stockant dans un array et ne pas l'afficher, elle s'affiche quand même donc impossible pour moi de stocker un truc comme <img src="img1.jpg" /> dans un array comme j'ai pu le voir sur internet.

D'ailleurs vu que c'est une image je suppose que il y dois avoir des manipulation à faire puisque ce qui est dans un tableau est un chaine de caractère de ce que j'ai compris.
Modifié par CroiSciento (05 Jun 2014 - 15:02)
Re,

CroiSciento a écrit :

par contre je n'ai pas trop compris la ligne avec htmlentities et is_numeric, elles servent à quoi concrètement? J'ai regardé leur utilité, mais j'ai pas trop compris pourquoi on n'utilise pas la même méthode que celle pour vider le panier total ?


Je l'utilise par habitude.. htmlentities te permet d'être sur que que que tu reçois est bien une interpréter comme un chaine de caractère et non du code HTML. Sans ça tu peux passer <b>Mon objet</b> dans ton $_POST['nom'] par exemple et quand tu vas faire un echo, tu verras : Mon objet en gras..
Ensuite pour le is_numeric ca retourne, true si ce que tu test est un nombre et false sinon, ...
Tu peux probablement utiliser ces méthodes ailleurs si ça te chante Smiley smile

CroiSciento a écrit :

Autre question, j'aimerais aussi stocker l'image de mon post (ou plutôt l'image thumbnail) dans l'array de session mais je ne sais pas si c'est possible.

<?php the_post_thumbnail("taxonomy_pic"); ?>


Je suis arrivé à la stocker dans une variable de tableau le seul problème c'est que pour wordpress cela affiche une affiche, et même en la stockant dans un array et ne pas l'afficher, elle s'affiche quand même donc impossible pour moi de stocker un truc comme <img src="img1.jpg" /> dans un array comme j'ai pu le voir sur internet.

D'ailleurs vu que c'est une image je suppose que il y dois avoir des manipulation à faire puisque ce qui est dans un tableau est un chaine de caractère de ce que j'ai compris.


Je sais pas j'utilise pas wordpress je code tout moi même ^^
Mais tu peux peux pas passer le nom de l'image en POST et l'afficher ?

Exemple :

$_POST['url']=image.jpg
//on suppose que tu as reçu ça en post

echo "<img src='".$_POST['url']."' />";


Je comprends pas pourquoi tu veux passer une image en paramètre mais bon ^^
Je viens de le mettre dans un input hidden et ça fonctionne sauf que dans $_POST ça m'affiche ça :

$_POST['thumbnail'] = 94


Je me doute que ma méthode est mauvaise mais existe t'il un moyen de récupérer l'intégralité du code, il faut utiliser le html entities du coup? :o

Pour avoir un petit compteur du panier, il suffit de faire une boucle qui parcours $_SESSION['panier'] et ajoute $val[2] du coup non?
Dernière chose, existerais t'il un moyen de récupérer le permalien de chaque article, pour quand on clique dessus on arrive
Salut,

CroiSciento a écrit :

Je viens de le mettre dans un input hidden et ça fonctionne sauf que dans $_POST ça m'affiche ça :

$_POST['thumbnail'] = 94


Je me doute que ma méthode est mauvaise mais existe t'il un moyen de récupérer l'intégralité du code, il faut utiliser le html entities du coup? :o

Peut être, je peux pas t'aider pour le coup étant donné que la cause du problème vient de Wordpress..

CroiSciento a écrit :

Pour avoir un petit compteur du panier, il suffit de faire une boucle qui parcours $_SESSION['panier'] et ajoute $val[2] du coup non?

Oui, tout à fait. Tu crée $total=0; et tu fais $total+=$val[2]; dans le foreach.

CroiSciento a écrit :

Dernière chose, existerais t'il un moyen de récupérer le permalien de chaque article, pour quand on clique dessus on arrive

Va falloir être plus précis sur tes intentions. Je ne connais pas la structure de ton site et je sais pas ce que tu veux réellement.

Tu as une page par article ?
Tu veux faire une page qui référence chaque article et que quand tu cliques sur le lien ça t'ouvre la page de l'article ?

Tout ça dépend de la structuration de ton site, je peux pas t'aider si je vois pas a quoi ça ressemble un minimum Smiley biggrin
Modifié par Derlys (06 Jun 2014 - 08:27)
Je suis arrivé en bidouillant à ce que je voulais en manipulant les id de mes articles. Smiley smile

Il me reste un dernier soucis que je pige toujours pas parfois. J'ai mis une valeur $_SESSION['total'] qui s'occupe d'incrémenter à chaque fois et récupère la valeur de tout les articles.

En haut à droite j'ai mon panier avec le petit conteur à droite - header.php

<div class="panier_header">
					<?php echo $_SESSION['total']; ?>
						Mon Panier
					</div>


Si j'ai aucun articles, et que j'ajoute un article au panier rien ne s'affiche dans ma div. Si je reclique dessus ça me met 1 alors que $_SESSION['total'] = 2. J'ai pensé que c'était un problème que j'ai eu un peut plus tôt mais ça n'est pas logique pour moi car plus bas quand je fais un echo de total ça m'affiche bien le nombre, alors pourquoi pas dans ma div? cela pourrais venir que mon code ce situe après le header?

Et si je vide mon panier même si total redeviens null mon compteur en haut à droite s'incrémente. Smiley eek

Voici mon code :
//manipulation pour savoir si on doit vider le panier
if (isset($_POST['vider'])) {
    $_SESSION['panier']=array();
}
//manipulation pour savoir si on doit retirer un élément
if(isset($_POST['suppr_panier']))
{
    $key=htmlentities($_POST['suppr_panier']);
    if(is_numeric($key)) unset($_SESSION['panier'][$key]);
}
if(empty($_SESSION['panier'])) {
    echo "le panier est vide";
    $_SESSION['total']=null;
}
//affichage du panier + boutons
if (isset($_SESSION['panier']) && !empty($_SESSION['panier'])) {
    echo "<h3>Mon panier</h3>";
    $_SESSION['total'] = 0;
    foreach ($_SESSION['panier'] as $key=>$val) {
        echo "<a href=".$val[4]."/>".$val[0]."</a> - ".$val[1]." - ".$val[2]." - ".$val[3]." - ".get_the_post_thumbnail($val[5])."</br>";
        $_SESSION['total'] += $val[2];
        echo '<form action="#" method="POST">';
        echo '<input type="submit" value="Supprimer du panier">';
        echo '<input type="hidden" name="suppr_panier" value="'.$key.'"></br>';
        echo '</form>';
    }
    echo $_SESSION['total'];
    echo "<br><br>";
}
Il faut que tu respect cet ordre :

1 : Manipulation
2 : Affichage


Autrement dit, si tu veux un affichage dans un header.php ou je ne sais quel fichier.
Tu dois avoir une "manipulation" avant qui te permet d'avoir les données correctes à afficher.

Là, tu fais :

1 : Affichage de la valeur de la variable total dans la session
echo $_SESSION['total']; // on dit que c'est égal à 1 

2 : Cacul de la valeur de la variable total dans la session
foreach ($_SESSION['panier'] as $key=>$val) { 
   [...];
   $_SESSION['total'] += $val[2];
} // fianalement ta valeur change, et ton total = 2

3 : Affichage de la valeur de la variable total dans la session
echo $_SESSION['total']; // et donc tu vois : 2 ici


Ensuite tu ajoutes un article au panier. Et tu refais :

1 : Affichage de la valeur de la variable total dans la session
echo $_SESSION['total']; // égal à 2 

2 : Cacul de la valeur de la variable total dans la session
foreach ($_SESSION['panier'] as $key=>$val) { 
   [...];
   $_SESSION['total'] += $val[2];
} // ta ajouter un objet donc ta valeur change, et ton total = 3

3 : Affichage de la valeur de la variable total dans la session
echo $_SESSION['total']; // et donc tu vois : 3 ici


Voilà Smiley cligne

Essaye d'analyser un peu ton code et de faire le "robot". List ton code et analyse l'état des variables. Sa valeur à différentes étapes, ce que ça doit te faire réellement. Tu aurais pu trouver la solution à ce problème seul étant donné que je t'ai déjà corrigé un problème similaire quelques posts précédents.. Smiley rolleyes

Je dis ça pour ton bien Smiley smile
Modifié par Derlys (06 Jun 2014 - 12:47)
Oui, je n'étais pas sur que mon problème vienne de là, mais bon je pense que j'ai compris maintenant. Smiley lol

Calcul, avant affichage.
J'ai résolu mes soucis, mais maintenant je veux ajouter un compteur + et - à coté de chaque article pour influencer sur la quantité voulue.

J'ai essayé différente méthode, une notamment en regardant avec le isset de $_POST mais ça ne fonctionne pas car. J'ai aussi essayé de reprendre ta logique avec quand il y a un article avec le même prix et même nom pour seulement incrémenter l'article en question mais quand je fais une boucle foreach :

foreach($_SESSION['panier'] as key=>$val) {
            $_SESSION['panier'][$key][2]++;
}


Cela m'incrémente toutes mes valeurs alors que j'avais compris que ces lignes :

foreach($_SESSION['panier'] as $key=>$val) { //on regarde chaque objet
                if ($val[0] == $reception_nom && $val[1] == $reception_prix) { // Si on trouve un objet avec le même nom et le même prix
                    $existe=true; //on indique qu'il existe
                    $_SESSION['panier'][$key][2]++; //on incrémente la quantité de 1 ($key correspond a l'id de l'objet, on doit modifier la valeur dans la session et non dans le foreach)
                }


Permettaient justement de ne cibler que ma première valeur. (Ce que je n'avais pas compris car pour moi elle parcours tout le tableau alors il est vrai que je n'avais pas pigé comment elle faisait pour cibler seulement le premier élément).

J'y suis depuis 13h30 et je t'avoue que je commence à être perdu, c'est la première fois que je me plonge dans quelque chose d'aussi avancé en php. Smiley rolleyes .

Voici mon code :

//manipulation pour savoir si on doit vider le panier
if (isset($_POST['vider'])) {
    $_SESSION['panier']=array();
}
//manipulation pour savoir si on doit retirer un élément
if(isset($_POST['suppr_panier']))
{
    $key=htmlentities($_POST['suppr_panier']);
    if(is_numeric($key)) unset($_SESSION['panier'][$key]);
}
// Si le panier est vide alors session de total est vide
if(empty($_SESSION['panier'])) {
    $_SESSION['total']=null;
}
// Si le panier est défini et n'est pas vide alors on met le compteur à 0, et ensuite on lui dis qu'il est égal aux valeurs ajouté de prix dans notre tableau de session
if (isset($_SESSION['panier']) && !empty($_SESSION['panier'])) {
    $_SESSION['total'] = 0;
    foreach ($_SESSION['panier'] as $key=>$val) {
        $_SESSION['total'] += $val[2];
}
}

//manipulation pour savoir si on doit vider le panier
if (isset($_POST['vider'])) $_SESSION['panier']=array();

//manipulation pour savoir si on doit retirer un élément
if(isset($_POST['suppr_panier']))
{
    $key=htmlentities($_POST['suppr_panier']);
    if(is_numeric($key)) unset($_SESSION['panier'][$key]);
}
if(empty($_SESSION['panier'])) echo "le panier est vide"; {
//affichage du panier + boutons
if (isset($_SESSION['panier']) && !empty($_SESSION['panier'])) {
    $total = 0;
    foreach ($_SESSION['panier'] as $key=>$val) {
        echo '<div class="panier_article">';
            echo "<a href=".$val[4]."/>".$val[0]."</a><span>".$val[1]*$val[2]."€</span>";
            echo get_the_post_thumbnail($val[5])."<br>";
            echo $val[3];
            echo '<form action="#" method="POST" id="modify_count">';
                echo '<input type="submit" name="moins" value="-">';
                echo '<input type="hidden" name="id" value="'.$key.'">';
                echo $val[2];
                echo '<input type="submit" name="plus" value="+">';
                echo '<input type="hidden" name="id" value="'.$key.'">';
            echo '</form>';
            echo '<form action="#" method="POST" id="delete_article">';
                echo '<input type="submit" value="Supprimer du panier">';
                echo '<input type="hidden" name="suppr_panier" value="'.$key.'"></br>';
            echo '</form>';
        echo '</div>';

    }
}
}


Merci de ton aide, je ne te demande pas de me donner la réponse car je sais que c'est long de refaire du code (et ce n'est pas ce qui m'apprendra le plus) mais pourrais tu me mettre sur la voie afin de résoudre mon problème? J'ai surement compris quelque chose de travers...

D'ailleurs maintenant que j'y pense c'est quoi la différence entre $_SESSION['panier'][$key][2] par ex et $val[2]? Car à un moment tu met cette ligne :

$_SESSION['panier'][$key][2]++; //on incrémente la quantité de 1 ($key correspond a l'id de l'objet, on doit modifier la valeur dans la session et non dans le foreach)


Ce n'est pas justement censé être pareil? Smiley confus
Hey salut, désolé pour le retard, weekend un peu chargé..

J'ai choisis de passer par l'envoie en mode POST avec un input de type submit mais tu peux faire quelque chose de similaire très facilement en mode GET avec des liens si tu préfères.

Cadeau Smiley ravi :

//calcul
if (isset($_POST) && !empty($_POST)) {
	if (isset($_POST['inc']) &&  is_numeric($_POST['inc'])) $_SESSION['panier'][$_POST['inc']][2]++;
	if (isset($_POST['dec']) &&  is_numeric($_POST['dec'])) $_SESSION['panier'][$_POST['dec']][2]--;
}


//affichage
if (isset($_SESSION['panier']) && !empty($_SESSION['panier'])) {
    echo "<h3>Mon panier avec le + et le -</h3>";
    foreach ($_SESSION['panier'] as $key=>$val) {
        echo $val[0]." - ".$val[1]." - ".$val[2]."<br>";
        echo "
        <form method='post'>
        	<input type='hidden' name='inc' value='".$key."' />
        	<input type='submit' value='+' />
        </form>
        "; //incrémentation, le +
        echo "
        <form method='post'>
        	<input type='hidden' name='dec' value='".$key."' />
        	<input type='submit' value='-' />
        </form>
        "; //décrémentation, le -
    }
    echo "<br><br>";
}


Je sais que tu voulais pas la solution, mais bon c'était rapide a faire alors... Je te conseil de suivre les cours proposés sur internet pour comprendre un peu mieux le php Smiley smile

Et pour répondre à ta question, le $val existe uniquement quand tu te situes dans le foreach. Donc tu peux accéder à tes information en utilisant cette variable mais tu peux pas modifier la session par elle.. C'est juste une copie si tu préfères.

Donc par exemple :

//ici $val=null car elle n'existe pas
foreach ($_SESSION['panier'] as $key=>$val)  {
    // ici comme tu le sais $val=$_SESSION['panier'][n]
    // mais si tu veux changer une information sur ta session, c'est sur $_SESSION qu'il faut agir car $val n'est qu'une simple copie qui va finir par disparaitre :O !
}
//ici $val=null car elle n'existe pas, supprimé a la fin du foreach


Voilà, c'est pourquoi on fait :

$_SESSION['panier'][$key][2]++;


et pas :

$val[2]++;


Et si tu veux tester, rien t'en empêche !
Tu fais quelque chose comme ça :

foreach ($_SESSION['panier'] as $key=>$val)  {
     echo "La valeur de VAL avant l'incrémentation de VAL : ".$val[2]."<br>";
     $val[2]++;
     echo "La valeur de VAL après l'incrémentation de VAL : ".$val[2]."<br>";

     echo "La valeur de SESSION PANIER avant l'incrémentation de SESSION PANIER : ". $_SESSION['panier'][$key][2]."<br>"; // ici tu verras que la valeur n'a pas changé alors que tu avais incrémenté par val[2] ci-dessus..
     $_SESSION['panier'][$key][2]++;
     echo "La valeur de SESSION PANIER après l'incrémentation de SESSION PANIER : ". $_SESSION['panier'][$key][2]."<br>";
}


Et tu verras ! Smiley biggrin
Modifié par Derlys (10 Jun 2014 - 09:37)
Pages :