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?
cart
event-observer
custom-options
user1638055
la source
la source
Réponses:
Vous pouvez
catalog_product_type_prepare_full_options
plutô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->options
est un tableau sous la formeoption_id => option_value
. Attention, le transport lui-même est unstdClass
objet, pas une instance deVarien_Object
, comme on pourrait s'y attendre. Il n'y a donc pas de méthodes getter et setter pourtransport->options
.buy_request: L'objet buyRequest, vous pouvez le lire ici et le modifier également. C'est un
Varien_Object
qui contient entre autres:options: tableau d'options personnalisées sous la forme:
Votre observateur pourrait donc ressembler à ceci:
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.la source
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:
Si tel est le cas, vous devriez pouvoir simplifier le code comme suit:
Comme mentionné, cette solution ne concernera que les attributs d'élément de devis définis par programmation.
la source