/** * Update the order form cart, called via AJAX with current order form data. * Renders the cart and sends that back for displaying on the order form page. * * @param SS_HTTPRequest $data Form data sent via AJAX POST. * @return String Rendered cart for the order form, template include 'CheckoutFormOrder'. */ function updateOrderFormCart(SS_HTTPRequest $data) { if ($data->isPOST()) { $fields = array(); $validator = new OrderFormValidator(); $member = Customer::currentUser() ? Customer::currentUser() : singleton('Customer'); $order = CartControllerExtension::get_current_order(); //Update the Order $order->addAddressesAtCheckout($data->postVars()); $order->addModifiersAtCheckout($data->postVars()); //TODO update personal details, notes and payment type? //Create the part of the form that displays the Order $this->addItemFields($fields, $validator, $order); $this->addModifierFields($fields, $validator, $order); //This is going to go through and add modifiers based on current Form DATA //TODO This should be constructed for non-dropdown fields as well //Update modifier form fields so that the dropdown values are correct $newModifierData = array(); $subTotalModifiers = isset($fields['SubTotalModifiers']) ? $fields['SubTotalModifiers'] : array(); $totalModifiers = isset($fields['Modifiers']) ? $fields['Modifiers'] : array(); $modifierFields = array_merge($subTotalModifiers, $totalModifiers); foreach ($modifierFields as $field) { if (method_exists($field, 'updateValue')) { $field->updateValue($order); } $modifierClassName = get_class($field->getModifier()); $newModifierData['Modifiers'][$modifierClassName] = $field->Value(); } //Add modifiers to the order again so that the new values are used $order->addModifiersAtCheckout($newModifierData); $actions = new FieldSet(new FormAction('ProcessOrder', _t('CheckoutPage.PROCEED_TO_PAY', "Proceed to pay"))); $form = new CheckoutForm($this, 'OrderForm', $fields, $actions, $validator, $order); $form->disableSecurityToken(); $form->validate(); return $form->renderWith('CheckoutFormOrder'); } }