Mysql
 sql >> Base de données >  >> RDS >> Mysql

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

OK, pour vous orienter dans la bonne direction, voici comment je procéderais :

1. rendu d'entrée masqué
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 .

2. Le 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);

3. Le chariot
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 !