OK, pour vous orienter dans la bonne direction, voici comment je procéderais :
Comme vous le savez peut-être, dans un catalog/view/theme/default/template/product/product.php
il y a une requête AJAX pour ajouter un produit dans le 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 les data
paramètre Vous verrez que toutes les entrées, sélections, zones de texte, etc. présentes dans un .product-info
div sont remplis et publiés sur PHP.
Par conséquent, je rendrais l'entrée masquée avec une valeur de prix personnalisée dans ce .product-info
div pour ne pas avoir à modifier du tout la requête AJAX. Disons que le nom de cette entrée sera custom_price
.
checkout/cart/add
Ouvrez catalog/controller/checkout/cart.php
et recherchez add
méthode. Ici, toute la magie devrait être faite. 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émenter le isCustomPriceValid()
méthode pour répondre à vos exigences... et passez à la dernière modification ici - modifiez cette ligne :
$this->cart->add($this->request->post['product_id'], $quantity, $option);
à :
$this->cart->add($this->request->post['product_id'], $quantity, $option, $custom_price);
Maintenant, ouvrez ce fichier :system/library/cart.php
et recherchez à nouveau le add
méthode. Vous auriez à changer la définition de la méthode en celle-ci :
public function add($product_id, $qty = 1, $option = array(), $custom_price = false) {
Avant la dernière ligne de code dans cette méthode, ajoutez-en une autre :
(ce code a été modifié en raison du commentaire de l'OP)
// ...
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(); // <- last line
}
La dernière modification doit être dans la méthode getProducts()
car celui-ci charge toutes les données de la base de données et les transmet à d'autres contrôleurs à des fins d'affichage.
Maintenant, je ne sais pas si votre prix personnalisé doit écraser le prix + le prix des options ou seulement le prix, donc le prix des options y sera ajouté, donc je m'en tiendrai au deuxième choix car il est plus descriptif et le premier choix pourrait être facilement dérivé de mon exemple.
Rechercher la ligne
$price = $product_query->row['price'];
et juste après ajouter
if(isset($this->session->data['cart']['custom_price'][$key])) {
$price = $this->session->data['cart']['custom_price'][$key];
}
Maintenant, le prix doit être remplacé par celui personnalisé. Vérifiez en outre que le prix du produit est défini ultérieurement comme :
$this->data[$key] = array(
// ...
'price' => ($price + $option_price),
// ...
);
Donc, si vous souhaitez écraser tout le prix avec le prix personnalisé, ajoutez cette condition juste après ce tableau comme celui-ci (au lieu d'après $price = ...;
):
if(isset($this->session->data['cart']['custom_price'][$key])) {
$this->data[$key]['price'] = $this->session->data['cart']['custom_price'][$key];
}
Ça devrait être ça. Je n'ai pas testé le code, il peut ou non fonctionner avec de légères modifications. Je travaillais avec OC 1.5.5.1. Cela ne devrait que vous indiquer la bonne direction (tout en sachant que l'arrivée n'est pas si loin).
Amusez-vous !