Modifier les options personnalisées d'un article lors de son ajout au panier?

8

J'écoute l' événement sales_quote_save_before pour savoir quand un article est ajouté au panier. Une fois son tir, j'itère les options des articles comme ceci:

$quote = $observer->getEvent()->getQuote();

foreach ($quote->getAllItems() as $item) {
    $options = $item->getProduct()->getTypeInstance(true)->getOrderOptions($item->getProduct());

    foreach($options['options'] as $option) {

         if($option['label'] == 'myOptionA') {
              // Here I want to change the selected value for the option  
         }
     }
}

Comme vous le voyez, dès qu'une certaine option (myOptionA dans l'exemple) est atteinte, je veux changer l'option sélectionnée. Disons donc que myOptionA est une liste déroulante et a 4 valeurs possibles. Si la valeur 1 est sélectionnée, je souhaite définir la valeur 4 pour cet élément. Ainsi, lorsque le chariot a fini de charger, il doit avoir la valeur 4 pour myOptionA. Pas seulement son nom, mais aussi son prix. Comment pourrais-je faire ça?

user1638055
la source
CMIIW, cette boucle vous donne les valeurs disponibles, pas celle sélectionnée. Pour obtenir l'option personnalisée réelle qui a été définie, analysez $ array_sku = explode ('-', $ item-> getSku ()); De toute évidence, le premier est la référence du produit réel $ sku = reset ($ array_sku); Vous n'avez pas encore de solution pour obtenir les données.
nicolallias
Le point clé que je regarde est de pouvoir fixer le prix de la valeur de l'option. J'en ai regardé certains ces derniers jours et je ne vois pas de moyen évident de fixer le prix de la valeur. Il semble presque que l'élément de devis doit avoir des options supprimées puis reconstruites à partir de la demande.
pspahn

Réponses:

8

Vous pouvez catalog_product_type_prepare_full_optionsplutôt écrire un observateur pour l'événement , qui est le dernier événement du processus d'ajout au panier avant que le produit ne soit réellement ajouté au panier et une fois les options personnalisées préparées.

Dans l'observateur, vous disposez des paramètres suivants:

  • transport: objet de transport pour toutes les options personnalisées, afin que vous puissiez changer de tehem dans l'observateur. transport->optionsest un tableau sous la forme option_id => option_value. Attention, le transport lui-même est un stdClassobjet, pas une instance de Varien_Object, comme on pourrait s'y attendre. Il n'y a donc pas de méthodes getter et setter pour transport->options.
  • produit: Le produit qui sera converti en élément de devis ultérieurement.
  • buy_request: L'objet buyRequest, vous pouvez le lire ici et le modifier également. C'est un Varien_Objectqui contient entre autres:

    • produit: l' ID du produit
    • options: tableau d'options personnalisées sous la forme:

      option_id => value

Source et plus d'informations: info_buyRequest reference

Votre observateur pourrait donc ressembler à ceci:

$transport = $observer->getTransport();
if (isset($transport->options[OPTION_A_ID]) && $transport->options[OPTION_A_ID] == 1) {
    $transport->options[OPTION_A_ID] = 4;
}

$buyRequest= $observer->getBuyRequest();
$buyRequestOptions = $buyRequest->getOptions();
if (isset($buyRequestOptions[OPTION_A_ID]) && $buyRequestOptions[OPTION_A_ID] == 1) {
    $buyRequestOptions[OPTION_A_ID] = 4;
}
$buyRequest->setOptions($buyRequestOptions);

La première partie (changeante $transport) est pertinente pour changer réellement la valeur de l'option OPTION_A_ID. La deuxième partie (changeante $buyRequest) est facultative, elle supprimera simplement toutes les traces de la valeur sélectionnée par le client et s'il réordonne la commande, la nouvelle valeur sera immédiatement sélectionnée car la demande d'achat sera "exécutée" avec les paramètres modifiés. Vous devez décider si c'est ce que vous voulez.

Fabian Schmengler
la source
Le même événement peut être utilisé pour magento 2 à des fins similaires.
Bartosz Kubicki
ça ne fonctionne pas dans magento2
Magento2 Devloper
0

Si vous avez configuré votre attribut via le code, c'est-à-dire en utilisant un script d'installation - vous trouverez votre attribut sous forme de colonne sous le sales_flat_quote_item.

Si c'est le cas, alors avoir accès à la variable $ item, vous devriez pouvoir utiliser des méthodes magiques relatives à votre attribut:

// column name my_option
$item->setMyOption("value"); // to set the value
$item->getMyOption(); // to get the value

Si tel est le cas, vous devriez pouvoir simplifier le code comme suit:

$quote = $observer->getEvent()->getQuote();
foreach ($quote->getAllItems() as $item) {
    $item->setMyOptionA("New Value");
    $item->save();
}

Comme mentionné, cette solution ne concernera que les attributs d'élément de devis définis par programmation.

Dan Hanly
la source