Bonjour tout le monde! (dsl je suis pas sur que j'ai écris mon post comme il faut dans le forum.)
j'ai suivie 2 ou 3 tuto du site pour arriver a mon resultat mais la j'ai vreaiment besoin d'aide.

J'explique men problème.

Je veux récupérer la quantité entré dans un input de type "text" de ma page mods.php. et faire en sorte que cette quantité soit afficher dans ma page panier.php. Quand je clique sur le lien "<a>" ca ajoute 1 item automatiquement dans panier.php mais si j'utilise l'input ca ajoute quand même juste 1 au panier. Je veux que la quantité soit envoyé vers le panier via le lien "<a>" et non par un submit(si possible bien sur). on ma dit que avec jquery on pouvait.

voici le code de la page mods.php

<?php require 'header.php'; ?>
<?php
if($_SESSION['admin'] != 0){
require 'menu_modif_admin.php';
}

?>

<?php $products = $DB->query('SELECT * FROM products WHERE type = "Mods" ORDER BY provider');
?>

            <?php foreach ($products as $product ): ?>
                <form method="post" action="panier.php">
                <div class="box">
                    <div class="element">
                        <?= $product->name; ?>
                    </div>
                    <div class="element">
                        <?= $product->provider; ?>
                    </div>
                <input class="add addQnt element" type="text" name="panier[quantity][<?= $product->id; ?>]"   min="0" />
                <a class="add addPanier element" href="addpanier.php?id=<?= $product->id; ?>"><img src="images/fleche.png" height="30px" /></a>

</div>
                <?php endforeach ?>

                    <input type="submit" name="ajouter" value="Ajouter">
</form>

<?php require 'footer.php'; ?>

Ensuite nous avons le code de panier.php

<?php require 'header.php'; ?>
<h3>Mods</h3>
<section class="mods">
<?php
$ids = array_keys($_SESSION['panier']);
if(empty($ids)){
$products = array();

}else{
    $products = $DB->query('SELECT * FROM products  WHERE id IN ('.implode(',', $ids ).') ORDER BY type') ;
}

?>
<form method="post" action="">
<?php
    foreach($products as $product):

?>

    <div class="box">
        <span class="element">
            <?= $product->name; ?>
        </span>

        <span class="element">
            <?= $product->provider; ?>
        </span>
        <span class="element">
            <?= $product->type; ?>
        </span>
        <input class="quantity element" type="text" name="panier[quantity][<?= $product->id; ?>]"   value="<?= $_SESSION['panier'][$product->id]; ?>" />

        <a href="panier.php?delPanier=<?= $product->id; ?>"><img src="images/supp.png" height="15px" /></a>
    </div>

<?php endforeach ?>
<textarea name="commentaire" id="commentaire" placeholder="Écrire ce qu'il manque dans la liste de commande ici !" rows="5" ></textarea>
<button type='submit' name='update' >Mise à jour !</button>
<button type='submit' formaction="panier_post.php">Passer commande !</button>
</form>

</section>

<?php require 'footer.php'; ?>
si ca peux aider le code de panier.class.php

<?php
class panier{

private $DB;

public function __construct($DB){

    if(!isset($_SESSION)){
        session_start();
    }
    if(!isset($_SESSION['panier'])){
        $_SESSION['panier'] = array();
    }
    if(isset($_GET['delPanier'])){
        $this->del($_GET['delPanier']);
    }
    if(isset($_POST['panier']['quantity'])){
        $this->calc();
    }
}

public function setFlash($message){
    $_SESSION['flash'] = $message;
}

public function flash(){
    if(isset($_SESSION['flash'])){
        ?>
        <div id="alert" class="alert">
            <?= $_SESSION['flash']; ?>
        </div>
        <?php
        unset($_SESSION['flash']);
    }
}

public function calc(){

        $_SESSION['panier'] = $_POST['panier']['quantity'] ;

}

public function count(){
    return array_sum($_SESSION['panier']);
}
public function add($product_id){
    if(isset($_SESSION['panier'][$product_id])){
        $_SESSION['panier'][$product_id] ++;
    }else{
        $_SESSION['panier'][$product_id] = 1;
    }

}
public function del($product_id){
    unset($_SESSION['panier'][$product_id]);
}

}
et pour finir si jamais on peut recuprer en jquery voici le code que j'ai deja pour pouvoir afficher un message flash. app.js

(function($){

$('.addPanier').click(function(event){
    event.preventDefault();
    $.get($(this).attr('href'),{},function(data){
        if(data.error)
        {
            alert(data.message);
        }
        else
        {

            $('#count').empty().append(data.count);
            var alert = $('#alert');
            if(alert.length >0 )
            {
                alert.hide().slideDown(500).delay(3000).slideUp();
            }      

        }
    },'json');
    return false;
});

})(jQuery);
Si quelqu'un peut m'aider cela serait apprécier car je bloque dessus ce problème depuis déjà 1 semaine et demi :D

et j'ai falli oublier peut-etre que cela peux etre utile aussi:addpanier.php

<?php
require '_header.php';
$json = array('error' => true);
if(isset($_GET['id'])){
$product = $DB->query('SELECT id FROM products WHERE id=:id', array('id' => $_GET['id']));
if(empty($product)){
$json['message'] = "Ce produit n'existe pas! Veuillez en choisir un autre.";
}
$panier->add($product[0]->id);
$json['error'] = false;
$json['count'] = $panier->count();
$json['message'] = 'Le produit a été ajouté! ';
}else{
$json['message'] = "Vous n'avez pas sélectionné de produit à ajouter au panier!";
}

echo json_encode($json);

Bref si quelqu'un peux m'aide je lui dit mille fois merci.

7 réponses


Bonjour,

Premièrement je te conseil dans ce cas d'utiliser un input de type number en précisant tout ce qu'il faut...
Secondo : oui tu peut le faire en JS/jQuery en ajoutant un eventListener par exmple :

var el = document.querySelector('input[type="number"].addPanier)

el.addEventListener('change', function(e) {
    //Ici ta fonction pour envoyer en AJAX
})

Bonjour JeremieMeunier,
Merci pour ta reponse mais je ne connais pas du tout AJAX donc est ce que tu pourais eclairer ma lanterne svp :D

AJAX permet d'envoyer des données de manière asynchrone, ce qui, sur une boutique par exemple, permet d'éviter à l'utilisateur de se balader par d'autres page pour ajouter un produit. Plus d'infos MDN ou Grafikart pour la version en jQuery

Tu souhaites recharger la page lors de l'ajout d'une quantité ou pas ?
Car je ne vois pas pourquoi tu utilises un lien dans un formulaire, le lien ne va pas lancer de submit.

Si tu souhaites mettre à jour le panier sans rechargement de la page il faut utiliser de l'ajax.
Dans ce cas tu peux faire comme ça par exemple :

<form method="POST" action="" onsubmit="event.preventDefault(); addQuantity(this);">
    <input type="text" name="quantite">
    <button type="submit">Ajout</button>
</form>

et dans le js

function addQuantity(form) {
    var data = $(form).serialize();

    $.ajax({
        url:"add_quantite.php",
        method:"post",
        data: data,
        success: function() {
            // mettre à jour la quantité sur le front éventuellement
        }, 
    })
}

Avec le onsubmit et preventDefault() cela annule le rechargement de la page et tu peux faire ta fonction en php dans le script add_quantite.php.
De cette manière tu récupères un $_POST dans le script php.

Enfaite j'aimerais que la page agis de la même facon qu'avec le lien quand je clique dessus. la page ne change pas mais la quantité est ajouté au panier a coup de 1 article. moi je veux que si j'entre de je veux 6 article qu'il entre 6 article et non juste 1.

le lien est effectivement dans un form car je suis oubliger d'avoir un form pour l'input text (peut-etre je me trompe aussi) mais jaimerais me passé du bouton submit. la il est la car je fait des experiences a savoir comment régler mon probleme.

Ceci pourrait t'aider !

c'est exactement le tuto que j'ai suivi pour faire mon site :)