4 votes

Comment puis-je changer le prix d'origine sur la page produit d'OpenCart ?

Sans utiliser le panneau d'administration. Je souhaite pouvoir changer le prix d'un article dans OpenCart sur la page du produit.

En gros, j'ai une Option appelée Sur mesure: qui est un champ de texte. Si le client entre quelque chose ici, je veux pouvoir changer le prix, ce que je fais déjà via jQuery, puis je veux que ce nouveau champ caché avec le prix remplace le prix du panier pour cette commande client

Est-ce possible? Y a-t-il une extension où je peux permettre au client d'entrer son propre prix, puis je pourrais cacher ce champ et mettre à jour via jQuery, etc.

Cela fait référence à d'autres publications Utilisation d'un champ de prix alternatif dans OpenCart et aussi à propos de ce lien de modèle http://forum.opencart.com/viewtopic.php?t=36052 qui montre où se trouvent les principales fonctions oop, mais c'est assez compliqué à faire là-bas

6voto

shadyyx Points 10163

D'accord, pour vous orienter dans la bonne direction, voici comment je ferais cela :

1. Rendu de l'input caché
Comme vous le savez peut-être, dans un fichier catalog/view/theme/default/template/product/product.php, il y a une requête AJAX pour ajouter un produit au panier :

$('#button-cart').bind('click', function() {
    $.ajax({
        url: 'index.php?route=checkout/cart/add',
        type: 'post',
        data: $('.product-info input[type=\'text\'], .product-info input[type=\'hidden\'], .product-info input[type=\'radio\']:checked, .product-info input[type=\'checkbox\']:checked, .product-info select, .product-info textarea'),
        dataType: 'json',
                // ...
        });
});

Si vous regardez le paramètre data, vous verrez que tous les inputs, selects, textareas, etc. présents dans une div .product-info sont populés et envoyés à PHP.

Par conséquent, je rendrais l'input caché avec la valeur de prix personnalisée dans cette div .product-info afin de ne pas avoir à modifier du tout la requête AJAX. Disons que le nom de cet input sera custom_price.

2. L'ajout au panier
Ouvrez le fichier catalog/controller/checkout/cart.php et recherchez la méthode add. C'est là que toute la magie devrait opérer. Après cette partie de code :

            if (isset($this->request->post['option'])) {
                $option = array_filter($this->request->post['option']);
            } else {
                $option = array();  
            }

J'ajouterais ceci :

            if(isset($this->request->post['custom_price']) && $this->isCustomPriceValid($this->request->post['custom_price'])) {
                $custom_price = $this->request->post['custom_price'];
            } else {
                $custom_price = false;
            }

Implémentez la méthode isCustomPriceValid() pour répondre à vos besoins... et passez à la dernière modification ici - changez cette ligne :

$this->cart->add($this->request->post['product_id'], $quantity, $option);

à :

$this->cart->add($this->request->post['product_id'], $quantity, $option, $custom_price);

3. Le panier
Maintenant, ouvrez ce fichier : system/library/cart.php et recherchez à nouveau la méthode add. Vous devriez modifier la définition de la méthode comme ceci :

public function add($product_id, $qty = 1, $option = array(), $custom_price = false) {

Avant la dernière ligne de code dans cette méthode, ajoutez une autre ligne :
(ce code a été modifié en raison du commentaire de l'intervenant)

    // ...

    if($custom_price) {
        if(!isset($this->session->data['cart']['custom_price'])) {
            $this->session->data['cart']['custom_price'] = array();
        }

        $this->session->data['cart']['custom_price'][$key] = $custom_price;
    }

    $this->data = array(); // <- dernière ligne
}

La dernière modification devrait être dans la méthode getProducts() car celle-ci charge toutes les données de la base de données et les transmet à d'autres contrôleurs à des fins d'affichage.

Je ne sais pas si votre prix personnalisé devrait remplacer le prix + le prix des options ou seulement le prix, donc j'opterais pour la deuxième option car elle est plus descriptive et la première pourrait être facilement déduite de mon exemple.

Cherchez la ligne

$price = $product_query->row['price'];

et ajoutez juste après

if(isset($this->session->data['cart']['custom_price'][$key])) {
    $price = $this->session->data['cart']['custom_price'][$key];
}

Le prix devrait maintenant être remplacé par le prix personnalisé. Vérifiez ensuite que le prix du produit est défini plus tard comme suit :

$this->data[$key] = array(
    // ...
    'price'           => ($price + $option_price),
    // ...              
);

Donc si vous souhaitez remplacer tout le prix par le prix personnalisé, ajoutez cette condition juste après ce tableau comme ceci (plutôt qu'après $price = ...;):

if(isset($this->session->data['cart']['custom_price'][$key])) {
    $this->data[$key]['price'] = $this->session->data['cart']['custom_price'][$key];
}

C'est tout. Je n'ai pas testé le code, il peut fonctionner ou pas avec de légères modifications. J'ai travaillé avec OC 1.5.5.1. Cela devrait simplement vous orienter dans la bonne direction (en croyant que la fin n'est pas si loin).

Bonne continuation !

2voto

user2181630 Points 21

-"Cela ne devrait vous orienter que dans la bonne direction (tout en croyant que la fin n'est pas si loin). via @shadyyx"

Je vous remercie @shadyyx - pour avoir montré la bonne approche... J'ai réussi à faire fonctionner et voici comment:

if(isset($this->session->data['cart']['custom_price'][$key])) {
    $this->data[$key]['price'] = $this->session->data['cart']['custom_price'][$key];
} 

devrait être :

if(isset($this->session->data['custom_price'][$key])) {
    $this->data[$key]['price'] = $this->session->data['custom_price'][$key];
}

Merci encore et j'espère que cela sera utile à quelqu'un.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X