/** * 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); }
/** * {@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.')); }