Événement Magento pour calculer le prix lorsque le champ de texte de l'option personnalisée change

10

J'essaie de créer un produit avec deux champs de texte personnalisés: Longueur et Largeur. Lorsque l'utilisateur saisit à la fois une longueur et une largeur, le prix doit être calculé via une formule personnalisée.

J'essaie de trouver l'événement correct pour connecter un observateur à - quelqu'un sait ce que cela pourrait être?

Voici ce que je sais et ce que j'ai essayé

1) la zone de texte du champ personnalisé dans la vue du produit a un événement onchange que je n'ai pas encore trouvé comment exploiter via un événement observateur - "opConfig.reloadPrice ()

2) Si je construis un observateur sur l'événement sales_quote_add_item, alors je peux changer le prix via la formule quand il est ajouté au panier. Avec cette méthode, j'ai toujours besoin d'un moyen de le changer dans la vue du produit avant de l'ajouter au panier.

3) J'ai également essayé l'événement catalog_product_get_final_price mais cela ne semble se déclencher que lorsque la page du produit est chargée, donc après l'ajout d'une longueur ou d'une largeur de produit, il ne se déclenche pas à nouveau.

Toutes les idées seraient grandement appréciées!

Clayton-a
la source
est-ce que Fabian vous a aidé? Si oui, pourriez-vous accepter ou clarifier afin que nous puissions vous aider?
philwinkle

Réponses:

2

J'ai utilisé pour ce cas d'utilisation sales_quote_collect_totals_before:

/**
 * Set prices
 *
 * @param Varien_Event_Observer $observer
 */
public function salesQuoteCollectTotalsBefore(Varien_Event_Observer $observer)
{
    /* @var $quote Mage_Sales_Model_Quote */
    $quote = $observer->getQuote();
    foreach ($quote->getAllItems() as $quoteItem) {
        if (is your product of choice) {
            /* @var $quoteItem Mage_Sales_Model_Quote_Item */
            $product = $quoteItem->getProduct();
            $price = whatever formula you want to use;
            $product->setPrice($price);
        }
    }
}

Côté client, vous pouvez simplement utiliser quelques lignes de JS pour mettre à jour le prix?

Fabian Blechschmidt
la source
2

catalog_product_get_final_priceest l'événement côté serveur correct, il est non seulement déclenché lorsque la page du produit est chargée, mais également lorsque le produit est ajouté au panier. Dans ce cas, toutes les options personnalisées sélectionnées sont disponibles avec:

$observer->getProduct()->getCustomOption($customOptionName);

(Voir aussi: Existe - t-il un moyen pour l'utilisateur de définir le prix souhaité personnalisé supérieur à zéro et de passer au panier pour n'importe quel produit? )


Recalculer le prix sur la page du produit est un autre sujet et nécessite JavaScript. reloadPriceest la bonne fonction pour se connecter, je voudrais l'étendre comme ceci:

Product.prototype.reloadPrice = Product.prototype.reloadPrice.wrap(function(callOriginal) {
    if (should_be_calculated_based_on_length_and_with) {

        // copy the original reloadPrice function here and change how `price` is calculated

    } else {
        callOriginal();
    }
});
Fabian Schmengler
la source