Création d'une option personnalisée et d'un prix pour le produit ajouté au panier à l'aide d'un observateur

15

Je veux ajouter une option personnalisée à quoteitem en utilisant observer quel observateur checkoutCartProductAddAfter événement et se déclenche après que le produit a été ajouté au panier.

public function checkoutCartProductAddAfter(Varien_Event_Observer $observer)
{

 $item = $observer->getQuoteItem();  
  $item->addOption(new Varien_Object(
            array(
                    'product' => $item->getProduct(),
                    'label' => 'Free Gifts',
                    'value' => 'Spend $50 and get gift product worth $9.99'
                 )
        ));
    return;

}

Mon observateur travaille mais je ne suis pas en mesure d'ajouter une option personnalisée au produit ajouté. veuillez fournir de l'aide pour ajouter une option personnalisée à l'aide d'un observateur au produit que vous venez d'ajouter.

Keyur Patel
la source
me fournir également pour changer le prix personnalisé du produit en observateur. je veux ajouter un prix personnalisé à zéro. merci d'avance
Keyur Patel

Réponses:

19

@Tim a donné une conférence sur ce problème le week-end: https://docs.google.com/presentation/d/1efPznQSVTrT1HAD1xQvCPC-Tgvr8jYok4X7ZEJhm9jE/edit

Ce que vous voulez, c'est la méthode 2: ajouter l'événement suivant dans Config.xml

<sales_quote_collect_totals_before>
<observers>
<hackathon_presentation>
<type>singleton</type>
<class>modulename/observer</class>
<method>salesQuoteAddressCollectTotalsBefore</method>
</hackathon_presentation>
</observers>
</sales_quote_collect_totals_before>

Dans Observer.php, ajoutez la méthode suivante

   public function salesQuoteAddressCollectTotalsBefore($observer)
    {
        $quote = $observer->getQuote();
        $quote_items = $quote->getItemsCollection();
        foreach ($quote_items as $item) {
            $additionalOptions = array(
                array(
                    'code'  => 'my_code',
                    'label' => 'This text is displayed through additional options',
                    'value' => 'ID is ' . $item->getProductId() . ' and SKU is ' . $item->getSku()
                )
            );
            $item->addOption(
                array(
                     'code'  => 'additional_options',
                     'value' => serialize($additionalOptions),
                )
            );
        }
    }

En savoir plus sur ce sujet:

/programming/9334115/magento-change-custom-option-value-before-adding-it-to-cart/9344336#9344336

et plus:

/programming/9412074/magento-quote-order-product-item-attribute-based-on-user-input/9496266#9496266

Fabian Blechschmidt
la source
1
Premièrement: veuillez utiliser des commentaires au lieu de nouvelles réponses. Ensuite, insérez un chèque pour votre produit dans la boucle, de sorte que seul le produit souhaité obtienne l'option.
Fabian Blechschmidt
1
Veuillez jeter un œil à cette excellente réponse de débogage et commenter: magento.stackexchange.com/a/429/217
Fabian Blechschmidt
1
Ceci est possible avec les étapes décrites ci-dessus
Fabian Blechschmidt
2
Merci pour la suggestion Lorsque j'ajoute au panier, j'ai deux articles parce que j'utilise le produit configurable et j'ai résolu le problème en mettant à jour le dernier article du devis.
Milople Inc
1
Moi non plus, mais j'ai mis à jour le lien. Merci!
Fabian Blechschmidt
3

L'événement approprié pour ajouter des options personnalisées à la volée est catalog_product_type_prepare_full_optionsdéclenché juste avant que le produit avec ses options personnalisées ne soit converti en élément de devis.

Si les propres données buyRequest ont un effet sur les attributs ou les options du produit, un observateur sur l'événement catalog_product_type_prepare_{$processMode}_optionsest un bon choix, où se $processModetrouve le mode de validation et peut être «complet» ou «léger». Le mode «complet» est utilisé lorsqu'un produit est régulièrement ajouté au panier et valide si toutes les options requises sont définies et que la configuration entière est valide. En mode «lite», seules les options contenues dans la demande sont validées, elle est utilisée lors de l'ajout d'un produit à la wishlist, mais également possible lors de la création d'une commande depuis le backend. Pour traiter les données dans tous les cas, vous pouvez inscrire l'observateur pour les deux événements. En cas de validation, vous devez bien sûr différencier les événements.

Les événements sont déclenchés dans Mage_Catalog_Model_Product_Type_Abstract :: _ prepareOptions () et les paramètres suivants sont disponibles:

  • transport: Objet de transport pour toutes les options personnalisées (mais pas d'autres options, par exemple les options de bundle), vous pouvez donc les modifier dans l'observateur. transport-> options est un tableau sous la forme option_id => option_value. Attention, le transport lui-même est un objet stdClass, pas une instance de Varien_Object, comme vous pouvez vous y attendre. Il n'y a donc pas de méthodes getter et setter pour les options de transport->.
  • buy_request: L'objet buyRequest, vous pouvez le lire ici et le modifier également.
  • product: Le produit qui sera converti en élément de devis ultérieurement. Ici, vous pouvez manipuler des attributs ou les ajouter dynamiquement. Mais vous devez toujours les prendre en compte dans le processus de conversion. L'événement utilisé pour cela sales_quote_product_add_after, n'est déclenché que plus tard.

Source: L'objet buyRequest de Magento - Une référence

Un observateur pourrait donc ressembler à ceci:

public function addCustomOption(Varien_Event_Observer $observer)
{
    $transport = $observer->getTransport();
    if (this_item_should_be_free()) { // implement your condition here
        $transport->options['Free Gifts'] = 'Spend $50 and get gift product worth $9.99';
    }
}

Vous ne pouvez pas définir un prix pour cette option personnalisée ajoutée dynamiquement, mais vous pouvez modifier le prix de l'élément de devis en utilisant un deuxième observateur pour catalog_product_get_final_pricecomme ceci:

public function adjustFinalPrice($observer) {

    $product = $observer->getProduct();
    // Set price to "0" if custom option "Free Gift" has been set
    if ($product->getCustomOption('Free Gift')) {
        $product->setFinalPrice(0);
    }
}
Fabian Schmengler
la source