'; /** Каже на зміну яких ордер статусів слати юзеру мила */ protected $_orderStatusesForUserMail = [ App_ECommerce_Order_Admin_Obj::STATUS_ORDER_SENT, ]; /** Каже на зміну яких ордер статусів слати юзеру мила */ protected $_paidStatusesForUserMail = [ App_ECommerce_Order_Admin_Obj::STATUS_PAID_YES, ]; protected $_initStatuses = []; protected function _init() { parent::_init(); $this->_messageTemplates[self::MSG_ORDER_STATUS_CHANGED] = 'Order status for selected item(s) has been changed'; $this->_messageTemplates[self::MSG_NO_DATA] = 'No selected items'; return $this; } /** * Return tabs object * * @static * @return App_ECommerce_Order_Admin_Tab */ public static function getTabs() { $options = ['sitemapSelector' => static::$_sitemapSelector]; return new App_ECommerce_Order_Admin_Tab($options); } protected function _doEdit() { $this->_postEdit(); $tabs = self::getTabs(); $url = BASE_URL_LANGUAGE . '/' . $tabs->getRootFullAlias() . '/' . $tabs->getDefaultTabAlias() . '/edit/' . $this->_getDataObj()->getPrimaryKey(); $this->redirect($url); } protected function _doNew() { if (false === $this->_getDataObj()->createEmptyOrder()) { $this->_setBackErrors($this->_getDataObj()->getErrors()); $this->_doBack(); } $this->_postNew(); $tabs = self::getTabs(); $url = BASE_URL_LANGUAGE . '/' . $tabs->getRootFullAlias() . '/' . $tabs->getDefaultTabAlias() . '/new/' . $this->_getDataObj()->getPrimaryKey(); $this->redirect($url); } protected function _addListItem() { $this->_doc->addScript('js/app/ECommerce/order/admin-action-form-toolbar.js'); return parent::_addListItem(); } protected function _getDefaultLinks() { $links = parent::_getDefaultLinks(); $params = []; if (($orderBy = Qs_Request::getGetValue('orderBy'))) { $params['orderBy'] = $orderBy; } $filter = $this->_dataObj->getFilter(); foreach ($filter as $field => $value) { if ($value) { $params[$field] = $value; } } $params['action'] = 'exportCsv'; $links['exportCsv'] = ['title' => 'Export to CSV', 'url' => $this->url($params)]; return $links; } protected function _doView() { $item = $this->_getDataObj()->getData(); if (empty($item)) { $this->_doc->display404(); } $form = $this->_getViewForm([ 'defaults' => $item, 'cancelUrl' => Qs_SiteMap::findFirst(static::$_sitemapSelector, 'url'), ]); $form->setDefaults(); if ($item['status'] == App_ECommerce_Order_Admin_Obj::STATUS_ORDER_CLOSED) { /** @var Zend_Form_Element $element */ foreach ($form->getElements() as $element) { $element->setAttribs([ 'disabled' => 'disabled', 'readonly' => 'readonly', ]); } } $item['adminForm'] = $form; $item['config'] = $this->getConfig()->toArray(); $item['printVersion'] = $this->_printVersion; $item['tpl'] = $this->getTemplate('view.tpl'); $item['backUrl'] = ($backUrl = $this->_getBackUrl(CURRENT_PAGE_FINAL)) ? $backUrl : CURRENT_PAGE_FINAL; $headerAppend = ' #' . $item['id'] . ' on ' . date('m/d/Y g:i A') . ': ' . ($item['paid'] == 'y' ? 'Paid' : 'Not Paid' ); $this->_doc->appendHeader($headerAppend); $this->_addItem($item); $this->_postView(); return $this; } protected function _doChangeOrderStatus() { return $this->_do404(); } protected function _doChangeOrderStatusAjax() { $result = $this->_changeStatus('status'); $this->_displayJson($result); exit; } protected function _doChangePaidStatus() { return $this->_do404(); } protected function _doChangePaidStatusAjax() { $result = $this->_changeStatus('paid'); $this->_displayJson($result); exit; } protected function _changeStatus($field) { $status = Qs_Request::getPostValue('value'); $selectedPrimary = Qs_Request::getPostValue('selectedPrimary'); if ($status && $selectedPrimary && is_array($selectedPrimary) && false !== ($updatedPrimary = $this->_getDataObj()->changeStatuses($selectedPrimary, $field, $status)) ) { $isError = false; $message = $this->_createMessage(self::MSG_ORDER_STATUS_CHANGED); $this->_setBackMessage($message); $this->_postChangeStatus($updatedPrimary, $field, $status); } else { $isError = true; $message = $this->_createMessage(self::MSG_NO_DATA); } return ['isError' => $isError, 'message' => $message]; } protected function _prepareMailData(array $data) { $data['orderId'] = htmlspecialchars($data['id']); return $data; } protected function _postChangeStatus($updatedPrimary, $field, $status) { if (is_array($updatedPrimary) && sizeof($updatedPrimary)) { if ($this->_checkNecessarySendMail($field, $status)) { foreach ($updatedPrimary as $primary) { if (!ctype_digit((string) $primary)) { continue; } $this->_getDataObj()->setPrimaryKey($primary); $order = $this->_getDataObj()->clearData()->getData(); if (is_array($order) && sizeof($order)) { $mailSuffix = $this->_getMailSuffix($field, $status); $this->sendUserNotification($order, $mailSuffix); } } } $this->_logChangeStatus($updatedPrimary); } return $this; } /** * @param array $orders list of orders id * @return App_ECommerce_Order_Admin_View */ protected function _logChangeStatus(array $orders) { if ($this->_hasLog && Qs_ViewController_Log::getEnabled() && $orders) { if (count($orders) > 1) { $message = 'Updated %itemsName% '; foreach ($orders as $id) { $message .= '#' . $id . ', '; } $message = substr($message, 0, -2); } else { $message = 'Updated %itemName% #' . reset($orders); } $this->_getLog()->setAction('changeStatus', $message); $this->_getLog()->write('changeStatus', $this->_getDataObj()->getObjectInfo()); } return $this; } protected function _checkNecessarySendMail($field, $status) { if (($field == 'status' && in_array($status, $this->_orderStatusesForUserMail)) || ($field == 'paid' && in_array($status, $this->_paidStatusesForUserMail)) ) { return true; } return false; } protected function _getMailSuffix($field, $status) { return ucfirst(($field == 'status' ? 'order' : 'paid')) . 'Status' . ($field == 'paid' ? (ucfirst(($status == 'n' ? 'no' : 'yes'))) : ucfirst($status)); } protected function _initFromForm(Qs_Form $form) { $this->_initStatuses = array_intersect_key( $this->_getDataObj()->getData(), array_flip(['status', 'paid']) ); return parent::_initFromForm($form); } protected function _postUpdate() { $data = $this->_getDataObj()->getData(); foreach (['paid', 'status'] as $field) { if ($this->_initStatuses[$field] != $data[$field]) { $this->_postChangeStatus([$this->_getDataObj()->getPrimaryKey()], $field, $data[$field]); } } return parent::_postUpdate(); } public function getRootFullAlias() { if (empty($this->_rootFullAlias)) { $this->_rootFullAlias = Qs_SiteMap::findFirst('', 'fullAlias'); } return $this->_rootFullAlias; } protected function _doCancelOrder() { $this->_getDataObj()->cancelOrder(); $this->_doBack(); } }