11
votes

Articles de la ligne de commerce Drupal: modifier le prix?

Je dois ajouter à mon panier des éléments de ligne avec un montant personnalisé. Le produit de commerce est enregistré avec le prix = 0, et mon module calculez le prix et ajoutez l'élément de ligne au panier / commande, mais je ne comprends pas comment définir le prix de manière programmatique.

J'ai lu sur l'utilisation de règles, mais J'ai besoin de mon module pour pouvoir définir / modifier le prix, sans appeler des règles forte>. P>

J'ai essayé avec une emballeuse d'entité, j'ai essayé de modifier l'élément de ligne créé avec Commerce_Product_Line_Item_New (), mais rien, lorsque l'élément de la ligne pénètre dans le panier a toujours le prix du produit d'origine (dans mon cas, 0). p>

Comment modifier un article de ligne programmatique? P> Mon code environ ressemble à: p>

<?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);
?>


8 commentaires

Vous ne sauvegez pas vos emballages ... cela pourrait être le problème (c'est-à-dire $ line_item_wrapper-> sauvegarder (); )


@Clive je pense que j'ai essayé aussi ça aussi, mais laissez-moi donner un autre essai juste au cas où


Oh, vous aurez également besoin de sauvegarder le $ order_wrapper (celui-ci m'a eu quand je faisais quelque chose de similaire quelques mois de retour)


@Clive tryed, ne fonctionne toujours pas. J'ai ajouté $ line_item_wrapper-> sauvegarder (); $ order_wrapper-> sauvegarder (); avant (et après aussi, juste au cas où) Commerce_cart_product_add Mais rien ne change ... Je n'obtiens aucune erreur, l'élément de la ligne entrave dans le panier, Mais avec le prix du produit d'origine!


MMMHH j'ai eu un comportement étrange BTW, si j'appelle Enregistrer () sur la commande_wrapper, l'élément de la ligne ne se contente pas du tout (mais toujours pas d'erros)


Avez-vous déjà compris celui-ci?


@ m4icivei pas encore ... J'ai été occupé sur un autre projet ces jours .. Mais je dois le faire pour un projet cette semaine, je vais signaler si je l'obtiens


@ m4icivei désolé pas encore .. Si vous résolvez cela, faites le moi savoir!


5 Réponses :


4
votes

J'ai eu du mal à travers cette question toute la journée et la finale a compris le bon chemin pour modifier les prix des articles de ligne. Le problème est que, même si vous modifiez avec succès le prix de l'élément de ligne à une valeur personnalisée, sur la page suivante Actualiser, le panier rétablit les éléments de la ligne pour correspondre au prix de produit d'origine. Jetez un coup d'œil à 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ée sur la page et il n'y a aucun moyen de le faire.

Il s'avère que le moyen approprié de modifier un prix d'élément de ligne est d'utiliser des règles ou de mettre en œuvre le Hook_Commerce_cart_line_Item_refresh () fonction. De toute façon, le commerce de Drupal doit pouvoir appliquer la logique d'altération chaque fois que le chariot / la commande est chargé.

J'ai fini par créer un champ personnalisé dans l'élément de ligne où j'ai stocké la valeur de prix personnalisée que je voulais. J'ai ensuite utilisé une règle de tarification pour copier la valeur de prix personnalisée à la valeur du prix du produit chaque fois que le chariot est actualisé.

Le blog suivant, le message a été très utile pour déterminer cela. Il vous montre comment ajouter un champ personnalisé à un type d'élément de ligne et comment configurer une règle de tarification pour copier le montant personnalisé au prix unitaire.

http://commerceguys.com/ Blog / Utilisation-Custom-Line-Line-Line-Line-Fournisseur-Donation-Feature-Drupal-Commerce


2 commentaires

Merci d'avoir partagé! Drupal Commerce est puissant et flexible, mais je ne comprends toujours pas pourquoi la modification des prix est liée à des règles de manière si stricte.


@Michaelstevens J'ai posté un exemple qui implémente cette fonction.



1
votes

Récemment, je devais mettre en œuvre un formulaire de donation dans le commerce mais le Commerce express Checkout module ne gère pas articles de ligne personnalisés. Puisque c'était un don et tout (qui essaie de visser la maison?), Je pensais qu'il était approprié de passer le montant du don en tant que 3ème paramètre dans l'URL, le module de commande express fournit. Voici comment je suis allé contre le piratage du module:

J'ai ajouté une nouvelle entrée sur le routeur: p> xxx pré>

i dupliquée et a modifié le rappel par défaut et "_extra" à ce. Notez que la propriété "Données" semble être une boutique de variable statique à des occasions, telles que cela et persiste la durée de vie de l'élément de la ligne. P>

/**                                                                             
 * Implements hook_commerce_cart_line_item_refresh().                           
 */                                                                             
function commerce_express_checkout_commerce_cart_line_item_refresh($line_item, $order_wrapper) { 
  if ($line_item->commerce_product['und'][0]['line_item_label'] == 'DONATE' || $line_item->commerce_product['und'][0]['product_id'] == '11') {
    $price = array('amount' => commerce_round(COMMERCE_ROUND_HALF_UP, $line_item->data['und'][0]['amount']), 'currency_code' => commerce_default_currency());
    $line_item->commerce_unit_price = array('und' => array('0' => $price));
    $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', $price, TRUE
    );
  }
}


