Articles de ligne Drupal Commerce: modifiez le prix?
Je dois ajouter à mon panier quelques éléments de ligne avec un montant personnalisé.
Le commerce est enregistrée avec le prix = 0, et mon module de calcul du prix et ajoutez la ligne article au panier/commande, mais je ne comprends pas comment définir par programmation le prix.
J'ai lu sur l'aide de Règles, mais j'ai besoin de mon module pour être en mesure de définir/modifier le prix, sans invoquer les règles de.
J'ai essayé avec une entité wrapper, j'ai essayé de modifier la ligne de l'élément créé avec commerce_product_line_item_new(), mais rien, lorsque l'élément de ligne pénètre dans le panier a toujours le produit d'origine prix (dans mon cas, 0).
Comment modifier un élément de ligne de prix par programme?
Mon code ressemble tellement loin:
//For debugging, this function is called by hook_menu()
function mymodule_test($product_id)
{
global $user;
$user = user_load($user->uid);
$order = commerce_cart_order_load($user->uid);
$order_wrapper = entity_metadata_wrapper('commerce_order', $order);
$product = commerce_product_load($product_id);
$line_item = commerce_product_line_item_new(
$product,
1,
0,
array(
),
'cover'
);
$line_item_wrapper = entity_metadata_wrapper("commerce_line_item", $line_item);
$line_item_wrapper->commerce_unit_price->data = commerce_price_component_add(
$line_item_wrapper->commerce_unit_price->value(),
'base_price',
array(
'amount' => 1234,
'currency_code' => 'EUR',
'data' => array(),
),
TRUE
);
$insert_line_item = commerce_cart_product_add($user->uid, $line_item_wrapper->value(), FALSE);
return 'done';
}
La chose étrange, c'est que j'ai essayé d'adapter le code de commerce_line_item_unit_price_amount() trouvé dans le commerce/modules/line_item/commerce_line_item.des règles.inc, mais ce test:
<?php
global $user;
$product = commerce_product_load(4); //my commerce product for test
$line_item = commerce_product_line_item_new(
$product,
1,
0,
array(
),
'cover' //I do have this line_items type
);
//manually set amount and component name
$amount = 1234;
$component_name = 'base_price'; //tryed with discount, nothing change
$wrapper = entity_metadata_wrapper('commerce_line_item', $line_item);
$unit_price = commerce_price_wrapper_value($wrapper, 'commerce_unit_price', TRUE);
//Calculate the updated amount and create a price array representing the
//difference between it and the current amount.
$current_amount = $unit_price['amount'];
$updated_amount = commerce_round(COMMERCE_ROUND_HALF_UP, $amount);
$difference = array(
'amount' => $updated_amount - $current_amount,
'currency_code' => $unit_price['currency_code'],
'data' => array(),
);
//Set the amount of the unit price and add the difference as a component.
$wrapper->commerce_unit_price->amount = $updated_amount;
$wrapper->commerce_unit_price->data = commerce_price_component_add(
$wrapper->commerce_unit_price->value(),
$component_name,
$difference,
TRUE
);
$insert_line_item = commerce_cart_product_add($user->uid, $line_item, FALSE);
?>
encore échouer, le line_item entrer dans le panier, mais avec le prix d'origine du produit référencé.
Une idée?
source d'informationauteur Strae
Vous devez vous connecter pour publier un commentaire.
Pour ceux qui ne veulent pas utiliser des règles et de l'espoir de changer le prix directement. Voici ma solution:
Si vous êtes à la recherche à ignorer ce que les valeurs précédentes ont été enregistrés sur un élément de ligne et de recalculer le total de votre nouveau montant de la fonction que vous recherchez est commerce_line_item_rebase_unit_price.
Fixer le nouveau montant de la valeur et puis exécutez votre élément de ligne, économiser de l'élément de ligne et de l'ordre:
J'ai eu du mal à ce problème toute la journée aujourd'hui et final compris le chemin d'accès correct à la modification de la ligne d'éléments de prix. Le problème est que, même si vous avez réussi à changer l'élément de ligne de prix d'une valeur personnalisée, sur la page suivante actualiser le panier de réinitialisation de la ligne d'éléments pour correspondre à l'original prix du produit. Jetez un oeil à la
commerce_cart_order_refresh()
fonction pour plus de détails. Cette fonction est exécutée à chaque fois qu'une commande/panier est chargé sur la page et il n'y a pas moyen de contourner cela.Il s'avère que la bonne façon de modifier un élément de ligne de prix consiste à utiliser des Règles ou à mettre en œuvre les
hook_commerce_cart_line_item_refresh()
fonction. De toute façon, Drupal Commerce doivent être en mesure d'appliquer la modification de la logique à chaque fois que le panier/commande est chargé.J'ai fini par création d'un champ personnalisé dans la Ligne de l'Article où j'ai stocké le prix personnalisé de la valeur que je voulais. J'ai ensuite utilisé une Règle de Tarification pour copier les prix personnalisé de la valeur au produit du prix de la valeur chaque fois que le chariot est actualisé.
Le blog suivant a été très utile pour comprendre cela. Il vous montre comment ajouter un champ personnalisé à un élément de ligne de type et de la configuration d'une règle de prix pour copier le montant personnalisé à l'unité au prix.
http://commerceguys.com/blog/using-custom-line-items-provide-donation-feature-drupal-commerce
Récemment, j'ai dû mettre en place un formulaire de don, dans le Commerce, mais le Commerce Express Checkout module ne gère pas la coutume des éléments de ligne. Depuis que c'était un don et tous (qui cherche à vis de la maison?), J'ai jugé bon de faire passer le montant de votre don, comme un 3ème paramètre dans l'URL l'Express Checkout module fournit. Voici comment je suis allé sur le piratage du module:
J'ai ajouté une nouvelle entrée dans le routeur:
J'ai dupliqué et modifié la valeur par défaut de rappel et soudés " _extra à elle. Notez que les "données" de la propriété semble être une variable statique magasin pour des occasions juste comme cela et persiste la durée de vie de l'élément de ligne.
Ici est la partie qui a fini par être plus difficile simplement en raison de la courbe d'apprentissage et de ne pas savoir ce que le diable fonction à utiliser:
Chaque fois que le chariot est modifiée, elle rafraîchit et tente de placer les produits dans le panier de leur code de prototype. Il semble assez inefficace pour moi aussi, mais j'ai peut être raté quelque chose.
Ce post m'a orienté dans la bonne direction pour par programme la modification d'un drupal commerce en ligne élément à l'aide de
hook_commerce_cart_line_item_refersh()
. Cependant, certaines réponses ici sont soit totalement incorrect, ou très inefficace et peu soignée.Ce serait une bonne solution de travail pour la modification de l'élément de ligne de type Drupal Commerce: