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 !