/** * @param SS_HTTPRequest $request */ public function run($request) { $email = $request->remaining(); $params = $request->allParams(); $url = Director::absoluteURL("dev/{$params['Action']}/{$params['TaskName']}", true); echo '<h2>Choose Email</h2>'; echo '<ul>'; foreach ($this->previewableEmails as $key => $method) { echo '<li><a href="' . $url . '/' . $method . '">' . $method . '</a></li>'; } echo '</ul><hr>'; if ($email && in_array($email, $this->previewableEmails)) { $order = Order::get()->first(); $notifier = OrderEmailNotifier::create($order)->setDebugMode(true); $method = "send{$email}"; echo $notifier->{$method}(); } else { } //this is a little hardcore way of ending the party, //but as it's only used for styling, it works for now die; }
/** * Takes an order from being a cart to awaiting payment. * * @param Member $member - assign a member to the order * * @return boolean - success/failure */ public function placeOrder() { if (!$this->order) { $this->error(_t("OrderProcessor.NoOrderStarted", "A new order has not yet been started.")); return false; } if (!$this->canPlace($this->order)) { //final cart validation return false; } if ($this->order->Locale) { ShopTools::install_locale($this->order->Locale); } // recalculate order to be sure we have the correct total $this->order->calculate(); if (ShopTools::DBConn()->supportsTransactions()) { ShopTools::DBConn()->transactionStart(); } //update status if ($this->order->TotalOutstanding(false)) { $this->order->Status = 'Unpaid'; } else { $this->order->Status = 'Paid'; } if (!$this->order->Placed) { $this->order->Placed = SS_Datetime::now()->Rfc2822(); //record placed order datetime if ($request = Controller::curr()->getRequest()) { $this->order->IPAddress = $request->getIP(); //record client IP } } // Add an error handler that throws an exception upon error, so that we can catch errors as exceptions // in the following block. set_error_handler(function ($severity, $message, $file, $line) { throw new ErrorException($message, 0, $severity, $file, $line); }, E_ALL & ~(E_STRICT | E_NOTICE)); try { //re-write all attributes and modifiers to make sure they are up-to-date before they can't be changed again $items = $this->order->Items(); if ($items->exists()) { foreach ($items as $item) { $item->onPlacement(); $item->write(); } } $modifiers = $this->order->Modifiers(); if ($modifiers->exists()) { foreach ($modifiers as $modifier) { $modifier->write(); } } //add member to order & customers group if ($member = Member::currentUser()) { if (!$this->order->MemberID) { $this->order->MemberID = $member->ID; } $cgroup = ShopConfig::current()->CustomerGroup(); if ($cgroup->exists()) { $member->Groups()->add($cgroup); } } //allow decorators to do stuff when order is saved. $this->order->extend('onPlaceOrder'); $this->order->write(); } catch (Exception $ex) { // Rollback the transaction if an error occurred if (ShopTools::DBConn()->supportsTransactions()) { ShopTools::DBConn()->transactionRollback(); } $this->error($ex->getMessage()); return false; } finally { // restore the error handler, no matter what restore_error_handler(); } // Everything went through fine, complete the transaction if (ShopTools::DBConn()->supportsTransactions()) { ShopTools::DBConn()->transactionEnd(); } //remove from session $cart = ShoppingCart::curr(); if ($cart && $cart->ID == $this->order->ID) { // clear the cart, but don't write the order in the process (order is finalized and should NOT be overwritten) ShoppingCart::singleton()->clear(false); } //send confirmation if configured and receipt hasn't been sent if (self::config()->send_confirmation && !$this->order->ReceiptSent) { $this->notifier->sendConfirmation(); } //notify admin, if configured if (self::config()->send_admin_notification) { $this->notifier->sendAdminNotification(); } // Save order reference to session OrderManipulation::add_session_order($this->order); return true; //report success }
/** * @deprecated 2.0 */ public function sendStatusChange($title, $note = null) { Deprecation::notice('2.0', 'Use OrderEmailNotifier instead'); $this->notifier->sendStatusChange($title, $note); }
public function onAfterWrite() { parent::onAfterWrite(); //create an OrderStatusLog if ($this->flagOrderStatusWrite) { $this->flagOrderStatusWrite = false; $log = OrderStatusLog::create(); // populate OrderStatusLog $log->Title = _t('ShopEmail.StatusChanged', 'Status for order #{OrderNo} changed to "{OrderStatus}"', '', array('OrderNo' => $this->Reference, 'OrderStatus' => $this->getStatusI18N())); $log->Note = _t('ShopEmail.StatusChange' . $this->Status . 'Note'); $log->OrderID = $this->ID; OrderEmailNotifier::create($this)->sendStatusChange($log->Title, $log->Note); $log->SentToCustomer = true; $this->extend('updateOrderStatusLog', $log); $log->write(); } }
public function testStatusUpdate() { $this->notifier->sendStatusChange('test subject'); $this->assertEmailSent('*****@*****.**', '*****@*****.**', _t('ShopEmail.StatusChangeSubject') . 'test subject'); }
public function testStatusUpdate() { $this->notifier->sendStatusChange('test subject'); $this->assertEmailSent('*****@*****.**', '*****@*****.**', 'test subject'); }
/** * Form action handler for CancelOrderForm. * * Take the order that this was to be change on, * and set the status that was requested from * the form request data. * * @param array $data The form request data submitted * @param Form $form The {@link Form} this was submitted on */ public function docancel($data, $form) { if (self::config()->allow_cancelling && $this->order->canCancel()) { $this->order->Status = 'MemberCancelled'; $this->order->write(); if (self::config()->email_notification) { OrderEmailNotifier::create($this->order)->sendCancelNotification(); } $this->controller->sessionMessage(_t("OrderForm.OrderCancelled", "Order sucessfully cancelled"), 'warning'); if (Member::currentUser() && ($link = $this->order->Link())) { $this->controller->redirect($link); } else { $this->controller->redirectBack(); } } }