/**
  * Form submit callback: add a product to an order.
  */
 public function addProductSubmit($form, FormStateInterface $form_state)
 {
     $form_state->set('products_action', 'products_select');
     $form_state->set('refresh_products', TRUE);
     $form_state->setRebuild();
     $order = $form['#order'];
     $data = \Drupal::moduleHandler()->invokeAll('uc_add_to_cart_data', array($form_state->getValue('product_controls')));
     $values = uc_product_load_variant(intval($form_state->getValue(['product_controls', 'nid'])), $data)->toArray();
     $values['qty'] = $form_state->getValue(['product_controls', 'qty']);
     $values['order_id'] = $order->id();
     $product = OrderProduct::create($values);
     \Drupal::moduleHandler()->alter('uc_order_product', $product, $order);
     $product->save();
     $order->products[] = $product;
     $order->logChanges([$this->t('Added (@qty) @title to order.', ['@qty' => $product->qty->value, '@title' => $product->title->value])]);
     // Decrement stock.
     if (\Drupal::moduleHandler()->moduleExists('uc_stock')) {
         uc_stock_adjust_product_stock($product, 0, $order);
     }
     // Add this product to the form values for accurate tax calculations.
     $products = $form_state->getValue('products');
     $products[] = $product;
     $form_state->setValue('products', $products);
 }
Exemple #2
0
 /**
  * {@inheritdoc}
  */
 public function submitForm(array &$form, FormStateInterface $form_state)
 {
     parent::submitForm($form, $form_state);
     $order = $this->entity;
     $original = clone $order;
     // Build list of changes to be applied.
     $panes = _uc_order_pane_list();
     foreach ($panes as $pane) {
         if (in_array('edit', $pane['show'])) {
             $pane['callback']('edit-process', $order, $form, $form_state);
         }
     }
     $log = array();
     foreach (array_keys($order->getFieldDefinitions()) as $key) {
         if ($original->{$key}->value !== $order->{$key}->value) {
             if (!is_array($order->{$key}->value)) {
                 $log[$key] = array('old' => $original->{$key}->value, 'new' => $order->{$key}->value);
             }
         }
     }
     if (\Drupal::moduleHandler()->moduleExists('uc_stock')) {
         $qtys = array();
         foreach ($order->products as $product) {
             $qtys[$product->order_product_id] = $product->qty;
         }
     }
     if (is_array($form_state->getValue('products'))) {
         foreach ($form_state->getValue('products') as $product) {
             if (!isset($product['remove']) && intval($product['qty']) > 0) {
                 foreach (array('qty', 'title', 'model', 'weight', 'weight_units', 'cost', 'price') as $field) {
                     $order->products[$product['order_product_id']]->{$field} = $product[$field];
                 }
                 if (\Drupal::moduleHandler()->moduleExists('uc_stock')) {
                     $product = (object) $product;
                     $temp = $product->qty;
                     $product->qty = $product->qty - $qtys[$product->order_product_id];
                     uc_stock_adjust_product_stock($product, 0, $order);
                     $product->qty = $temp;
                 }
             } else {
                 $log['remove_' . $product['nid']] = $product['title'] . ' removed from order.';
             }
         }
     }
     // Load line items again, since some may have been updated by the form.
     $order->line_items = $order->getLineItems();
     $order->logChanges($log);
     $order->save();
     drupal_set_message(t('Order changes saved.'));
 }