/** * Entity builder: populates the line item title from the purchased entity. * * @param string $entity_type * The entity type identifier. * @param \Drupal\commerce_order\Entity\LineItemInterface $line_item * The line item. * @param array $form * The complete form array. * @param \Drupal\Core\Form\FormStateInterface $form_state * The current state of the form. */ public static function populateTitle($entity_type, LineItemInterface $line_item, array $form, FormStateInterface $form_state) { $purchased_entity = $line_item->getPurchasedEntity(); if ($line_item->isNew() && $purchased_entity) { $line_item->setTitle($purchased_entity->getLineItemTitle()); } }
/** * {@inheritdoc} */ public function matchAll(LineItemInterface $line_item, array $line_items) { $purchased_entity = $line_item->getPurchasedEntity(); if (empty($purchased_entity)) { // Don't support combining line items without a purchased entity. return []; } $comparison_fields = ['type', 'purchased_entity']; $event = new LineItemComparisonFieldsEvent($comparison_fields, $line_item); $this->event_dispatcher->dispatch(CartEvents::LINE_ITEM_COMPARISON_FIELDS, $event); $comparison_fields = $event->getComparisonFields(); $matched_line_items = []; /** @var \Drupal\commerce_order\Entity\LineItemInterface $existing_line_item */ foreach ($line_items as $existing_line_item) { foreach ($comparison_fields as $comparison_field) { if (!$existing_line_item->hasField($comparison_field) || !$line_item->hasField($comparison_field)) { // The field is missing on one of the line items. continue 2; } if ($existing_line_item->get($comparison_field)->getValue() !== $line_item->get($comparison_field)->getValue()) { // Line item doesn't match. continue 2; } } $matched_line_items[] = $existing_line_item; } return $matched_line_items; }
/** * {@inheritdoc} */ public function addLineItem(OrderInterface $cart, LineItemInterface $line_item, $combine = TRUE, $save_cart = TRUE) { $purchased_entity = $line_item->getPurchasedEntity(); $quantity = $line_item->getQuantity(); $matching_line_item = NULL; if ($combine) { $matching_line_item = $this->lineItemMatcher->match($line_item, $cart->getLineItems()); } $needs_cart_save = FALSE; if ($matching_line_item) { $new_quantity = $matching_line_item->getQuantity() + $quantity; $matching_line_item->setQuantity($new_quantity); $matching_line_item->save(); } else { $line_item->save(); $cart->addLineItem($line_item); $needs_cart_save = TRUE; } $event = new CartEntityAddEvent($cart, $purchased_entity, $quantity, $line_item); $this->eventDispatcher->dispatch(CartEvents::CART_ENTITY_ADD, $event); if ($needs_cart_save && $save_cart) { $cart->save(); } return $line_item; }