Вход Регистрация
Файл: mg-core/controllers/order.php
Строк: 331
<?php

/**
 * Контроллер: Order
 *
 * Класс Controllers_Order обрабатывает действия пользователей на 
 * странице оформления заказа.
 * - Производит проверку ввденых данных в форму оформления заказа;
 * - Добавляет заказ в базу данных сайта;
 * - Для нового покупателя производится регистрация пользователя;
 * - Отправляет письмо с подтверждением заказа на указанный адрес покупателя 
 * и администратору сайта с составом заказа;
 * - Очищает корзину товаров, при успешном оформлении заказа;
 * - Перенаправляет на страницу с сообщеним об успешном оформлении заказа;
 * - Генерирует данные для страниц успешной и неудавшейся электронной оплаты 
 * товаров.
 *
 * @author Авдеев Марк <mark-avdeev@mail.ru>
 * @package moguta.cms
 * @subpackage Controller
 */
class Controllers_Order extends BaseController {

  function 
__construct() {

    
// Модель для работы заказом.
    
$model = new Models_Order;

    
// Печать заказа в квитанцию.
    
if (isset($_POST['printQittance'])) {
      
$model->printQittance();
    }
    
    
// Запрос электронных товаров
    
$fileToOrder null;
    if (isset(
$_REQUEST['getFileToOrder'])) {
      
$electroInfo $model->getFileToOrder($_REQUEST['getFileToOrder']);
    
      if(
$electroInfo === false){
        
$infoMsg "Для просмотра страницы необходимо зайти на сайт под пользователем сделавшим заказ №".$_REQUEST['getFileToOrder'];
      }
      
      if(
is_array($electroInfo) && empty($electroInfo)){
        
$infoMsg =  "Заказ №".$_REQUEST['getFileToOrder']." не содержит электронных товаров или ожидает оплаты!";   
      };
      
      if(
is_array($electroInfo) && !empty($electroInfo)){
        
$infoMsg =  "Скачать электронные товары для заказа №".$_REQUEST['getFileToOrder']."";   
      };
      
$fileToOrder = array('infoMsg'=>$infoMsg'electroInfo'=>$electroInfo);   
    }
    
    
// пришел запрос на скачивание электронного товара
    
if (isset($_REQUEST['link'])) {
      
$model->getFileByMd5($_REQUEST['link']);
    }
    
    
    

    
// Первый экран - Оформление заказа.
    
$step 1;

    
// Если пришли данные с формы оформления заказа.
    
if (isset($_POST['toOrder'])) {
      if (empty(
$_SESSION['cart'])) {
        
MG::redirect('/cart');
      }

      
// Если параметры введены корректно, то создается новый заказ.
      
if ($error $model->isValidData($_POST)) {
        
$msg $error;
      } else {
        
// Второй экран - оплата заказа
        
$step 2;
        
$orderId $model->addOrder();
        
$summ $model->summ $model->delivery_cost;
        
$pay $model->payment;
        
$paramArray $model->getParamArray($pay$orderId$summ);
      }
    }

    
// Обработка действия при переходе по ссылке подтверждения заказа.
    
if ($id URL::getQueryParametr('id')) {
      
$info $this->confirmOrder($id);
      
$msg $info['msg'];
      
$userEmail $info['userEmail'];
      
// Третий экран - подтверждение заказа по ссылке из письма.
      
$step 3;
    }

    
// Запрос оплаты из ЛК.
    
if (URL::getQueryParametr('pay')) {
      
// Четвертый экран - Запрос оплаты из ЛК.
      
$step 4;
      
$pay URL::getQueryParametr('paymentId');
      
$orderId URL::getQueryParametr('orderID');
      
$order $model->getOrder(' id = '.DB::quote($orderIdtrue));
      
$summ URL::getQueryParametr('orderSumm');
      
$summ $order[$orderId]['summ'] * $order[$orderId]['delivery_cost'] * 1;
      
$paramArray $model->getParamArray($pay$orderId$summ);
    }

    
// Если пользователь авторизован, то заполняем форму личными даными.
    
if (User::isAuth()) {
      
$userInfo User::getThis();
      
$_POST['email'] = $_POST['email'] ? $_POST['email'] : $userInfo->email;
      
$_POST['phone'] = $_POST['phone'] ? $_POST['phone'] : $userInfo->phone;
      
$_POST['fio'] = $_POST['fio'] ? $_POST['fio'] : $userInfo->name.' '.$userInfo->sname;
      
$_POST['address'] = $_POST['address'] ? $_POST['address'] : $userInfo->address;
      if (
$userInfo->inn) {
        
$_POST['customer'] = 'yur';
      }

      
$_POST['yur_info']['adress'] = $userInfo->adress;
      
$_POST['yur_info']['inn'] = $userInfo->inn;
      
$_POST['yur_info']['kpp'] = $userInfo->kpp;
      
$_POST['yur_info']['bank'] = $userInfo->bank;
      
$_POST['yur_info']['bik'] = $userInfo->bik;
      
$_POST['yur_info']['ks'] = $userInfo->ks;
      
$_POST['yur_info']['rs'] = $userInfo->rs;
    }

    
// Обработка ajax запроса из шаблона.
    
if ('getPaymentByDeliveryId' == URL::getQueryParametr('action')) {
      
$this->getPaymentByDeliveryId();
    }

    
// Обработка ajax запроса из шаблона.
    
if ('getEssentialElements' == URL::getQueryParametr('action')) {
      
$this->getEssentialElements();
    }

    
$this->includeIconsPack();
    
// Массив способов доставки.    
    
$deliveryArray $this->getDelivery();
    
// Массив способов оплаты.
    
$paymentTable $this->getPaymentTable($deliveryArray);
    
$orderInfo $model->getOrder(PREFIX.'order.id = "'.$orderId.'"');
    
$userInfo USER::getUserInfoByEmail($orderInfo[$orderId]['user_email']);
    
$settings MG::get('settings');

    
// Массив параметров для отображения в представлении.
    
$this->data = array(
      
'active' => !empty($userEmail) ? $userEmail ''//состояние активации пользователя.
      
'msg' => !empty($msg) ? $msg ''//сообщение.
      
'step' => !empty($step) ? $step ''//стадия оформления заказа.
      
'delivery' => !empty($deliveryArray) ? $deliveryArray ''//массив способов доставки.
      
'paymentArray' => !empty($paymentTable) ? $paymentTable ''//массив способов оплаты.
      
'paramArray' => !empty($paramArray) ? $paramArray ''//массив способов оплаты.
      
'id' => !empty($orderId) ? $orderId ''//id заказа.
      
'summ' => !empty($summ) ? $summ ''//сумма заказа.
      
'pay' => !empty($pay) ? $pay ''//
      
'payMentView' => $this->getPaymentView($pay), //
      
'currency' => $settings['currency'],
      
'userInfo' => $userInfo,
      
'orderInfo' => $orderInfo,
      
'fileToOrder' => $fileToOrder,   
      
'meta_title' => 'Оформление заказа',
      
'meta_keywords' => !empty($model->currentCategory['meta_keywords']) ? $model->currentCategory['meta_keywords'] : "заказы,заявки,оформить,оформление заказа",
      
'meta_desc' => !empty($model->currentCategory['meta_desc']) ? $model->currentCategory['meta_desc'] : "Оформление заказа происходит в несколько этапов. 1 - ввод личных данных покупателя, 2 - оплата заказа.",
    );
  }

  
/**
   * Возвращает путь к странице с формой оплаты.
   * @param type $pay - id способа оплаты.
   * @return string - путь к странице с формой оплаты.
   */
  
public function getPaymentView($pay) {
    switch (
$pay) {
      case 
1:
        
$payMentView 'mg-pages/payment/webmoney.php';
        break;
      case 
2:
        
$payMentView 'mg-pages/payment/yandex.php';
        break;
      case 
5:
        
$payMentView 'mg-pages/payment/robokassa.php';
        break;
      case 
6:
        
$payMentView 'mg-pages/payment/qiwi.php';
        break;
      case 
7:
        
$payMentView 'mg-pages/payment/quittance.php';
        break;
      case 
8:
        
$payMentView 'mg-pages/payment/interkassa.php';
        break;
    }
    return 
$payMentView;
  }

  
/**
   * Возвращает сообщение о статусе заказа "Подтвержден".
   * @param type $pay - id заказа.
   * @return mixed - сообщение и email пользователя.
   */
  
public function confirmOrder($id) {
    
// Модель для работы заказом.
    
$model = new Models_Order;
    
// Информация о заказе по переданному id.
    
$orderInfo $model->getOrder(PREFIX.'order.id = "'.$id.'"');
    
$hash URL::getQueryParametr('sec');
    
// Информация о пользователе, сделавший заказ .
    
$orderUser USER::getUserInfoByEmail($orderInfo[$id]['user_email']);
    
// Если присланный хэш совпадает с хэшом из БД для соответствующего id.
    
if ($orderInfo[$id]['confirmation'] == $hash) {
      
// Если статус заказа "Не подтвержден".
      
if (== $orderInfo[$id]['status_id']) {
        
// Подтверждаем заказ.
        
$model->setOrderStatus($id1);
        
$orderId $id;
        
$msg 'Ваш заказ №'.$orderId.' подтвержден и передан на обработку. <br>
          Посмотреть статус заказа Вы можете в <a href="'
.SITE.'/personal">личном кабинете</a>.';
      } else {
        
$msg 'Заказ уже подтвержден и находится в работе. <br>
          Посмотреть статус заказа Вы можете в <a href="'
.SITE.'/personal">личном кабинете</a>.';
      }
      if (!
$orderUser->activity) {
        
$userEmail $orderUser->email;
        
$_SESSION['id'] = $orderUser->id;
      }
    } else {
      
$msg 'Некорректная ссылка.<br> Заказ не подтвержден<br>';
    }

    
$result = array(
      
'msg' => $msg,
      
'userEmail' => $userEmail,
    );
    return 
$result;
  }

  
/**
   * Возвращает массив доступных способов доставки.
   * @return mixed массив доступных способов доставки .
   */
  
public function getDelivery() {
    
$result = array();

    
// Модель для работы заказом.
    
$model = new Models_Order;
    
$cart = new Models_Cart;
    
$cartSumm $cart->getTotalSumm();

    foreach (
$model->getDeliveryMethod() as $id => $delivery) {  
      if (
$delivery['free'] != && $delivery['free'] <= $cartSumm) {
        
$delivery['cost'] = 0;
      }

      if (!
$delivery['activity']) {
        continue;
      }

      if (isset(
$_POST['delivery']) && $_POST['delivery'] == $id) {
        
$delivery['checked'] = 1;
      }

      
// Заполнение массива способов доставки.
      
$result[$delivery['id']] = $delivery;
    }

    
// Если доступен только один способ доставки, то он будет выделен.
    
if (=== count($result)) {
      
$deliveryId array_keys($result);
      
$result[$deliveryId[0]]['checked'] = 1;
    }

    return 
$result;
  }

  
/**
   * Возвращает массив доступных способов оплаты.
   * @return mixed массив доступных способов оплаты.
   */
  
public function getPayment() {
    
$result = array();

    
// Модель для работы заказом.
    
$model = new Models_Order;

    
$i 1;
    
// Колическтво активных методов оплаты.
    
$countPaymentMethod 0;
    
$allPayment $model->getPaymentBlocksMethod();
    foreach (
$allPayment as $payment) {
      
$i++;
      if (
$_POST['payment'] && !empty($deliveryArray)) {
        
$delivArray json_decode($payment['deliveryMethod'], true);
        if (!
$delivArray[$_POST['delivery']])
          continue;
      }

      if (!
$payment['activity']) {
        continue;
      }

      if (
$_POST['payment'] == $payment['id']) {
        
$payment['checked'] = 1;
      }

      
// Заполнение массива способов оплаты.      
      
if($payment['id']==3||$payment['id']==6||$payment['id']==7||$payment['id']==4){
        
$result[$payment['id']] = $payment;
      }
      
$countPaymentMethod++;
    }
    return 
$result;
  }

  
/**
   * Возвращает массив доступных способов оплаты с учетом количества 
   * способов доставки.
   * @return mixed массив доступных способов оплаты.
   */
  
public function getPaymentTable($deliveryArray) {
    
$result = array();
    
// Массив способов оплаты.
    
$paymentArray $this->getPayment();

    
// Если доступен только один способ доставки.
    
if (== count($deliveryArray)) {
      
$deliveryId array_keys($deliveryArray);
      foreach (
$paymentArray as $payment) {
        if(
$payment['id']==3||$payment['id']==6||$payment['id']==7||$payment['id']==4){
          
$delivArray json_decode($payment['deliveryMethod'], true);
          if (!
$delivArray[$deliveryId[0]]) {
            continue;
         }
        
$result[$payment['id']] = $payment;   
      }      
     }
    } else {
      
$result $paymentArray;
    }

    
// Если доступен только один способ оплаты, то он будет выделен.
    
if (== count($result)) {
      
$paymentId array_keys($result);
      
$result[$paymentId[0]]['checked'] = 1;
    }

    return 
$result;
  }

  
/**
   * Используется при AJAX запросе, 
   * возвращает html список способов оплаты в зависимости от 
   * выбранного способа доставки.
   */
  
public function getPaymentByDeliveryId() {
    
$deliveryId $_POST['deliveryId'];
    
$countPaymentMethod 0//колическтво активных методов оплаты

    
$paymentTable '';
    foreach (
$this->getPayment() as $payment) {
      
$delivArray json_decode($payment['deliveryMethod'], true);
      if (!
$delivArray[$deliveryId] || !$payment['activity']) {
        continue;
      }
      
$paymentTable .= '
        <li class="noneactive">
          <label>
          <input type="radio" name="payment" rel value='
.$payment['id'].'>'.
        
$payment['name'].
        
'</label>
          <span class="icon-payment-'
.$payment['id'].'"></span>
        </li>'
;
      
$countPaymentMethod++;
    }

    if (
== $countPaymentMethod) {
      
$paymentTable str_replace('class="noneactive"''class="active"'$paymentTable);
      
$paymentTable str_replace('rel''checked'$paymentTable);
    }

    
$result = array(
      
'status' => true,
      
'paymentTable' => $paymentTable
    
);
    echo 
json_encode($result);
    
MG::disableTemplate();
    exit;
  }

  
/**
   * Используется при AJAX запросе.
   */
  
public function getEssentialElements() {
    
$paymentId $_POST['paymentId'];
    
$paramArray $model->getParamArray($paymentId$orderId$summ);
    
$result = array(
      
'name' => $paramArray[0]['name'],
      
'value' => $paramArray[0]['value']
    );
    echo 
json_encode($result);
    
MG::disableTemplate();
    exit;
  }

  
/**
   * Подключает набор иконок для способов оплаты.
   */
  
public function includeIconsPack() {
    
/* Иконки оплаты для сайта */
    
$style '.icon-payment-1, .icon-payment-2,.icon-payment-5, .icon-payment-6, .icon-payment-7,.icon-payment-8{
    width: 30px;height: 20px;display: inline-block;margin: 0 0 0 5px;position: relative;top: 5px;}
    .icon-payment-1{background: url("mg-admin/design/images/payments/webmoney-icon.png");}
    .icon-payment-2{background: url("mg-admin/design/images/payments/yandex-icon.png");}   
    .icon-payment-5{background: url("mg-admin/design/images/payments/robokassa-icon.png");width: 63px;height: 19px;}
    .icon-payment-6{background: url("mg-admin/design/images/payments/qiwi-icon.png");}
    .icon-payment-7{width: 92px; height: 19px;background: url("mg-admin/design/images/payments/alfabank-icon.png");}
    .icon-payment-8{width: 92px; height: 19px;background: url("mg-admin/design/images/payments/inter-icon.png");}'
;
    
mgAddMeta('<style>'.$style.'</style>');
  }

}
Онлайн: 0
Реклама