Ryanには、プログラムで注文を作成できるすばらしいコードがいくつかあります
<?php
global $user;
$product_id = 1;
// Create the new order in checkout; you might also check first to
// see if your user already has an order to use instead of a new one.
$order = commerce_order_new($user->uid, 'checkout_checkout');
// Save the order to get its ID.
commerce_order_save($order);
// Load whatever product represents the item the customer will be
// paying for and create a line item for it.
$product = commerce_product_load($product_id);
$line_item = commerce_product_line_item_new($product, 1, $order->order_id);
// Save the line item to get its ID.
commerce_line_item_save($line_item);
// Add the line item to the order using fago's rockin' wrapper.
$order_wrapper = entity_metadata_wrapper('commerce_order', $order);
$order_wrapper->commerce_line_items[] = $line_item;
// Save the order again to update its line item reference field.
commerce_order_save($order);
// Redirect to the order's checkout form. Obviously, if this were a
// form submit handler, you'd just set $form_state['redirect'].
drupal_goto('checkout/' . $order->order_id);
?>
http://www.drupalcommerce.org/questions/3259/it-possible-drupal-commerce-work-without-cart-module
匿名の寄付を受けたいサイトがあるので、2つの問題があります。
私がやりたいのは、金額を確認して支払いページに移動するページを用意することです。この場合、私はPaypal WPSを使用しているので、そこにリダイレクトすることは素晴らしいことです。
あなたが与えることができるどんなアドバイスもいただければ幸いです。
次の構文を持つ Commerce Drush という新しいモジュールをテストしてみてください。
drush commerce-order-add 1
drush --user=admin commerce-order-add MY_SKU123
手動による解決策
コマースでプログラムで注文を作成するには、次のコードを使用できます(drushでも機能します。例:drush -vd -u "$1" scr order_code-7.php
)。その点に注意してください commerce_payment_example
モジュールが必要です。
<?php
if (!function_exists('drush_print')) {
function drush_print ($text) {
print $text . "\n";
}
}
$is_cli = php_sapi_name() === 'cli';
global $user;
// Add the product to the cart
$product_id = 5;
$quantity = 1;
if ($is_cli) {
drush_print('Creating new order for ' . $quantity . ' item(s) of product ' . $product_id . '...');
}
// Create the new order in checkout; you might also check first to
// see if your user already has an order to use instead of a new one.
$order = commerce_order_new($user->uid, 'checkout_checkout');
// Save the order to get its ID.
commerce_order_save($order);
if ($is_cli) {
drush_print('Order created. Commerce order id is now ' . $order->order_id);
drush_print('Searching product ' . $product_id . ' in a Commerce system...');
}
// Load whatever product represents the item the customer will be
// paying for and create a line item for it.
$product = commerce_product_load((int)$product_id);
if((empty($product->product_id)) || (!$product->status)){
if ($is_cli) {
drush_print(' Cannot match given product id with a Commerce product id.');
}
drupal_set_message(t('Invalid product id'));
drupal_goto(); // frontpage
return FALSE;
}
if ($is_cli) {
drush_print(' Found a Commerce product ' . $product->product_id . '.');
}
// Create new line item based on selected product
$line_item = commerce_product_line_item_new($product, 1, $order->order_id);
if ($is_cli) {
drush_print(' Added product to the cart.');
}
// Save the line item to get its ID.
commerce_line_item_save($line_item);
// Add the line item to the order using fago's rockin' wrapper.
$order_wrapper = entity_metadata_wrapper('commerce_order', $order);
$order_wrapper->commerce_line_items[] = $line_item;
if ($is_cli) {
drush_print('Saving order...');
}
// Save the order again to update its line item reference field.
commerce_order_save($order);
// Redirect to the order's checkout form. Obviously, if this were a
// form submit handler, you'd just set $form_state['redirect'].
if ($is_cli) {
drush_print('Checking out the order...');
}
commerce_checkout_complete($order);
if ($is_cli) {
drush_print('Marking order as fully paid...');
}
$payment_method = commerce_payment_method_instance_load('commerce_payment_example|commerce_payment_commerce_payment_example');
if (!$payment_method) {
if ($is_cli) {
drush_print(" No example payment method found, we can't mark order as fully paid. Please enable commerce_payment_example module to use this feature.");
}
}
else {
if ($is_cli) {
drush_print(" Creating example transaction...");
}
// Creating new transaction via commerce_payment_example module.
$charge = $order->commerce_order_total['und'][0];
$transaction = commerce_payment_transaction_new('commerce_payment_example', $order->order_id);
$transaction->instance_id = $payment_method['instance_id'];
$transaction->amount = $charge['amount'];
$transaction->currency_code = $charge['currency_code'];
$transaction->status = COMMERCE_PAYMENT_STATUS_SUCCESS;
$transaction->message = 'Name: @name';
$transaction->message_variables = array('@name' => 'Example payment');
if ($is_cli) {
drush_print(" Notifying Commerce about new transaction...");
}
commerce_payment_transaction_save($transaction);
commerce_payment_commerce_payment_transaction_insert($transaction);
}
if ($is_cli) {
drush_print("Marking order as completed...");
}
commerce_order_status_update($order, 'completed');
if ($is_cli) {
drush_print("\nDone.");
}
注:コメントで提案されているように、注文の保存中に支払い方法に関するエラーがunknownである場合は、それを指定したことを確認してください。
$order->data['payment_method'] = 'commerce_payment_example|commerce_payment_commerce_payment_example';
commerce_order_save($order);
この変更されたスクリプトは、匿名ユーザーに対しても機能します。
<?php
global $user;
$product_id = 2;
// Create the new order in checkout; you might also check first to
// see if your user already has an order to use instead of a new one.
$order = commerce_order_new($user->uid, 'checkout_checkout');
// Save the order to get its ID.
commerce_order_save($order);
// Link anonymous user session to the cart
if (!$user->uid) {
commerce_cart_order_session_save($order->order_id);
}
// Load whatever product represents the item the customer will be
// paying for and create a line item for it.
$product = commerce_product_load($product_id);
$line_item = commerce_product_line_item_new($product, 1, $order->order_id);
// Save the line item to get its ID.
commerce_line_item_save($line_item);
// Add the line item to the order using fago's rockin' wrapper.
$order_wrapper = entity_metadata_wrapper('commerce_order', $order);
$order_wrapper->commerce_line_items[] = $line_item;
// Save the order again to update its line item reference field.
commerce_order_save($order);
// Redirect to the order's checkout form. Obviously, if this were a
// form submit handler, you'd just set $form_state['redirect'].
drupal_goto('checkout/' . $order->order_id);
commerce_cart_order_session_save() を追加する必要があるので、匿名ユーザーは、ブラウザーをカートコンテンツにリンクするためのセッションを利用できます。