Ejemplo n.º 1
0
    /** 
     * Process the items in the shopping cart from session,
     * creating a new {@link Order} record, and updating the
     * customer's details {@link Member} record.
     * 
     * {@link Payment} instance is created, linked to the order,
     * and payment is processed {@link Payment::processPayment()}
     * 
     * @param array $data Form request data submitted from OrderForm
     * @param Form $form Form object for this action
     * @param HTTPRequest $request Request object for this action
     */
    function processOrder($data, $form, $request)
    {
        $paymentClass = !empty($data['PaymentMethod']) ? $data['PaymentMethod'] : null;
        $payment = class_exists($paymentClass) ? new $paymentClass() : null;
        if (!($payment && $payment instanceof Payment)) {
            user_error(get_class($payment) . ' is not a valid Payment object!', E_USER_ERROR);
        }
        if (!ShoppingCart::has_items()) {
            $form->sessionMessage('Please add some items to your cart', 'bad');
            Director::redirectBack();
            return false;
        }
        // Create new OR update logged in {@link Member} record
        $member = EcommerceRole::createOrMerge($data);
        if (!$member) {
            $form->sessionMessage(_t('OrderForm.MEMBEREXISTS', 'Sorry, a member already exists with that email address.
					If this is your email address, please log in first before placing your order.'), 'bad');
            Director::redirectBack();
            return false;
        }
        $member->write();
        $member->logIn();
        // Create new Order from shopping cart, discard cart contents in session
        $order = ShoppingCart::save_current_order();
        ShoppingCart::clear();
        // Write new record {@link Order} to database
        $form->saveInto($order);
        $order->write();
        // Save payment data from form and process payment
        $form->saveInto($payment);
        $payment->OrderID = $order->ID;
        $payment->Amount = $order->Total();
        $payment->write();
        // Process payment, get the result back
        $result = $payment->processPayment($data, $form);
        // isProcessing(): Long payment process redirected to another website (PayPal, Worldpay)
        if ($result->isProcessing()) {
            return $result->getValue();
        }
        if ($result->isSuccess()) {
            $order->sendReceipt();
        }
        Director::redirect($order->Link());
        return true;
    }
Ejemplo n.º 2
0
    /**
     * Process the items in the shopping cart from session,
     * creating a new {@link Order} record, and updating the
     * customer's details {@link Member} record.
     *
     * {@link Payment} instance is created, linked to the order,
     * and payment is processed {@link Payment::processPayment()}
     *
     * @param array $data Form request data submitted from OrderForm
     * @param Form $form Form object for this action
     * @param HTTPRequest $request Request object for this action
     */
    function processOrder($data, $form, $request)
    {
        $paymentClass = !empty($data['PaymentMethod']) ? $data['PaymentMethod'] : null;
        $payment = class_exists($paymentClass) ? new $paymentClass() : null;
        if (!($payment && $payment instanceof Payment)) {
            user_error(get_class($payment) . ' is not a valid Payment object!', E_USER_ERROR);
            //TODO: be more graceful with errors
        }
        $this->saveDataToSession($data);
        //save for later if necessary
        //check for cart items
        if (!ShoppingCart::has_items()) {
            $form->sessionMessage(_t('OrderForm.NoItemsInCart', 'Please add some items to your cart'), 'bad');
            Director::redirectBack();
            return false;
        }
        //check that price hasn't changed
        $oldtotal = ShoppingCart::current_order()->Total();
        // Create new Order from shopping cart, discard cart contents in session
        $order = ShoppingCart::current_order();
        if ($order->Total() != $oldtotal) {
            $form->sessionMessage(_t('OrderForm.PriceUpdated', 'The order price has been updated'), 'warning');
            Director::redirectBack();
            return false;
        }
        $member = Member::currentUser();
        if (!$member) {
            if (self::$user_membership_optional) {
                if ($this->userWantsToBecomeMember($data, $form)) {
                    $member = EcommerceRole::ecommerce_create_or_merge($data);
                }
                //otherwise we assume they don't want to become a member
            } elseif (self::$force_membership) {
                //create member
                $member = EcommerceRole::ecommerce_create_or_merge($data);
            }
        }
        //if they are a member, or if they have filled out the member fields (password, save my details)
        // Create new OR update logged in {@link Member} record
        if ($member === false) {
            $form->sessionMessage(_t('OrderForm.MEMBEREXISTS', 'Sorry, a member already exists with that email address.
					If this is your email address, please log in first before placing your order.' . ' <a href="Security/lostpassword">Recover password.</a>'), 'bad');
            Director::redirectBack();
            return false;
        }
        //assiciate member with order, if there is a member now
        if ($member) {
            $member->write();
            $member->logIn();
            if ($member) {
                $payment->PaidByID = $member->ID;
            }
            $order->MemberID = $member->ID;
        }
        // Write new record {@link Order} to database
        $form->saveInto($order);
        $order->save();
        //sets status to 'Unpaid' //is it even necessary to have it's own function? ..just legacy code.
        $this->clearSessionData();
        //clears the stored session form data that might have been needed if validation failed
        // Save payment data from form and process payment
        $form->saveInto($payment);
        $payment->OrderID = $order->ID;
        $payment->PaidForID = $order->ID;
        $payment->PaidForClass = $order->class;
        $payment->Amount->Amount = $order->Total();
        $payment->write();
        //prepare $data - ie put into the $data array any fields that may need to be there for payment
        // Process payment, get the result back
        $result = $payment->processPayment($data, $form);
        // isProcessing(): Long payment process redirected to another website (PayPal, Worldpay)
        if ($result->isProcessing()) {
            return $result->getValue();
        }
        if ($result->isSuccess()) {
            $order->sendReceipt();
        }
        Director::redirect($order->Link());
        return true;
    }