Drupal Commerce-Line-Elemente: verändern der Preis?
Ich noch hinzufügen zu meinem Wagen einige Werbebuchungen mit einer benutzerdefinierten Menge.
Die commerce-Produkt gespeichert wird, mit Preis = 0, und mein Modul berechnen Sie den Preis und fügen Sie die Zeile Artikel in den Warenkorb legen/bestellen, aber ich verstehe nicht, wie Sie programmgesteuert der Preis.
Ich gelesen habe über die Verwendung von Regeln, aber ich muss mein Modul in der Lage sein zu setzen/ändern den Preis, ohne Berufung auf Regeln.
Habe ich versucht mit einem entity-wrapper, ich habe versucht, zu ändern, die Einzelposten mit commerce_product_line_item_new(), aber nichts, wenn die werbebuchung wird in den Warenkorb gelegt hat immer die original-Produkt-Preis (in meinen Fall 0).
Wie ändern, um eine werbebuchung Preis programmgesteuert?
Mein code bisher sieht so aus:
//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';
}
Das merkwürdige ist, dass ich versuchte, die eine Anpassung des code of commerce_line_item_unit_price_amount() gefunden in commerce/Module/line_item/commerce_line_item.Regeln.inc, aber dieser 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);
?>
immer noch nicht, die line_item in die Karre aber mit der original Preis für das entsprechende Produkt.
Irgendeine Idee?
$line_item_wrapper->save();
)ich glaube, ich habe tryed, dass auch, aber lassen Sie mich geben, die anderen versuchen, nur für den Fall
Oh, Sie müssen auch speichern Sie die
$order_wrapper
(das hatte man mir als ich etwas ähnliches vor ein paar Monaten wieder)Tryed, immer noch nicht funktioniert.. ich Hinzugefügt
$line_item_wrapper->save(); $order_wrapper->save();
vor (und nach zu, nur für den Fall) commerce_cart_product_add
aber nichts ändern... ich bekomme kein Fehler, der werbebuchung erhalten Sie in den Warenkorb legen, aber mit dem original-Produkt ist der Preis!Mmmhh ich habe ein seltsames Verhalten btw, wenn ich call save() auf die order_wrapper, wird die werbebuchung nicht in den Warenkorb (aber immer noch kein Fehler)
InformationsquelleAutor Strae | 2012-11-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für diejenigen, die nicht wollen, die Regeln und hoffe, das zu ändern und den Preis direkt. Hier ist meine Lösung:
hook
war nicht die Auslösung von meinem Modul. Versucht Einzelne Produkt-Seitehook
. Ich bin mit DC Kickstart.Hast du irgendeinen anderen Ort auf stellen Sie den Preis? Sie können versuchen, kpr($line_item) in die Haken zu sehen, wie es ist.
InformationsquelleAutor Tim Yao
Wenn Sie schauen, um zu ignorieren, was die vorherigen Werte gespeichert wurden, in eine Linie Element und berechnen die Summe aus Ihrem neuen Betrag der Funktion, die Sie suchen, ist commerce_line_item_rebase_unit_price.
Legen Sie den neuen Wert, und führen Sie dann das line-Element über es, speichern Sie die Position und die Reihenfolge:
InformationsquelleAutor Jeremy Isett
Ich kämpfte mich durch dieses Thema heute den ganzen Tag und final herausgefunden, den richtigen Pfad zu ändern Einzelposten Preise. Das problem ist, dass, auch wenn Sie erfolgreich ändern Sie die Zeile Artikelpreis um einen benutzerdefinierten Wert, auf der nächsten Seite aktualisieren der Wagen zurücksetzen der Einzelposten entsprechen den original-Produkt-Preis. Werfen Sie einen Blick auf die
commerce_cart_order_refresh()
Funktion für details. Diese Funktion wird jedes mal ausgeführt, wenn eine Bestellung/Warenkorb ist auf der Seite geladen und es gibt keine Möglichkeit um ihn herum.Es stellt sich heraus, dass die richtige Art und Weise zu verändern, die eine werbebuchung Preis ist entweder Regeln verwenden, oder Sie implementieren
hook_commerce_cart_line_item_refresh()
Funktion. Entweder Weg, Drupal Commerce in der Lage sein müssen, gelten die Veränderung der Logik jedes mal, wenn der Warenkorb/Bestellung geladen wird.Ich landete erstellen Sie ein benutzerdefiniertes Feld in der Zeile, wo ich gespeicherte benutzerdefinierte Preis Wert, den ich wollte. Ich habe dann verwendet eine die Preisgestaltung der Regel kopieren Sie die benutzerdefinierte Preis Wert, das Produkt Preis-Wert, wenn der Warenkorb aktualisiert wird.
Den folgenden blog-post war sehr hilfreich, um herauszufinden dieses heraus. Es zeigt Ihnen, wie hinzufügen eines benutzerdefinierten Feldes zu einer line-item-Typ, und wie, um das setup eine Preisgestaltung der Regel kopieren Sie die benutzerdefinierte Höhe der Stückpreis.
http://commerceguys.com/blog/using-custom-line-items-provide-donation-feature-drupal-commerce
Können Sie nach dem letzten code?
Ich habe ein Beispiel, das diese Funktion implementiert.
InformationsquelleAutor Nathan Rambeck
Kürzlich hatte ich zum implementieren einer Spende im Handel, aber die Commerce Express-Check-Out - Modul nicht verarbeitet benutzerdefinierte Positionen. Da war es eine Spende und alle (wer versucht, Schrauben Sie das Haus?), Ich fühlte es angebracht, übergeben die Spende in Höhe als 3. parameter in der URL die Express-Checkout-Modul bietet. Hier ist, wie ich ging über das hacken des Moduls:
Ich einen neuen Eintrag Hinzugefügt router:
Ich dupliziert und optimiert der Standard-Rückruf und hefteten '_extra'. Beachten Sie, dass die "data" Eigenschaft zu sein scheint, einer statischen variable speichern, die für Anlässe nur wie dieser ist und bleibt die Laufzeit der werbebuchung.
Hier ist der Teil, der endete als die meisten schwierig, einfach wegen der Lernkurve und nicht zu wissen, was die heck-Funktion zu verwenden:
Jedes einzelne mal, wenn Sie den Warenkorb verändert wird, es erfrischt und versuche, die Produkte in den Warenkorb, um Ihre in-code-Prototyp. Es scheint ziemlich ineffizient zu mir, aber ich könnte etwas fehlen.
InformationsquelleAutor mpoplin
Diesem Beitrag wies mich in die richtige Richtung für die programmatische Veränderung der drupal-commerce-line-item durch die Verwendung
hook_commerce_cart_line_item_refersh()
. Jedoch, einige der Antworten hier sind entweder geradezu falsch, oder sehr ineffizient und schlampig.Wäre dies eine richtig funktionierende Lösung für die änderung der Art der werbebuchung in Drupal Commerce:
InformationsquelleAutor AndrewSauter