0 commentaires

19
votes

Pour les personnes qui ne veulent pas utiliser de règles et espèrent modifier le prix directement. Voici ma solution:

// Alter the price in list and single product page.
function my_module_commerce_product_calculate_sell_price_line_item_alter($line_item){

    $price = 100; //1 dollar
    $line_item->commerce_unit_price[LANGUAGE_NONE]['0']['amount'] = $price;

}

// Alter the price in cart & order.
function my_module_commerce_cart_line_item_refresh($line_item, $order_wrapper){

    $price = 100; //1 dollar
    $line_item->commerce_unit_price[LANGUAGE_NONE]['0']['amount'] = $price;
    // Alter the base_price component.
    $line_item->commerce_unit_price[LANGUAGE_NONE]['0']['data']['components']['0']['price']['amount'] = $price;

}


2 commentaires

HI TIM, le code n'a pas déclenché à partir de mon module. Essayé Page du produit unique Crochet . J'utilise DC Kickstart.


Avez-vous un autre endroit pour définir le prix? Vous pouvez essayer de kpr ($ line_item) dans le crochet pour voir ce que c'est comme.



6
votes

Si vous souhaitez ignorer les valeurs précédentes enregistrées sur un élément de ligne et recalculer le total de votre nouveau montant, la fonction que vous recherchez est Commerce_line_item_rebase_unit_price.

Définissez la nouvelle valeur, puis exécutez votre Article de ligne à travers là-bas, enregistrer l'élément de ligne et la commande: xxx


1 commentaires

À mon esprit c'est la meilleure réponse. Je suis sûr qu'il y a des situations où le système de tarification complexe de Drupal Commerce est très utile, mais dans les cas d'utilisation, je suis venu sur je veux juste Définir le prix Dang , et je ne veux pas avoir à mettre en œuvre un autre crochet (rendant ainsi mon code encore plus difficile à comprendre).



0
votes

Ce post m'a signalé dans la bonne direction pour altérer par programmation d'un élément de la ligne de commerce Drupal à l'aide de Hook_Commerce_cart_line_Item_refersh () Code>. Cependant, certaines des réponses ici sont tranchées, soit très inefficaces et négligées.

Ce serait une solution de travail correcte pour modifier le type d'élément de ligne dans Drupal Commerce: P>

/*  
 * implements hook_commerce_cart_line_item_refresh()
 *  
 */

function MYMODULE_commerce_cart_line_item_refresh($line_item, $order_wrapper){

    $line_wrapper = entity_metadata_wrapper('commerce_line_item', $line_item);

    $new_price = 100; //I use a function to calculate the value of $new_price

    if(!empty($new_price)){
        $line_wrapper->commerce_unit_price->amount->set($new_price);
        $line_wrapper->save();
    }
}


0 commentaires