This is an old revision of the document!
<?php
/**
* ТДС корзины с объединением всех шагов на одной странице v. 6.2
* обязательно использовать с соответствующей страницей настроек ТДС
* для вывода типов доставки и пересчета используется ajax
*
* @author Kuts Artem, KAD Systems (©) 2014
* @date 01-09-2014
*/
// Все настройки переехали во вкладку Настройки
/*
* Для использования captcha необходимо в xsl шаблон вывода платежных систем
* вставить код:
<!-- Обработка CAPTCHA -->
<xsl:if test="captcha_id != 0 and siteuser_id = 0">
<div class="row">
<div class="caption"></div>
<div class="field">
<img id="comment" class="captcha" src="/captcha.php?id={//captcha_id}&height=30&width=100" title="Контрольное число" name="captcha"/>
<div class="captcha">
<img src="/images/refresh.png" /> <span onclick="$('#comment').updateCaptcha('{captcha_id}', 30); return false">Показать другое число</span>
</div>
</div>
</div>
<div class="row">
<div class="caption">
Контрольное число<sup><font color="red">*</font></sup>
</div>
<div class="field">
<input type="hidden" name="captcha_id" value="{captcha_id}"/>
<input type="text" name="captcha" size="15"/>
</div>
</div>
</xsl:if>
*/
?>
<style>
input.input_error{
border: 1px solid red!important;
}
</style>
<script>
$(document).ready(function(){
// Получить данные формы
getFormData = function($type)
{
return $("form[name='order']").serialize() + "&ajaxget=" + $type;
}
// Загрузить корзину
refreshCart = function()
{
$.loadingScreen('show');
var formData = getFormData("");
$("#cart").load(
"",
formData + "&ajaxget=cart"
,
function(){
$.loadingScreen('hide');
<?php
if (SHORTCART_CARTMODE == 2)
{
?>
refreshDeliveries();
<?php
}
?>
}
);
// Наблюдатель после перезагрузки корзины
if (typeof afterReloadCart == 'function')
{
afterReloadCart();
}
}
// Загрузить способы оплаты
refreshPayments = function()
{
// Запоминаем выбранный
var $active_val = $("#payment input[type=radio]:checked").data("id");
$.loadingScreen('show');
var formData = getFormData("payment");
$("#payment").load(
"",
formData
,
function(){
// Возвращаем выбранный
var $radiobtn = $("#payment input[type='radio'][data-id='" + $active_val + "']");
if ($radiobtn != "undefined")
{
$radiobtn.attr("checked", "checked");
}
$.loadingScreen('hide');
}
);
}
// Загрузить способы доставки
refreshDeliveries = function()
{
// Запоминаем выбранный
var $active_val = $("#delivery input[type=radio]:checked").data("id");
$.loadingScreen('show');
var formData = getFormData("delivery");
$("#delivery").load(
"",
formData
,
function(){
$.loadingScreen('hide');
// Возвращаем выбранный
var $radiobtn = $("#delivery input[type='radio'][data-id='" + $active_val + "']");
if ($radiobtn != "undefined")
{
$radiobtn.attr("checked", "checked");
}
refreshPayments();
}
);
}
$("[name^='quantity'], [name='coupon_text']").live('change', function(){
refreshCart();
});
// Пересчитать
$('[name="recount"]').live('click', function(){
refreshCart();
return false;
});
// Подгрузка типов доставки
$("#shop_country_location_city_id, #shop_country_location_id, #shop_country_id").change(function(){
refreshDeliveries();
});
// Подгрузка платежных систем
$("[name='shop_delivery_condition_id']").live("click", function(){
refreshPayments();
});
// Обновление районов
$.loadLocations('.', $("#shop_country_id").val());
$("#shop_country_id").change();
// Валидация
//Если не работает валидация, закомментировать строчку ниже
if (typeof $.validate == 'function')
{
$("form[name='order']").validate({
focusInvalid: true,
errorClass: "input_error",
errorPlacement: function(error, element) {}
})
}
});
</script>
<?php
$Shop_Cart_Controller_Show = Core_Page::instance()->object;
$oShop = $Shop_Cart_Controller_Show->getEntity();
// ------------------------------------------------
// Подготовка редиректа для PayPal
// ------------------------------------------------
if (isset($_REQUEST['paymentType']))
{
// Получаем ID заказа
$order_id = intval(Core_Array::getRequest('order_id'));
$oShop_Order = Core_Entity::factory('Shop_Order')->find($order_id);
if (!is_null($oShop_Order->id))
{
// Вызов обработчика платежной системы
Shop_Payment_System_Handler::factory($oShop_Order->Shop_Payment_System)
->shopOrder($oShop_Order)
->paymentProcessing();
}
}
// ------------------------------------------------
// Подготовка редиректа для Оплаты с лицевого счета
// ------------------------------------------------
if (isset($_REQUEST['Pay']))
{
// Получаем ID заказа
$order_id = intval(Core_Array::getRequest('order_id'));
$oShop_Order = Core_Entity::factory('Shop_Order')->find($order_id);
if (!is_null($oShop_Order->id))
{
// Вызов обработчика платежной системы
Shop_Payment_System_Handler::factory($oShop_Order->Shop_Payment_System)
->shopOrder($oShop_Order)
->paymentProcessing();
}
}
// ------------------------------------------------
// Обработка уведомления об оплате от RBK Money
// ------------------------------------------------
if ((isset($_POST['paymentStatus']) || isset($_GET['PayPalOrderConfirmation'])) && !isset($_REQUEST['paymentType']))
{
// Получаем ID заказа
$order_id = intval(Core_Array::getPost('orderId'));
$oShop_Order = Core_Entity::factory('Shop_Order')->find($order_id);
if (!is_null($oShop_Order->id))
{
// Вызов обработчика платежной системы
Shop_Payment_System_Handler::factory($oShop_Order->Shop_Payment_System)
->shopOrder($oShop_Order)
->paymentProcessing();
}
}
// ------------------------------------------------
// Обработка уведомления об оплате от WebMoney
// ------------------------------------------------
if (isset($_POST['LMI_PAYEE_PURSE']))
{
// Получаем ID заказа
$order_id = intval(Core_Array::getPost('LMI_PAYMENT_NO'));
$oShop_Order = Core_Entity::factory('Shop_Order')->find($order_id);
if (!is_null($oShop_Order->id))
{
// Вызов обработчика платежной системы
Shop_Payment_System_Handler::factory($oShop_Order->Shop_Payment_System)
->shopOrder($oShop_Order)
->paymentProcessing();
}
}
// ------------------------------------------------
// Обработка уведомления об оплате от ROBOKASSA
// ------------------------------------------------
if (isset($_REQUEST['SignatureValue']) && isset($_REQUEST['Culture']))
{
// Получаем ID заказа
$order_id = intval(Core_Array::getRequest('InvId'));
$oShop_Order = Core_Entity::factory('Shop_Order')->find($order_id);
if (!is_null($oShop_Order->id))
{
// Вызов обработчика платежной системы
Shop_Payment_System_Handler::factory($oShop_Order->Shop_Payment_System)
->shopOrder($oShop_Order)
->paymentProcessing();
}
}
// ------------------------------------------------
// ------------------------------------------------
// Обработка уведомления об оплате от Authorize.net
// ------------------------------------------------
if (isset($_POST['x_response_code']))
{
// Получаем ID заказа
$order_id = intval(Core_Array::getPost('order_id'));
$oShop_Order = Core_Entity::factory('Shop_Order')->find($order_id);
if (!is_null($oShop_Order->id))
{
// Вызов обработчика платежной системы
Shop_Payment_System_Handler::factory($oShop_Order->Shop_Payment_System)
->shopOrder($oShop_Order)
->paymentProcessing();
}
}
// ------------------------------------------------
// Обработка формы "Оплата через систему QIWI Кошелек"
// ------------------------------------------------
if (isset($_POST['qiwi_payment_options']))
{
// Получаем ID заказа
$order_id = intval(Core_Array::getPost('order_id'));
$oShop_Order = Core_Entity::factory('Shop_Order')->find($order_id);
if (!is_null($oShop_Order->id))
{
// Вызов обработчика платежной системы
Shop_Payment_System_Handler::factory($oShop_Order->Shop_Payment_System)
->shopOrder($oShop_Order)
->paymentProcessing();
return TRUE;
}
}
// ------------------------------------------------
// Вывод информации о статусе платежа после его совершения и перенаправления с платежной системы
// ------------------------------------------------
if (isset($_REQUEST['payment']) || (isset($_GET['action']) && ($_GET['action'] == 'PaymentSuccess' || $_GET['action'] == 'PaymentFail')))
{
// Получаем ID заказа
if (isset($_REQUEST['order_id']))
{
$order_id = intval(Core_Array::getRequest('order_id'));
}
//от Яндекса
elseif(isset($_GET['orderNumber']))
{
$order_id = intval(Core_Array::getGet('orderNumber'));
}
else
{
$order_id = intval(Core_Array::getRequest('InvId'));
}
$oShop_Order = Core_Entity::factory('Shop_Order')->find($order_id);
if (Core::moduleIsActive('siteuser') && !SHORTCART_IGNOREUSERS)
{
$siteuser_id = 0;
$oSiteuser = Core_Entity::factory('Siteuser')->getCurrent();
if ($oSiteuser)
{
$siteuser_id = $oSiteuser->id;
}
}
else
{
$siteuser_id = FALSE;
}
// Если заказ принадлежит текущему авторизированному пользователю
if ($oShop_Order->siteuser_id == $siteuser_id)
{
if (Core_Array::getRequest('payment') == 'success' || Core_Array::getRequest('action') == 'PaymentSuccess')
{
?><h1>Подтверждение платежа</h1>
<p>Спасибо, информация об оплате заказа <strong>№ <?php echo $oShop_Order->invoice?></strong>
получена.</p>
<?php
}
else
{
?><h1>Платеж не получен</h1>
<p>К сожалению при оплате заказа <strong>№ <?php echo $oShop_Order->invoice?></strong> произошла ошибка.</p>
<?php
}
}
// Для случаев, когда отключен модуль "Пользователи сайта"
elseif ($siteuser_id === FALSE)
{
?><h1>Подтверждение платежа</h1>
<p>Благодарим за посещение нашего магазина!</p>
<?php
}
else
{
?><h1>Ошибка</h1>
<p>Неверный номер заказа!</p>
<?php
}
// Прерываем выполнение типовой динамической страницы
return TRUE;
}
$xslName = Core_Array::get(Core_Page::instance()->libParams, 'cartXsl');
// Пересчитываем количество товара в корзине
$countGoods = 0;
foreach (Shop_Cart_Controller::instance()->getAll($oShop) as $oGood)
{
$oShop_Item = Core_Entity::factory('Shop_Item')->find($oGood->shop_item_id);
if(!is_null($oShop_Item->id))
{
$countGoods += $oGood->quantity;
}
}
// Если режим в 2 шага, выводим все на главной
$error_message = "";
if (SHORTCART_CARTMODE == 2 && !Core_Array::getPost('step') && $countGoods > 0 || Core_Array::getPost('recount'))
{
$step = 1;
} else
{
if (!SHORTCART_USECAPTCHA || (SHORTCART_USECAPTCHA && Core_Captcha::valid(Core_Array::getPost('captcha_id'), Core_Array::getPost('captcha'))))
{
$step = Core_Array::getPost('step');
} else
{
$step = 1;
$error_message = SHORTCART_ERROR_WC;
}
}
switch ($step)
{
// Адрес доставки
case 1:
// Все шаги должны содержать единую форму, поэтому из xsl шаблонов формы желательно убрать
?>
<form name="order" method="POST" action=".">
<?php
if (SHORTCART_CARTMODE == 2)
{
?>
<div id="cart">
<?php
$Shop_Cart_Controller_Show
->couponText(Core_Array::get(Core_Array::get($_SESSION, 'hostcmsOrder', array()), 'coupon_text'))
->xsl(
Core_Entity::factory('Xsl')->getByName($xslName)
)
->show();
?>
</div>
<?php
}
// Сбрасываем информацию о последнем заказе
$_SESSION['last_order_id'] = 0;
// Адрес доставки
$Shop_Address_Controller_Show = new Shop_Address_Controller_Show($oShop);
$Shop_Address_Controller_Show->xsl(
Core_Entity::factory('Xsl')->getByName(
Core_Array::get(Core_Page::instance()->libParams, 'deliveryAddressXsl')
)
)
->show();
// /Адрес доставки
// Типы доставки / ajax обработчик в настройках
?>
<div id="delivery">
<?php
$Shop_Delivery_Controller_Show = new Shop_Delivery_Controller_Show($oShop);
$Shop_Delivery_Controller_Show
->couponText(Core_Array::get(Core_Array::get($_SESSION, 'hostcmsOrder', array()), 'coupon_text'))
->setUp()
->xsl(
Core_Entity::factory('Xsl')->getByName(
Core_Array::get(Core_Page::instance()->libParams, 'deliveryXsl')
)
)
->show();
?>
</div>
<?php
// /Типы доставки
// Платежные системы / ajax обработчик в настройках
?>
<div id="payment">
<?php
$Shop_Payment_System_Controller_Show = new Shop_Payment_System_Controller_Show($oShop);
if (SHORTCART_USECAPTCHA)
{
$Shop_Payment_System_Controller_Show->addEntity(
Core::factory('Core_Xml_Entity')
->name('siteuser_id')
->value((Core::moduleIsActive('siteuser') && !is_null(Core_Entity::factory('Siteuser')->getCurrent()))?Core_Entity::factory('Siteuser')->getCurrent()->id:0)
)->addEntity(
Core::factory('Core_Xml_Entity')
->name('captcha_id')
->value(Core_Captcha::getCaptchaId())
);
}
$Shop_Payment_System_Controller_Show->addEntity(
Core::factory('Core_Xml_Entity')
->name('message')
->value($error_message)
);
$Shop_Payment_System_Controller_Show
->xsl(
Core_Entity::factory('Xsl')->getByName(
Core_Array::get(Core_Page::instance()->libParams, 'paymentSystemXsl')
)
)
->show();
?>
</div>
<?php
// /Платежные системы
?>
</form>
<?php
break;
// Окончание оформления заказа
case 4:
$_SESSION['hostcmsOrder']['postcode'] = strval(Core_Array::getPost('postcode'));
$_SESSION['hostcmsOrder']['address'] = strval(Core_Array::getPost('address'));
$_SESSION['hostcmsOrder']['surname'] = strval(Core_Array::getPost('surname'));
$_SESSION['hostcmsOrder']['name'] = strval(Core_Array::getPost('name'));
$_SESSION['hostcmsOrder']['patronymic'] = strval(Core_Array::getPost('patronymic'));
$_SESSION['hostcmsOrder']['company'] = strval(Core_Array::getPost('company'));
$_SESSION['hostcmsOrder']['phone'] = strval(Core_Array::getPost('phone'));
$_SESSION['hostcmsOrder']['fax'] = strval(Core_Array::getPost('fax'));
$_SESSION['hostcmsOrder']['email'] = strval(Core_Array::getPost('email'));
$_SESSION['hostcmsOrder']['description'] = strval(Core_Array::getPost('description'));
$_SESSION['hostcmsOrder']['shop_delivery_condition_id'] = intval(Core_Array::getPost('shop_delivery_condition_id', 0));
$shop_payment_system_id = $_SESSION['hostcmsOrder']['shop_payment_system_id'] = intval(Core_Array::getPost('shop_payment_system_id', 0));
// Additional order properties
$_SESSION['hostcmsOrder']['properties'] = array();
$oShop_Order_Property_List = Core_Entity::factory('Shop_Order_Property_List', $oShop->id);
$aProperties = $oShop_Order_Property_List->Properties->findAll();
foreach ($aProperties as $oProperty)
{
// Св-во может иметь несколько значений
$aPropertiesValue = Core_Array::getPost('property_' . $oProperty->id);
if (!is_null($aPropertiesValue))
{
!is_array($aPropertiesValue) && $aPropertiesValue = array($aPropertiesValue);
foreach ($aPropertiesValue as $sPropertyValue)
{
$_SESSION['hostcmsOrder']['properties'][] = array($oProperty->id, $sPropertyValue);
}
}
}
// Если выбрана платежная система
if ($_SESSION['hostcmsOrder']['shop_payment_system_id'])
{
Shop_Payment_System_Handler::factory(
Core_Entity::factory('Shop_Payment_System', $shop_payment_system_id)
)
->orderParams($_SESSION['hostcmsOrder'])
->execute();
}
else
{
?><h1>Ошибка! Не указана ни одна платежная система.</h1><?php
}
break;
default:
?>
<form name="order" method="POST" action=".">
<div id="cart">
<?php
$Shop_Cart_Controller_Show
->couponText(Core_Array::get(Core_Array::get($_SESSION, 'hostcmsOrder', array()), 'coupon_text'))
->xsl(
Core_Entity::factory('Xsl')->getByName($xslName)
)
->show();
?>
</div>
</form>
<?php
}
// Блок авторизации пользователя
if (Core::moduleIsActive('siteuser') && !SHORTCART_IGNOREUSERS && $step != 4)
{
$oSiteuser = Core_Entity::factory('Siteuser')->getCurrent();
if (is_null($oSiteuser))
{
// Авторизация
$Siteuser_Controller_Show = new Siteuser_Controller_Show(
Core_Entity::factory('Siteuser')
);
$Siteuser_Controller_Show
->location(Core::$url['path'])
->xsl(
Core_Entity::factory('Xsl')->getByName(Core_Array::get(Core_Page::instance()->libParams, 'userAuthorizationXsl'))
)
->show();
// Регистрация
$Siteuser_Controller_Show = new Siteuser_Controller_Show(
Core_Entity::factory('Siteuser')
);
$Siteuser_Controller_Show->xsl(
Core_Entity::factory('Xsl')->getByName(Core_Array::get(Core_Page::instance()->libParams, 'userRegistrationXsl'))
)
->location(Core::$url['path'])
->fastRegistration(TRUE)
->properties(TRUE)
//->showMaillists(TRUE)
->show();
}
}