Drupal → Программно создать товар в Commerce

23.10.2013

Пример программного создания товара и его вариации:

Commerce 2 (Drupal 8+):

// Create variation
$variation = \Drupal\commerce_product\Entity\ProductVariation::create([
  'type' => 'default',
  'sku' => 'PRODUCT1',
  'title' => 'Product 1',
  'price' => ['number' => 10, 'currency_code' => 'USD'], // $10
]);
$variation->save();

// Create product
$product = \Drupal\commerce_product\Entity\Product::create([
  'type' => 'default',
  'title' => $variation->label(),
  'variations' => $variation,
  'stores' => 1, // Store id
]);
$product->save();

Commerce 1 (Drupal 7):

// Create product
$product = commerce_product_new('product');
$product->sku = 'PROD-SKU';
$product->title = 'Product title';
$product->language = LANGUAGE_NONE;
$product->uid = 1;
$product->commerce_price[LANGUAGE_NONE][0]['amount'] = commerce_currency_decimal_to_amount(10, 'USD'); // $10
$product->commerce_price[LANGUAGE_NONE][0]['currency_code'] = 'USD';
commerce_product_save($product);

// Create product display
$node = (object)array('type' => 'product_display');
node_object_prepare($node);
$node->title = 'Product display title';
$node->uid = 1;
$node->field_product[LANGUAGE_NONE][]['product_id'] = $product->product_id;
$node->language = LANGUAGE_NONE;
node_save($node);
Написанное актуально для
Commerce 1.x, Commerce 2.x
Похожие записи

Комментарии

Игорь
17.12.2013, 21:26

Интересно Это равноценно??

commerce_product_save($product);
// или это?
entity_save('commerce_product', $product);
Игорь
24.12.2013, 22:18

Вопросик:
Допустим я создал так 1 продукт и 1 дисплей.
На следующий день я создал ещё один продукт и его нужно добавить в этот дисплей, понятно, что нужно вызвать:

$node = node_load(123);
$node->field_product[LANGUAGE_NONE][]['product_id'] = $product->product_id;
node_save($node);

А можно ли где то в пред обработке &$variables... подцеплять дополнительные product_id??

что такое "в пред обработке &$variables"?

Игорь
24.12.2013, 23:06

Я думал вы меня поймете...)))
Я имел ввиду что перед визуализацией страницы добавить новый id продукта. Но не знаю куда копать. Либо в template.php либо в своём модуле...
Хотелось бы чтобы где то где только только загрузился дисплей(страница) в обработку перед выводом сообщить обработчику, что у него не один продукт, ну то есть не только тот(те) продукт, но и ещё которые тоже его как будто и они прописаны у него в базе... Может так только сложнее?

а как присвоить статус товара отличный от дефолтного?

логично предположить, что нужно изменить $product->status

Игорь
24.02.2014, 13:08

$product->commerce_price[LANGUAGE_NONE][0]['amount'] = 10 * 100; // $10
Не то чтобы меня напрягает умножить на 100, нет. Но вывод копеек достал! У меня в магазине(офлайн...)))), бывает, не берут эту желтую мелочь...)))
Первое решение, вроде самое удобное - Drupal Commerce Extra Price Formatters . Полностью не решает проблемы. "RRP / Your Price" - удобный формат для вывода где-нибудь, но ни при оформлении заказа!
В коммерце жестко для этого прописан формат - 'type' => 'commerce_price_formatted_components' - commerce_order_handler_area_order_total.inc. То есть определить другой формат ни как не получится. Либо заменять вывод (#markup). (Размышляю) Может переопределить

 class commerce_order_handler_area_order_total extends views_handler_area {} 
// как то так:
class mymodule_commerce_order_handler_area_order_total extends commerce_order_handler_area_order_total {} 

Я ещё так ни разу не делал, это же ООП.
Вообщем мне показалось проще:

 /**
* Implements hook_commerce_currency_info_alter().
*
*/
function имя_модуля_commerce_currency_info_alter(&$currencies, $langcode) {
  $currencies['RUB']['decimals'] = 0; // Всё подорожает в 100 раз!
} 

Только срузу же все цены разделить на 100!
hook_commerce_currency_info Как здесь обсуждают или здесь: http://www.drupal.ru/node/95438. Пришлось просто http вставить - а то пишет - похоже на спам - слишком много ссылок...)))

а как программно добавить товар в корзину?

Добавить комментарий