Реализация AJAX-заказа из корзины
Код типовой динамической страницы
<script type="text/javascript">
/**
* Функция обратного вызова при авторизации пользователя
*/
function fCallBackSiteUser(responseJS)
{
if (typeof responseJS != 'undefined')
{
if (typeof responseJS.result != 'undefined')
{
var oDivMessage = document.getElementById('result');
if (oDivMessage)
{
oDivMessage.innerHTML = responseJS.result;
}
}
if (typeof responseJS.authorization_message != 'undefined')
{
var oDivMessage = document.getElementById('authorization_message');
if (oDivMessage)
{
oDivMessage.innerHTML = responseJS.authorization_message;
}
}
if (typeof responseJS.cart != 'undefined')
{
var oDivMessage = document.getElementById('cart');
if (oDivMessage)
{
oDivMessage.innerHTML = responseJS.cart;
}
}
}
}
function SetUserType()
{
var radio_group = document.getElementsByName('type_person');
// Частное лицо
if (radio_group[0].checked)
{
document.getElementById('authorization').style.display = "none";
document.getElementById('private_person_info').style.display = "block";
document.getElementById('legal_entity_info').style.display = "none";
document.getElementById('authorization_message').innerHTML = "";
radio_group[3].value = 'private_person';
}
// Юридическое лицо
if (radio_group[1].checked)
{
document.getElementById('authorization').style.display = "none";
document.getElementById('private_person_info').style.display = "block";
document.getElementById('legal_entity_info').style.display = "block";
document.getElementById('authorization_message').innerHTML = "";
radio_group[3].value = 'legal_entity';
}
// Зарегистрированный пользователь
if (radio_group[2].checked)
{
document.getElementById('authorization').style.display = "block";
document.getElementById('private_person_info').style.display = "none";
document.getElementById('legal_entity_info').style.display = "none";
radio_group[3].value = 'registered';
}
}
function ChangeSendFax()
{
var checkbox_send_fax = document.getElementById('send_fax_id');
if (checkbox_send_fax.checked)
{
document.getElementById('id_fax').style.display = "block";
}
else
{
document.getElementById('id_fax').style.display = "none";
}
}
function ChangeLoginPassword()
{
var login_password = document.getElementById('login_password_id');
if (login_password.checked)
{
document.getElementById('tr_login_password').style.display = "";
}
else
{
document.getElementById('tr_login_password').style.display = "none";
}
}
</script>
<?php
$shop = & singleton('shop');
######################################################
#### Обработка принятия заказа от платежной системы ###
######################################################
// Обработка уведомления об оплате от RUpay
if (isset($_POST['rupay_action']))
{
// Получаем ID заказа
$order_id = to_int($_POST['rupay_order_id']);
$order_row = $shop->GetOrder($order_id);
if ($order_row)
{
// Вызов обработчика платежной системы
$shop->ExecSystemsOfPayHandler($order_row['shop_system_of_pay_id']);
}
}
// Обработка уведомления об оплате от WebMoney
if (isset($_POST['LMI_PAYEE_PURSE']))
{
// Получаем ID заказа
$order_id = to_int($_POST['LMI_PAYMENT_NO']);
$order_row = $shop->GetOrder($order_id);
if ($order_row)
{
// Вызов обработчика платежной системы
$shop->ExecSystemsOfPayHandler($order_row['shop_system_of_pay_id']);
}
}
############################################################
### [END] Обработка принятия заказа от платежной системы ###
############################################################
if (class_exists("SiteUsers"))
{
/* Получаем id текущего пользователя сайта */
$SiteUsers = & singleton('SiteUsers');
$site_users_id = $SiteUsers->GetCurrentSiteUser();
}
else
{
$site_users_id = false;
}
/*
Вывод информации о статусе платежа после его совершения и перенапрпавления с платежной системы
*/
if (isset($_GET['payment']) && isset($_GET['order_id']))
{
// Получаем ID заказа
$order_id = to_int($_GET['order_id']);
$order_row = $shop->GetOrder($order_id);
// Если заказ принадлежит текущему авторизированному пользователю
if ($order_row['site_users_id'] == $site_users_id)
{
if (to_str($_GET['payment']) == 'success')
{
?>
<h1>Подтверждение платежа</h1>
<p>Спасибо, информация об оплате заказа <strong>№ <?php echo $order_id?></strong> получена.</p>
<?php
}
else
{
?>
<h1>Платеж не получен</h1>
<p>К сожалению при оплате заказа <strong>№ <?php echo $order_id?></strong> произошла ошибка.</p>
<?php
}
}
elseif ($site_users_id === false) // Для случаев, когда отключен модуль "Пользователи сайта"
{
?>
<h1>Подтверждение платежа</h1>
<p>Благодарим за посещение нашего магазина!</p>
<?php
}
else
{
?>
<h1>Ошибка</h1>
<p>Неверный номер заказа!</p>
<?php
}
// Прерываем выполнение типовой динамической страницы
return true;
}
/* Идентификатор интернет-магазина */
$shop_id = to_int($GLOBALS['LA']['shop_id']);
?>
<div id="cart">
<?php
/* Выводим корзину */
$shop->ShowCart($shop_id, $site_users_id,
to_str($GLOBALS['LA']['xsl_cart']), array('shop_coupon_text' => to_str($_REQUEST['shop_coupon_text'])));
// Получаем вес заказанных товаров
$weight_all = 0;
/* Получаем данные об элементах из корзины*/
$row = $shop->GetItemsFromCart($site_users_id, $shop_id);
if (count(to_array($row)) > 0)
{
/* В цикле разбираем массив товаров, полученных из корзины*/
foreach ($row as $key => $value)
{
/* Проверяем наличие данного товара в базе*/
$item_row = $shop->GetItem($value['shop_items_catalog_item_id']);
if ($item_row)
{
/* Проверяем является ли данный товар отложенным*/
if (!to_int($value['shop_cart_flag_postpone'])) /* если товар не отложен*/
{
/* Добавляем вес товара в общий вес*/
$weight_all += $value['shop_cart_item_quantity'] * $item_row['shop_items_catalog_weight'];
}
}
}
// Вес товаров больше 0
if ($weight_all > 0)
{
/* Отображаем форму ввода адреса */
// Не выбираем show_location, show_city и show_city_area, т.к. подгружаются через AJAX
$shop->ShowAddress(to_str($GLOBALS['LA']['xsl_delivery_address']), $shop_id, array('show_location' => false, 'show_city' => false, 'show_city_area' => false));
}
else
{
?>
<form id="address" enctype="multipart/form-data" action="./" method="post" name="address">
<div id="hidden_id" style="margin-top: 10px;">Выбранные Вами товары возможно доставить бесплатно по электронной почте или скачать с нашего сайта после оформления заказа.</div>
</form>
<SCRIPT type="text/javascript" language="JavaScript">
var oldHandler=window['onload'];
window['onload']=function(){if(typeof(oldHandler)=='function'){oldHandler();}newHandler();};
function newHandler(){
AjaxSendForm(fCallBackSiteUser, '&action=ajax_step1&no_weight=1', document.getElementById('hidden_id'));
}
</SCRIPT>
<?php
}
}
?>
<!-- Блок для отображения стоимости доставки -->
<div id="result">
</div>
</div>
Код настроек типовой динамической страницы
<?php
function rand_str($size)
{
$feed = "0123456789";
for ($i=0; $i < $size; $i++)
{
@$rand_str .= substr($feed, rand(0, strlen($feed)-1), 1);
}
return $rand_str;
}
/* Создаем экземпляр класса магазина (при создании устанавливаем флаг необходимости очитстки кукисов в истину) */
$shop = new shop(true);
/* Идентификатор интернет-магазина */
$shop_id = to_int($GLOBALS['LA']['shop_id']);
/**
* Использовать ли контроль данных, полученных из cookies
*/
// $shop->use_cookies_read_control = true;
// Обработка AJAX-запросов при заказе
if (isset($_REQUEST['action']) && $_REQUEST['action'] == 'get_location' && isset($_REQUEST['shop_country_id']))
{
$shop_country_id = to_int($_REQUEST['shop_country_id']);
$result = array();
if ($shop_country_id)
{
// Расположения заполняем только тогда, когда страна указана
$res = $shop->GetAllLocation($shop_country_id);
if ($res)
{
while ($row = mysql_fetch_assoc($res))
{
$result[$row['shop_location_id']] = $row['shop_location_name'];
}
}
}
$JsHttpRequest = new JsHttpRequest(SITE_CODING);
$GLOBALS['_RESULT'] = array(
'result' => $result);
echo $JsHttpRequest->LOADER;
exit();
}
if (isset($_REQUEST['action']) && $_REQUEST['action'] == 'get_city' && isset($_REQUEST['shop_location_id']))
{
$shop_location_id = to_int($_REQUEST['shop_location_id']);
$result = array();
if ($shop_location_id)
{
// Города заполняем только тогда, когда расположение указано
$res = $shop->GetAllCity($shop_location_id);
if ($res)
{
while ($row = mysql_fetch_assoc($res))
{
$result[$row['shop_city_id']] = $row['shop_city_name'];
}
}
}
$JsHttpRequest = new JsHttpRequest(SITE_CODING);
$GLOBALS['_RESULT'] = array(
'result' => $result);
echo $JsHttpRequest->LOADER;
exit();
}
if (isset($_REQUEST['action']) && $_REQUEST['action'] == 'get_cityarea' && isset($_REQUEST['shop_city_id']))
{
$shop_city_id = to_int($_REQUEST['shop_city_id']);
$result = array();
// Города заполняем только тогда, когда расположение указано
if ($shop_city_id)
{
$res = $shop->GetAllCityArea($shop_city_id);
if ($res)
{
while ($row = mysql_fetch_assoc($res))
{
$result[$row['shop_city_area_id']] = $row['shop_city_area_name'];
}
}
}
$JsHttpRequest = new JsHttpRequest(SITE_CODING);
$GLOBALS['_RESULT'] = array(
'result' => $result);
echo $JsHttpRequest->LOADER;
exit();
}
if (isset($_REQUEST['action']) && $_REQUEST['action'] == 'ajax_step1')
{
ob_start();
/* Сохраняем данные, введенные на первом этапе */
$country = to_int($_POST['country']);
$location = to_int($_POST['location']);
$city = to_int($_POST['sel_city']);
$city_area = to_int($_POST['sel_city_area']);
/* Пишем информацию об адресе доставки в сессию */
$_SESSION['country'] = $country;
$_SESSION['location'] = $location;
$_SESSION['city'] = $city;
$_SESSION['city_area'] = $city_area;
$_SESSION['index'] = to_str($_POST['index']);
$_SESSION['full_address'] = to_str($_POST['full_address']);
/* Индекс и полный адрес (в массив дополнительных параметров) */
$external_propertys['index'] = to_str($_POST['index']);
$external_propertys['full_address'] = to_str($_POST['full_address']);
if (class_exists("SiteUsers"))
{
/* Определяем идентификатор текущего пользователя */
$SiteUsers = & singleton('SiteUsers');
$site_users_id = $SiteUsers->GetCurrentSiteUser();
}
else
{
$site_users_id = false;
}
?>
<form method="POST" action="./" enctype="multipart/form-data">
<?php
if (isset($_REQUEST['no_weight']))
{
?>
<input type="hidden" name="cond_of_delivery" value="3" />
<?php
}
else
{
/* Получаем количество элементов, их общую цену, вес, валюту для заданного пользователя */
$a_param = $shop->SelectAllItemsFromCartForUser($shop_id,
$site_users_id);
/* Выбираем все доступные типы доставки (с группировкой по типу доставки) */
$param = array();
$param['shop_coupon_text'] = to_str($_SESSION['shop_coupon_text']);
$shop->ShowTypeOfDelivery($shop_id, $country, $location, $city, $city_area, $a_param['weight'], $a_param['price'],
to_str($GLOBALS['LA']['xsl_shop_delivery']), $param, $external_propertys);
}
if (!$site_users_id)
{
?>
<h2>Кто покупатель</h2>
<div>
<input type = "radio" value="private_person" name="type_person" id="private_person_id" onclick="SetUserType()"/><label for="private_person_id">Частное лицо</label>
<input type="radio" value="legal_entity" name="type_person" id="legal_entity_id" onclick="SetUserType()"/><label for="legal_entity_id">Юридическое лицо</label>
<input type="radio" value="registered" name="type_person" id="registered_id" onclick="SetUserType()" checked="checked"/><label for="registered_id">Уже зарегистрирован</label>
</div>
<div id="authorization_message" style="color: #f00"></div>
<div id="authorization">
<table>
<tr>
<td>Логин<br /><input type="text" name="login" size="20" /></td>
<td>Пароль<br /><input type="password" name="password" size="20" /></td>
</tr>
</table>
</div>
<div id="private_person_info" style="display: none;">
<h2>Контактная информация</h2>
<table>
<tr>
<td>ФИО<br /><input type="text" name="fio" size="55" /></td>
<td colspan="2">Телефон. <i>Например +7(495)988-3010</i><br /><input type="text" name="phone" size="40" /></td>
</tr>
<!--
<tr>
<td colspan="2">Ваш e-mail: <input type="text" name="email" size="30" /></td>
</tr>
-->
<tr>
<td colspan="3"><input type="checkbox" name="login_password" id="login_password_id" onChange="ChangeLoginPassword()"/><label for="login_password_id">Если хотите, можно указать логин, пароль и e-mail</label></td>
</tr>
<tr style="display: none;" id="tr_login_password">
<td>Логин<br /><input type="text" name="new_login" size="30" /></td>
<td>Пароль<br /><input type="text" name="new_password" size="30" /></td>
<td>Ваш e-mail<br /><input type="text" name="email" size="30" /></td>
</tr>
</table>
</div>
<div id="legal_entity_info" style="display: none;">
<h2>Информация о компании</h2>
<table>
<tr>
<td>Наименование компании<br /><input type="text" name="company_name" size="55" /></td>
<td>ИНН/КПП<br /><input type="text" name="inn" size="25"/></td>
</tr>
<tr>
<td colspan="2">Юр. адрес<br /><input type="text" name="juridical_address" size="55"/></td>
</tr>
<tr>
<td colspan="2">Фактический адрес<br /><input type="text" name="actual_address" size="55"/></td>
</tr>
<tr>
<td colspan="2"><input type="checkbox" name="send_fax" id="send_fax_id" onChange="ChangeSendFax()"/><label for="send_fax_id">Отправить счет по факсу</label>
<div id="id_fax" style="display: none;">Номер факса <input type="text" name="fax" size="15" /></div>
</td>
</tr>
</table>
</div>
<?php
}
/* Выводим платежные системы */
//$external_propertys['cond_of_delivery'] = to_int($_POST['cond_of_delivery']);
$shop->ShowSystemOfPay(to_str($GLOBALS['LA']['xsl_system_of_pay']));
?>
<div>Комментарии к заказу:<br /><textarea name="order_description" cols="50" rows="3"/></textarea></div>
<input type="submit" value="Оплатить" name="pay" onclick="return AjaxSendForm(fCallBackSiteUser, '&action=ajax_step_pay', this)"/>
</form>
<?php
$result = ob_get_clean();
$JsHttpRequest = new JsHttpRequest(SITE_CODING);
$GLOBALS['_RESULT'] = array(
'result' => $result);
echo $JsHttpRequest->LOADER;
exit();
}
// END обработка AJAX-запросов при заказе
if (class_exists("SiteUsers"))
{
/* Определяем идентификатор текущего пользователя */
$SiteUsers = & singleton('SiteUsers');
$site_users_id = $SiteUsers->GetCurrentSiteUser();
}
else
{
$site_users_id = false;
}
// Повторение заказа
if (to_str($_REQUEST['action']) == 'repeat')
{
$shop_order_id = to_int($_REQUEST['shop_order_id']);
$order_row = $shop->GetOrder($shop_order_id);
// Заказ найден
if ($order_row)
{
// Если заказ принадлежит этому пользователю
if ($order_row['site_users_id'] == $site_users_id && $site_users_id != 0)
{
$result_order_items = $shop->GetOrderItems($shop_order_id);
$shop_id_from_order = to_int($order_row['shop_shops_id']);
while ($row = mysql_fetch_assoc($result_order_items))
{
// Число товаров передаем, если посетитеь кладет в корзину больше одного товара
if (to_int( $row['shop_order_items_quantity']) > 0)
{
$count = to_int( $row['shop_order_items_quantity']);
}
/* Добавляем товар в корзину */
$shop->AddIntoCart(array('user_id' => $site_users_id,
'shop_id' => $shop_id_from_order,
'item_id' => $row['shop_items_catalog_item_id'],
'count' => $count));
}
}
}
}
// Запускаем сессию, если пользователь не авторизирован и пришли данные для регистрации
if ($site_users_id == 0 && isset($_POST['site_users_login'])
&& isset($_POST['site_users_password'])
&& isset($_POST['site_users_email'])
&& !isset($_SESSION))
{
session_start();
}
$GLOBALS['external_propertys'] = array();
/* Переданы данные для авторизации */
if (isset($_REQUEST['action']) && $_REQUEST['action']== 'ajax_step_pay')
{
ob_start();
// Пользователь не авторизован
if (!$site_users_id)
{
// Пользователь зарегистрирован
if (isset($_POST['type_person']) && $_POST['type_person'] == 'registered')
{
/* Проверяем правильность введенных данных */
$site_users_id = $SiteUsers->ValidUser(to_str($_POST['login']), to_str($_POST['password']));
}
else // Пользователь не зарегистрирован
{
$user_login = to_str($_POST['new_login']);
$user_login = trim($user_login);
$user_password = to_str($_POST['new_password']);
$user_password = trim($user_password);
$user_email = to_str($_POST['email']);
$user_email = trim($user_email);
// Не задан логин
if(empty($user_login))
{
// Генерируем логин
$user_login = 'AST' . rand_str('6');
}
// Не задан пароль
if(empty($user_password))
{
// Генерируем пароль
$user_password = rand_str('6');
}
if(empty($user_email))
{
// Генерируем e-mail
$user_email = $user_login . '@astsoft.ru';
}
$site_user_param = array();
$fio = to_str($_POST['fio']);
$fio = trim($fio);
$fio_mas = explode(' ', $fio);
$site_user_param['site_users_name'] = to_str($fio_mas[1]);
$site_user_param['site_users_surname'] = to_str($fio_mas[0]);
$site_user_param['site_users_patronymic'] = to_str($fio_mas[2]);
$site_user_param['site_users_login'] = $user_login;
$site_user_param['site_users_password'] = $user_password;
$site_user_param['site_users_email'] = $user_email;
$site_user_param['site_users_company'] = to_str($_POST['company_name']);
$site_user_param['site_users_phone'] = to_str($_POST['phone']);
$site_user_param['site_users_fax'] = to_str($_POST['fax']);
$site_user_param['site_users_postcode'] = to_int($_POST['index']);
$site_user_param['site_users_confirmation'] = true;
$site_user_param['users_id'] = false;
$site_users_id = $SiteUsers->InsertSiteUser($site_user_param);
}
}
if ($site_users_id > 0)
{
// Авторизуем пользователя
$SiteUsers->SetCurrentSiteUser($site_users_id);
$_SESSION['cond_of_delivery'] = to_int($_POST['cond_of_delivery']);
$_SESSION['order_description'] = to_str($_POST['order_description']);
$row = $shop->GetCondOfDelivery($_SESSION['cond_of_delivery']);
/* Получаем данные о магазине */
$shop_row = $shop->GetShop($shop_id);
/* идентификатор валюты магазина */
$shop_currency_id = to_int($shop_row['shop_currency_id']);
$coefficient = $shop->GetCurrencyCoefficientToShopCurrency($row['shop_currency_id'], $shop_currency_id);
$price_delivery = sprintf("%.2f", $row['shop_cond_of_delivery_price'] * $coefficient);
$_SESSION['cond_of_delivery_price'] = $price_delivery;
/* Запоминаем купон */
$_SESSION['shop_coupon_text'] = to_str($_POST['shop_coupon_text']);
//print_r($_SESSION);
/* Если выбрана (существует) платежная система */
if (to_int($_POST['system_of_pay_id']) != 0)
{
// Вызываем обработчик платежной системы
if (!$shop->ExecSystemsOfPayHandler(to_int($_POST['system_of_pay_id'])))
{
// Не удалось найти обработчик
show_error_message("Не найден обработчик платежной системы с номером ".to_int($_POST['system_of_pay_id']));
}
}
else
{
// Ошибка, не указана платежная система!
show_error_message('Ошибка! Не указана ни одна платежная система.');
}
}
elseif($site_users_id == -2)
{
echo 'Пользователь с такими данными уже зарегистрирован!';
}
else
{
echo 'Неверные данные пользователя!';
}
$result = ob_get_contents();
$JsHttpRequest = new JsHttpRequest(SITE_CODING);
if ($site_users_id > 0)
{
$GLOBALS['_RESULT'] = array('cart' => $result);
}
else
{
$GLOBALS['_RESULT'] = array('authorization_message' => $result);
}
ob_clean();
echo $JsHttpRequest->LOADER;
exit();
}
/* AJAX добавление товара в корзину */
if (isset($_GET['ajax_add_item_id']))
{
$param = array();
$param['shop_id'] = $shop_id;
$param['item_id'] = to_int($_GET['ajax_add_item_id']);
$param['user_id'] = $site_users_id;
// Число товаров передаем, если посетитеь кладет в корзину больше одного товара
if (to_int($_GET['count']) > 0)
{
$param['count'] = to_int($_GET['count']);
}
// Добавляем товар в корзину
$shop->AddIntoCart($param);
// Отображаем корзину
$JsHttpRequest = new JsHttpRequest(SITE_CODING);
ob_start();
$shop->ShowCart($shop_id, $site_users_id, to_str($GLOBALS['LA']['xsl_little_cart']));
$little_cart_html = ob_get_clean();
$GLOBALS['_RESULT'] = array('cart' => $little_cart_html);
echo $JsHttpRequest->LOADER;
exit();
}
/* добавление товара в корзину */
if (to_str($_GET['action']) == 'add')
{
$param = array();
$param['shop_id'] = $shop_id;
$param['item_id'] = to_int($_GET['item_id']);
$param['user_id'] = $site_users_id;
// Число товаров передаем, если посетитеь кладет в корзину больше одного товара
if (to_int($_GET['count']) > 0)
{
$param['count'] = to_int($_GET['count']);
}
/* Добавляем товар в корзину */
$shop->AddIntoCart($param);
}
/* Удаляение товара из корзины */
if (to_str($_GET['action']) == 'delete_item')
{
$param = array();
$param['shop_id'] = $shop_id;
$param['item_id'] = to_int($_GET['item_id']);
/* Проверяем наличие пользователя */
if ($site_users_id != 0)
{
$param['user_id'] = $site_users_id;
}
$shop->DeleteCart($param);
}
/* Пересчет товара в корзине */
if (isset($_POST['recount']))
{
$param = array();
foreach ($_POST as $key => $value)
{
$param['item_id'] = $key;
/* Получаем идентификатор записи в корзине по идентификатору пользователя и товара */
$cart_id = $shop->GetItemFromCart($shop_id, $site_users_id, $param['item_id']);
$param['cart_id'] = to_int($cart_id['shop_cart_id']);
$param['user_id'] = $site_users_id;
$param['shop_id'] = $shop_id;
$param['count'] = to_int($value);
/* Если установлен флажок - делаем товар отложенным */
$param['postpone'] = !empty($_POST['flag_postpone'.$key]) ? 1 : 0;
/* Если количество = 0 - удаляем из корзины */
if ($param['count'] == 0)
{
$shop->DeleteCart($param);
}
else
{
$shop->UpdateCart($param);
}
}
}
?>
Также необходимо поменять стандартные XSL-шаблоны
Измененный код XSL-шаблона "МагазинАдресДоставки"
<?xml version="1.0" encoding="windows-1251"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output xmlns="http://www.w3.org/TR/xhtml1/strict" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" encoding="Windows-1251" indent="yes" method="html" omit-xml-declaration="no" version="1.0" media-type="text/xml"/>
<xsl:template match="/locations">
<!--
<table border="0" cellpadding="5" cellspacing="5" class="shop_navigation_table">
<tr>
<td id="shop_navigation_current">Адрес доставки</td>
<td>→</td>
<td id="shop_navigation">Способ доставки</td>
<td>→</td>
<td id="shop_navigation">Форма оплаты</td>
<td>→</td>
<td id="shop_navigation">Данные доставки</td>
</tr>
</table>
-->
<SCRIPT type="text/javascript" language="JavaScript">
<xsl:comment>
<xsl:text disable-output-escaping="yes">
<![CDATA[
location_select_id = "location";
city_select_id = "sel_city";
cityarea_select_id = "sel_city_area";
]]>
</xsl:text>
</xsl:comment>
</SCRIPT>
<form name="address" id="address" method="POST" action="./" enctype="multipart/form-data">
<h1>Доставка</h1>
<!--
<p>
<a href="{shop/path}cart/">Корзина</a>
</p>
-->
<table>
<tr><td>В корзине есть товар, который требет физической доставки курьером или почтой. Выберите пожалуйста адрес доставки</td></tr>
<tr>
<td>Страна: <select id="country" name="country" onchange="doSetLocation(this.options[this.selectedIndex].value, '{/locations/shop/path}cart/')">
<xsl:apply-templates select="country"/>
</select>  
Область: 
<xsl:variable name="country_id" select="/locations//country[@select = 1]/@id" />
<select name="location" id="location" onchange="doSetCity(this.options[this.selectedIndex].value, '{/locations/shop/path}cart/')">
<option value="0">..</option>
<xsl:apply-templates select="location[@parent = $country_id]"/>
</select>
</td>
</tr>
<tr>
<td>Город: <select name="sel_city" id="sel_city" onchange="doSetCityArea(this.options[this.selectedIndex].value, '{/locations/shop/path}cart/')">
<option value="0">..</option>
<xsl:apply-templates select="city[@parent = location[@parent = $country_id]]"/>
</select>  
Район города: <select name="sel_city_area" id="sel_city_area">
<option value="0">..</option>
</select>  
</td>
</tr>
<tr>
<td>Индекс: <input type="text" size="5" name="index" value=""/>  
Улица, дом, квартира: <input type="text" size="30" name="full_address" value=""/></td>
</tr>
<tr>
<td>
<input name="step_1" value="Далее >>" type="submit" onclick="return AjaxSendForm(fCallBackSiteUser, '&action=ajax_step1', this)"></input>
</td>
</tr>
</table>
</form>
<!-- Заполняем все дочерние элементы страны -->
<SCRIPT type="text/javascript" language="JavaScript">
var oldHandler=window['onload'];
window['onload']=function(){if(typeof(oldHandler)=='function'){oldHandler();}newHandler();};
function newHandler(){
doSetLocation(document.getElementById('country').options[document.getElementById('country').selectedIndex].value, '<xsl:value-of select="/locations/shop/path" />cart/');
}
</SCRIPT>
</xsl:template>
<!-- Шаблон заполняет options для стран -->
<xsl:template match="country">
<xsl:choose>
<!-- Если страна задана по умолчанию -->
<xsl:when test="@select=1">
<option value="{@id}" selected="">
<xsl:value-of disable-output-escaping="yes" select="name"/>
</option>
</xsl:when>
<xsl:otherwise>
<option value="{@id}">
<xsl:value-of disable-output-escaping="yes" select="name"/>
</option>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- Шаблон заполняет options для местоположений (областей) -->
<xsl:template match="location">
<option value="{@id}">
<xsl:value-of disable-output-escaping="yes" select="name"/>
</option>
</xsl:template>
<!-- Шаблон заполняет options для городов -->
<xsl:template match="city">
<option value="{@id}">
<xsl:value-of disable-output-escaping="yes" select="name"/>
</option>
</xsl:template>
<!-- Шаблон заполняет options для районов -->
<xsl:template match="cityarea">
<option value="{@id}">
<xsl:value-of disable-output-escaping="yes" select="name"/>
</option>
</xsl:template>
</xsl:stylesheet>
Измененный код XSL-шаблона "МагазинДоставки"
<?xml version="1.0" encoding="windows-1251"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output xmlns="http://www.w3.org/TR/xhtml1/strict" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" encoding="Windows-1251" indent="yes" method="html" omit-xml-declaration="no" version="1.0" media-type="text/xml"/>
<!-- Шаблон для типов доставки -->
<xsl:template match="/types_of_delivery">
<!--<table border="0" cellpadding="5" cellspacing="5" class="shop_navigation_table">
<tr>
<td id="shop_navigation">Адрес доставки</td>
<td>→</td>
<td id="shop_navigation_current">Способ доставки</td>
<td>→</td>
<td id="shop_navigation">Форма оплаты</td>
<td>→</td>
<td id="shop_navigation">Данные доставки</td>
</tr>
</table>-->
<!--<form name="address" id="address" method="POST">-->
<h2>Стоимость доставки</h2>
<!-- Проверяем количество способов доставки -->
<xsl:choose>
<xsl:when test="count_cond_of_delivery=0">
<p>По выбранным Вами условиям доставка не возможна, заказ будет оформлен без доставки.</p>
<p>Уточнить данные о доставке Вы можете, связавшись с представителем нашей компании.</p>
<input type="hidden" name="type_of_delivery" value="0"/>
</xsl:when>
<xsl:otherwise>
<table cellspacing="0" cellpadding="0" border="0" class="shop_cart_table">
<tr class="shop_cart_table_title">
<td>Способ доставки</td>
<td>Описание</td>
<td>Цена доставки</td>
<td>Стоимость товаров</td>
<td>Итого</td>
</tr>
<xsl:apply-templates select="type_of_delivery"/>
</table>
</xsl:otherwise>
</xsl:choose>
<!--<p>
<input name="step_3" value="Далее >>" type="submit"/>
</p>-->
<!--</form>-->
</xsl:template>
<xsl:template match="type_of_delivery">
<tr>
<td>
<input type="radio" value="{shop_cond_of_delivery_id}" id="cond_of_delivery{shop_cond_of_delivery_id}" name="cond_of_delivery" style="border: 0px">
<xsl:if test="position() = 1">
<xsl:attribute name="checked"></xsl:attribute>
</xsl:if>
</input> 
<label for="cond_of_delivery{shop_cond_of_delivery_id}">
<b>
<xsl:value-of select="name"/>
</b>
</label>
</td>
<td>
<!-- Описание доставки -->
<p>
<xsl:value-of disable-output-escaping="yes" select="description"/>
</p>
</td>
<td>
<xsl:value-of select="price"/> <xsl:value-of select="/types_of_delivery/shop/shop_currency/shop_currency_name"/></td>
<td>
<xsl:value-of select="cart_sum"/> <xsl:value-of select="/types_of_delivery/shop/shop_currency/shop_currency_name"/>
</td>
<td style="font-weight: bold">
<xsl:value-of select="total"/> <xsl:value-of select="/types_of_delivery/shop/shop_currency/shop_currency_name"/>
</td>
</tr>
</xsl:template>
</xsl:stylesheet>
Измененный код XSL-шаблона "МагазинКорзина"
<?xml version="1.0" encoding="windows-1251"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output xmlns="http://www.w3.org/TR/xhtml1/strict" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" encoding="Windows-1251" indent="yes" method="html" omit-xml-declaration="no" version="1.0" media-type="text/xml"/>
<!-- Шаблон для корзины -->
<xsl:variable name="recount" select="recount"/>
<xsl:template match="/cart">
<xsl:choose>
<xsl:when test="(count_item=0) and (count_postpone_item=0)">
<!-- В корзине нет ни одного элемента -->
<p class="title">В корзине нет ни одного товара.</p>
<p>
<xsl:choose>
<xsl:when test="user_id != 0">Для оформления заказа добавьте товар в корзину.</xsl:when>
<xsl:when test="site_users_class_exists = 1">Вы не авторизированы. Если Вы зарегистрированный пользователь, данные Вашей корзины станут видны после авторизации.</xsl:when>
<xsl:otherwise></xsl:otherwise>
</xsl:choose>
</p>
</xsl:when>
<xsl:otherwise>
<!-- Вывод корзины -->
<h1>Моя корзина</h1>
<p>Для оформления заказа, нажмите "Оформить заказ".</p>
<form action="{/cart/shop/path}cart/" name="address" method="POST">
<table cellspacing="0" cellpadding="0" border="0" class="shop_cart_table">
<!-- Если есть товары -->
<xsl:if test="count(itemincart[flag_postpone=0]) > 0">
<tr class="shop_cart_table_title">
<td>Изображение</td>
<td width="100">Товар</td>
<!--<td width="70">Вес</td>-->
<td width="70">Кол-во</td>
<td width="70">Цена</td>
<td>Сумма</td>
<td>Отложить</td>
<!--<td>Действия</td>-->
</tr>
<xsl:apply-templates select="itemincart[flag_postpone=0]"/>
<tr class="shop_cart_table">
<td> </td>
<td>
<b>Итого:</b>
</td>
<td>
<b>
<xsl:value-of disable-output-escaping="yes" select="totalquantity"/>
</b>
</td>
<td> </td>
<td>
<b>
<xsl:value-of disable-output-escaping="yes" select="total_sum_without_discount"/> <xsl:value-of disable-output-escaping="yes" select="shop/shop_currency/shop_currency_name"/></b>
</td>
<td> </td>
<!--<td> </td>-->
</tr>
<xsl:if test="total_sum_without_discount > totalsum">
<tr class="shop_cart_table">
<td style="border-bottom: thin dashed #DADADA">
 
</td>
<td style="border-bottom: thin dashed #DADADA">
<b>Скидка:</b>
</td>
<td style="border-bottom: thin dashed #DADADA"> </td>
<td style="border-bottom: thin dashed #DADADA"> </td>
<td style="border-bottom: thin dashed #DADADA">
<b>
<xsl:value-of disable-output-escaping="yes" select="format-number(total_sum_without_discount - totalsum, '#.00')"/> <xsl:value-of disable-output-escaping="yes" select="shop/currency"/></b>
</td>
<td style="border-bottom: thin dashed #DADADA"> </td>
</tr>
<tr class="shop_cart_table">
<td style="border-bottom: none">
 
</td>
<td style="border-bottom: none">
<b>Всего:</b>
</td>
<td style="border-bottom: none"> </td>
<td style="border-bottom: none"> </td>
<td style="border-bottom: none">
<b>
<xsl:value-of disable-output-escaping="yes" select="totalsum"/> <xsl:value-of disable-output-escaping="yes" select="shop/currency"/></b>
</td>
<td style="border-bottom: none"> </td>
</tr>
</xsl:if>
</xsl:if>
<!-- Если есть отложенные товары -->
<xsl:if test="count(itemincart[flag_postpone=1]) > 0">
<tr class="shop_cart_table">
<td colspan="7" style="padding-top:10px">
<strong>
<big>Отложенные товары</big>
</strong>
</td>
</tr>
<tr class="shop_cart_table_title">
<td>Изображение</td>
<td>Название</td>
<!--<td width="70">Вес</td>-->
<td width="70">Кол — во</td>
<td width="70">Цена</td>
<td>Сумма</td>
<td>Отложить</td>
<!--<td>Действия</td>-->
</tr>
<xsl:apply-templates select="itemincart[flag_postpone=1]"/>
<tr class="shop_cart_table">
<td> </td>
<td>
<b>Итого:</b>
</td>
<td>
<b>
<xsl:value-of disable-output-escaping="yes" select="totalquantity_postpone_item"/>
</b>
</td>
<td> </td>
<td>
<b>
<xsl:value-of disable-output-escaping="yes" select="totalsum_postpone_item"/> <xsl:value-of disable-output-escaping="yes" select="shop/shop_currency/shop_currency_name"/></b>
</td>
<td> </td>
<td> </td>
</tr>
</xsl:if>
</table>
<!-- Купон -->
<div style="padding: 5px;">
Купон: 
<input name="shop_coupon_text" type="text" value="{coupon_text}" style="margin-right: 10px"/>
</div>
<!-- Кнопки -->
<input name="recount" value="Пересчитать" type="submit" style="margin-right: 10px"/>
<xsl:choose>
<xsl:when test="site_users_class_exists = 1"></xsl:when>
<xsl:otherwise>
<!-- В случае если отключен модуль пользователей сайта, запрашиваем информацию
о пользователе сайта здесь -->
<table border="0" cellspacing="0" cellpadding="2">
<tr class="shop_cart_table_title">
<td colspan="2" align="center">Данные о заказчике</td>
</tr>
<tr>
<td>Фамилия</td>
<td>
<input name="site_users_surname" type="text" value="" size="40"/>
</td>
</tr>
<tr>
<td>Имя</td>
<td>
<input name="site_users_name" type="text" value="" size="40"/>
</td>
</tr>
<tr>
<td>Отчество</td>
<td>
<input name="site_users_patronymic" type="text" value="" size="40"/>
</td>
</tr>
<tr>
<td>E-mail</td>
<td>
<input name="site_users_email" type="text" value="" size="40"/>
</td>
</tr>
<tr>
<td>Телефон</td>
<td>
<input name="site_users_phone" type="text" value="" size="40"/>
</td>
</tr>
<tr>
<td>Факс</td>
<td>
<input name="site_users_fax" type="text" value="" size="40"/>
</td>
</tr>
<tr>
<td>Адрес</td>
<td>
<input name="site_users_address" type="text" value="" size="40"/>
</td>
</tr>
</table>
<!-- Добавляем скрытое поле с указанием подшага -->
<input name="step_1_1a" type="hidden" value="1"/>
</xsl:otherwise>
</xsl:choose>
<!--
<xsl:if test="user_id != 0 or site_users_class_exists = 0">
<input name="step_1" value="Оформить заказ" type="submit" style="font-weight: bold"/>
</xsl:if>
-->
</form>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- Шаблон для товара в корзине -->
<xsl:template match="itemincart">
<tr class="shop_cart_table">
<td>
<xsl:if test="item/small_image!=''">
<img src="{item/small_image}"/>
</xsl:if>
<br/>
<a href="?action=delete_item&item_id={item/@id}">Удалить из корзины</a>
</td>
<td>
<a href="{/cart/shop/path}{item/fullpath}{item/path}/">
<xsl:value-of disable-output-escaping="yes" select="item/name"/>
</a>
<!-- Средняя оценка товара -->
<div style="float: left; margin: 20px 0px 0px 0px">
<b>Рейтинг:</b>
<br/>
<xsl:if test="item/comments/average_grade/node()">
<xsl:call-template name="show_average_grade">
<xsl:with-param name="grade" select="item/comments/average_grade"/>
<xsl:with-param name="const_grade" select="5"/>
</xsl:call-template>
</xsl:if>
<xsl:if test="not(item/comments/average_grade/node())">
<xsl:call-template name="show_average_grade">
<xsl:with-param name="grade" select="0"/>
<xsl:with-param name="const_grade" select="5"/>
</xsl:call-template>
</xsl:if>
</div>
<div style="clear: both"></div>
</td>
<td style="white-space: nowrap">
<input type="text" size="3" name="{item/@id}" value="{quantity}"/> <xsl:value-of select="item/mesure" disable-output-escaping="yes"/></td>
<td style="white-space: nowrap">
<!-- Цена -->
<xsl:value-of disable-output-escaping="yes" select="item/price"/> <xsl:value-of select="item/currency" disable-output-escaping="yes"/></td>
<td style="white-space: nowrap">
<!-- Сумма -->
<xsl:value-of disable-output-escaping="yes" select="item/price * quantity"/> <xsl:value-of disable-output-escaping="yes" select="item/currency"/></td>
<td align="center">
<!-- Отложенные товары -->
<xsl:choose>
<xsl:when test="flag_postpone=1">
<input type="checkbox" name="flag_postpone{item/@id}" checked=""/>
</xsl:when>
<xsl:otherwise>
<input type="checkbox" name="flag_postpone{item/@id}"/>
</xsl:otherwise>
</xsl:choose>
</td>
<!--<td align="center"><a href="?action=delete_item&item_id={item/@id}" title="Удалить товар из корзины" alt="Удалить товар из корзины"><img src="/hostcmsfiles/images/delete.gif" /></a></td>-->
</tr>
</xsl:template>
<!-- Вывод рейтинга товара -->
<xsl:template name="show_average_grade">
<xsl:param name="grade" select="0"/>
<xsl:param name="const_grade" select="0"/>
<!-- Чтобы избежать зацикливания -->
<xsl:variable name="current_grade" select="$grade * 1"/>
<xsl:choose>
<!-- Если число целое -->
<xsl:when test="floor($current_grade) = $current_grade and not($const_grade > ceiling($current_grade))">
<xsl:if test="$current_grade - 1 > 0">
<xsl:call-template name="show_average_grade">
<xsl:with-param name="grade" select="$current_grade - 1"/>
<xsl:with-param name="const_grade" select="$const_grade - 1"/>
</xsl:call-template>
</xsl:if>
<xsl:if test="$current_grade != 0">
<img src="/hostcmsfiles/images/stars_single.gif"/>
</xsl:if>
</xsl:when>
<xsl:when test="$current_grade != 0 and not($const_grade > ceiling($current_grade))">
<xsl:if test="$current_grade - 0.5 > 0">
<xsl:call-template name="show_average_grade">
<xsl:with-param name="grade" select="$current_grade - 0.5"/>
<xsl:with-param name="const_grade" select="$const_grade - 1"/>
</xsl:call-template>
</xsl:if>
<img src="/hostcmsfiles/images/stars_half.gif"/>
</xsl:when>
<!-- Выводим серые звездочки, пока текущая позиция не дойдет то значения, увеличенного до целого -->
<xsl:otherwise>
<xsl:call-template name="show_average_grade">
<xsl:with-param name="grade" select="$current_grade"/>
<xsl:with-param name="const_grade" select="$const_grade - 1"/>
</xsl:call-template>
<img src="/hostcmsfiles/images/stars_gray.gif"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- Шаблон для вывода звездочек (оценки) -->
<xsl:template name="for">
<xsl:param name="i" select="0"/>
<xsl:param name="n"/>
<input type="radio" name="shop_comment_grade" value="{$i}" id="id_shop_comment_grade_{$i}">
<xsl:if test="/shop/shop_comment_grade = $i">
<xsl:attribute name="checked">
</xsl:attribute>
</xsl:if>
</input> 
<label for="id_shop_comment_grade_{$i}">
<xsl:call-template name="show_average_grade">
<xsl:with-param name="grade" select="$i"/>
<xsl:with-param name="const_grade" select="5"/>
</xsl:call-template>
</label>
<br/>
<xsl:if test="$n > $i and $n > 1">
<xsl:call-template name="for">
<xsl:with-param name="i" select="$i + 1"/>
<xsl:with-param name="n" select="$n"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
Измененный код XSL-шаблона "МагазинПлатежнаяСистема"
<?xml version="1.0" encoding="windows-1251"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output xmlns="http://www.w3.org/TR/xhtml1/strict" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" encoding="Windows-1251" indent="yes" method="html" omit-xml-declaration="no" version="1.0" media-type="text/xml"/>
<!-- Шаблон для платежных систем -->
<xsl:template match="/list">
<!--
<table border="0" cellpadding="5" cellspacing="5" class="shop_navigation_table">
<tr>
<td id="shop_navigation">Адрес доставки</td>
<td>→</td>
<td id="shop_navigation">Способ доставки</td>
<td>→</td>
<td id="shop_navigation_current">Форма оплаты</td>
<td>→</td>
<td id="shop_navigation">Данные доставки</td>
</tr>
</table>-->
<h2>Методы оплаты</h2>
<!--<form name="address" id="address" method="post">-->
<xsl:choose>
<xsl:when test="count_system_of_pay=0">
<p>
<b>В данный момент нет доступных платежных систем!</b>
</p>
<p>Оформление заказа невозможно, свяжитесь с администрацией Интернет-магазина.</p>
</xsl:when>
<xsl:otherwise>
<table cellspacing="0" cellpadding="0" border="0" class="shop_cart_table">
<tr class="shop_cart_table_title">
<td>Форма оплаты</td>
<td>Описание</td>
</tr>
<xsl:apply-templates select="system_of_pay"/>
</table>
<!--<p><input name="step_4" value="Далее >>" type="submit"/></p>-->
</xsl:otherwise>
</xsl:choose>
<!--</form>-->
</xsl:template>
<xsl:template match="system_of_pay">
<tr>
<td width="40%">
<input type="radio" class="input_radio" name="system_of_pay_id" value="{@id}" id="system_of_pay_{@id}" style="border: 0px">
<xsl:if test="position() = 1">
<xsl:attribute name="checked"></xsl:attribute>
</xsl:if>
</input>
 
<label for="system_of_pay_{@id}">
<b>
<xsl:value-of select="name"/>
</b>
</label>
</td>
<td width="60%">
<!-- Описание платежной системы -->
<xsl:value-of disable-output-escaping="yes" select="description"/>
</td>
</tr>
</xsl:template>
</xsl:stylesheet>
В XSL-шаблонах "ОплатаПриПолучении", "ОплатаПоФормеПД4", "ОплатаБезналичнаяОтЮрЛица" убрать следующий код
<table border="0" cellpadding="5" cellspacing="5" class="shop_navigation_table">
<tr>
<td id="shop_navigation">Адрес доставки</td>
<td>→</td>
<td id="shop_navigation">Способ доставки</td>
<td>→</td>
<td id="shop_navigation">Форма оплаты</td>
<td>→</td>
<td id="shop_navigation_current">Данные доставки</td>
</tr>
</table>
<script type="text/javascript">
/**
* Функция обратного вызова при авторизации пользователя
*/
function fCallBackSiteUser(responseJS)
{
if (typeof responseJS != 'undefined')
{
if (typeof responseJS.result != 'undefined')
{
var oDivMessage = document.getElementById('result');
if (oDivMessage)
{
oDivMessage.innerHTML = responseJS.result;
}
}
if (typeof responseJS.authorization_message != 'undefined')
{
var oDivMessage = document.getElementById('authorization_message');
if (oDivMessage)
{
oDivMessage.innerHTML = responseJS.authorization_message;
}
}
if (typeof responseJS.cart != 'undefined')
{
var oDivMessage = document.getElementById('cart');
if (oDivMessage)
{
oDivMessage.innerHTML = responseJS.cart;
}
}
}
}
function SetUserType()
{
var radio_group = document.getElementsByName('type_person');
// Частное лицо
if (radio_group[0].checked)
{
document.getElementById('authorization').style.display = "none";
document.getElementById('private_person_info').style.display = "block";
document.getElementById('legal_entity_info').style.display = "none";
document.getElementById('authorization_message').innerHTML = "";
radio_group[3].value = 'private_person';
}
// Юридическое лицо
if (radio_group[1].checked)
{
document.getElementById('authorization').style.display = "none";
document.getElementById('private_person_info').style.display = "block";
document.getElementById('legal_entity_info').style.display = "block";
document.getElementById('authorization_message').innerHTML = "";
radio_group[3].value = 'legal_entity';
}
// Зарегистрированный пользователь
if (radio_group[2].checked)
{
document.getElementById('authorization').style.display = "block";
document.getElementById('private_person_info').style.display = "none";
document.getElementById('legal_entity_info').style.display = "none";
radio_group[3].value = 'registered';
}
}
function ChangeSendFax()
{
var checkbox_send_fax = document.getElementById('send_fax_id');
if (checkbox_send_fax.checked)
{
document.getElementById('id_fax').style.display = "block";
}
else
{
document.getElementById('id_fax').style.display = "none";
}
}
function ChangeLoginPassword()
{
var login_password = document.getElementById('login_password_id');
if (login_password.checked)
{
document.getElementById('tr_login_password').style.display = "";
}
else
{
document.getElementById('tr_login_password').style.display = "none";
}
}
</script>
<?php
$shop = & singleton('shop');
######################################################
#### Обработка принятия заказа от платежной системы ###
######################################################
// Обработка уведомления об оплате от RUpay
if (isset($_POST['rupay_action']))
{
// Получаем ID заказа
$order_id = to_int($_POST['rupay_order_id']);
$order_row = $shop->GetOrder($order_id);
if ($order_row)
{
// Вызов обработчика платежной системы
$shop->ExecSystemsOfPayHandler($order_row['shop_system_of_pay_id']);
}
}
// Обработка уведомления об оплате от WebMoney
if (isset($_POST['LMI_PAYEE_PURSE']))
{
// Получаем ID заказа
$order_id = to_int($_POST['LMI_PAYMENT_NO']);
$order_row = $shop->GetOrder($order_id);
if ($order_row)
{
// Вызов обработчика платежной системы
$shop->ExecSystemsOfPayHandler($order_row['shop_system_of_pay_id']);
}
}
############################################################
### [END] Обработка принятия заказа от платежной системы ###
############################################################
if (class_exists("SiteUsers"))
{
/* Получаем id текущего пользователя сайта */
$SiteUsers = & singleton('SiteUsers');
$site_users_id = $SiteUsers->GetCurrentSiteUser();
}
else
{
$site_users_id = false;
}
/*
Вывод информации о статусе платежа после его совершения и перенапрпавления с платежной системы
*/
if (isset($_GET['payment']) && isset($_GET['order_id']))
{
// Получаем ID заказа
$order_id = to_int($_GET['order_id']);
$order_row = $shop->GetOrder($order_id);
// Если заказ принадлежит текущему авторизированному пользователю
if ($order_row['site_users_id'] == $site_users_id)
{
if (to_str($_GET['payment']) == 'success')
{
?>
<h1>Подтверждение платежа</h1>
<p>Спасибо, информация об оплате заказа <strong>№ <?php echo $order_id?></strong> получена.</p>
<?php
}
else
{
?>
<h1>Платеж не получен</h1>
<p>К сожалению при оплате заказа <strong>№ <?php echo $order_id?></strong> произошла ошибка.</p>
<?php
}
}
elseif ($site_users_id === false) // Для случаев, когда отключен модуль "Пользователи сайта"
{
?>
<h1>Подтверждение платежа</h1>
<p>Благодарим за посещение нашего магазина!</p>
<?php
}
else
{
?>
<h1>Ошибка</h1>
<p>Неверный номер заказа!</p>
<?php
}
// Прерываем выполнение типовой динамической страницы
return true;
}
/* Идентификатор интернет-магазина */
$shop_id = to_int($GLOBALS['LA']['shop_id']);
?>
<div id="cart">
<?php
/* Выводим корзину */
$shop->ShowCart($shop_id, $site_users_id,
to_str($GLOBALS['LA']['xsl_cart']), array('shop_coupon_text' => to_str($_REQUEST['shop_coupon_text'])));
// Получаем вес заказанных товаров
$weight_all = 0;
/* Получаем данные об элементах из корзины*/
$row = $shop->GetItemsFromCart($site_users_id, $shop_id);
if (count(to_array($row)) > 0)
{
/* В цикле разбираем массив товаров, полученных из корзины*/
foreach ($row as $key => $value)
{
/* Проверяем наличие данного товара в базе*/
$item_row = $shop->GetItem($value['shop_items_catalog_item_id']);
if ($item_row)
{
/* Проверяем является ли данный товар отложенным*/
if (!to_int($value['shop_cart_flag_postpone'])) /* если товар не отложен*/
{
/* Добавляем вес товара в общий вес*/
$weight_all += $value['shop_cart_item_quantity'] * $item_row['shop_items_catalog_weight'];
}
}
}
// Вес товаров больше 0
if ($weight_all > 0)
{
/* Отображаем форму ввода адреса */
// Не выбираем show_location, show_city и show_city_area, т.к. подгружаются через AJAX
$shop->ShowAddress(to_str($GLOBALS['LA']['xsl_delivery_address']), $shop_id, array('show_location' => false, 'show_city' => false, 'show_city_area' => false));
}
else
{
?>
<form id="address" enctype="multipart/form-data" action="./" method="post" name="address">
<div id="hidden_id" style="margin-top: 10px;">Выбранные Вами товары возможно доставить бесплатно по электронной почте или скачать с нашего сайта после оформления заказа.</div>
</form>
<SCRIPT type="text/javascript" language="JavaScript">
var oldHandler=window['onload'];
window['onload']=function(){if(typeof(oldHandler)=='function'){oldHandler();}newHandler();};
function newHandler(){
AjaxSendForm(fCallBackSiteUser, '&action=ajax_step1&no_weight=1', document.getElementById('hidden_id'));
}
</SCRIPT>
<?php
}
}
?>
<!-- Блок для отображения стоимости доставки -->
<div id="result">
</div>
</div>
Код настроек типовой динамической страницы
<?php
function rand_str($size)
{
$feed = "0123456789";
for ($i=0; $i < $size; $i++)
{
@$rand_str .= substr($feed, rand(0, strlen($feed)-1), 1);
}
return $rand_str;
}
/* Создаем экземпляр класса магазина (при создании устанавливаем флаг необходимости очитстки кукисов в истину) */
$shop = new shop(true);
/* Идентификатор интернет-магазина */
$shop_id = to_int($GLOBALS['LA']['shop_id']);
/**
* Использовать ли контроль данных, полученных из cookies
*/
// $shop->use_cookies_read_control = true;
// Обработка AJAX-запросов при заказе
if (isset($_REQUEST['action']) && $_REQUEST['action'] == 'get_location' && isset($_REQUEST['shop_country_id']))
{
$shop_country_id = to_int($_REQUEST['shop_country_id']);
$result = array();
if ($shop_country_id)
{
// Расположения заполняем только тогда, когда страна указана
$res = $shop->GetAllLocation($shop_country_id);
if ($res)
{
while ($row = mysql_fetch_assoc($res))
{
$result[$row['shop_location_id']] = $row['shop_location_name'];
}
}
}
$JsHttpRequest = new JsHttpRequest(SITE_CODING);
$GLOBALS['_RESULT'] = array(
'result' => $result);
echo $JsHttpRequest->LOADER;
exit();
}
if (isset($_REQUEST['action']) && $_REQUEST['action'] == 'get_city' && isset($_REQUEST['shop_location_id']))
{
$shop_location_id = to_int($_REQUEST['shop_location_id']);
$result = array();
if ($shop_location_id)
{
// Города заполняем только тогда, когда расположение указано
$res = $shop->GetAllCity($shop_location_id);
if ($res)
{
while ($row = mysql_fetch_assoc($res))
{
$result[$row['shop_city_id']] = $row['shop_city_name'];
}
}
}
$JsHttpRequest = new JsHttpRequest(SITE_CODING);
$GLOBALS['_RESULT'] = array(
'result' => $result);
echo $JsHttpRequest->LOADER;
exit();
}
if (isset($_REQUEST['action']) && $_REQUEST['action'] == 'get_cityarea' && isset($_REQUEST['shop_city_id']))
{
$shop_city_id = to_int($_REQUEST['shop_city_id']);
$result = array();
// Города заполняем только тогда, когда расположение указано
if ($shop_city_id)
{
$res = $shop->GetAllCityArea($shop_city_id);
if ($res)
{
while ($row = mysql_fetch_assoc($res))
{
$result[$row['shop_city_area_id']] = $row['shop_city_area_name'];
}
}
}
$JsHttpRequest = new JsHttpRequest(SITE_CODING);
$GLOBALS['_RESULT'] = array(
'result' => $result);
echo $JsHttpRequest->LOADER;
exit();
}
if (isset($_REQUEST['action']) && $_REQUEST['action'] == 'ajax_step1')
{
ob_start();
/* Сохраняем данные, введенные на первом этапе */
$country = to_int($_POST['country']);
$location = to_int($_POST['location']);
$city = to_int($_POST['sel_city']);
$city_area = to_int($_POST['sel_city_area']);
/* Пишем информацию об адресе доставки в сессию */
$_SESSION['country'] = $country;
$_SESSION['location'] = $location;
$_SESSION['city'] = $city;
$_SESSION['city_area'] = $city_area;
$_SESSION['index'] = to_str($_POST['index']);
$_SESSION['full_address'] = to_str($_POST['full_address']);
/* Индекс и полный адрес (в массив дополнительных параметров) */
$external_propertys['index'] = to_str($_POST['index']);
$external_propertys['full_address'] = to_str($_POST['full_address']);
if (class_exists("SiteUsers"))
{
/* Определяем идентификатор текущего пользователя */
$SiteUsers = & singleton('SiteUsers');
$site_users_id = $SiteUsers->GetCurrentSiteUser();
}
else
{
$site_users_id = false;
}
?>
<form method="POST" action="./" enctype="multipart/form-data">
<?php
if (isset($_REQUEST['no_weight']))
{
?>
<input type="hidden" name="cond_of_delivery" value="3" />
<?php
}
else
{
/* Получаем количество элементов, их общую цену, вес, валюту для заданного пользователя */
$a_param = $shop->SelectAllItemsFromCartForUser($shop_id,
$site_users_id);
/* Выбираем все доступные типы доставки (с группировкой по типу доставки) */
$param = array();
$param['shop_coupon_text'] = to_str($_SESSION['shop_coupon_text']);
$shop->ShowTypeOfDelivery($shop_id, $country, $location, $city, $city_area, $a_param['weight'], $a_param['price'],
to_str($GLOBALS['LA']['xsl_shop_delivery']), $param, $external_propertys);
}
if (!$site_users_id)
{
?>
<h2>Кто покупатель</h2>
<div>
<input type = "radio" value="private_person" name="type_person" id="private_person_id" onclick="SetUserType()"/><label for="private_person_id">Частное лицо</label>
<input type="radio" value="legal_entity" name="type_person" id="legal_entity_id" onclick="SetUserType()"/><label for="legal_entity_id">Юридическое лицо</label>
<input type="radio" value="registered" name="type_person" id="registered_id" onclick="SetUserType()" checked="checked"/><label for="registered_id">Уже зарегистрирован</label>
</div>
<div id="authorization_message" style="color: #f00"></div>
<div id="authorization">
<table>
<tr>
<td>Логин<br /><input type="text" name="login" size="20" /></td>
<td>Пароль<br /><input type="password" name="password" size="20" /></td>
</tr>
</table>
</div>
<div id="private_person_info" style="display: none;">
<h2>Контактная информация</h2>
<table>
<tr>
<td>ФИО<br /><input type="text" name="fio" size="55" /></td>
<td colspan="2">Телефон. <i>Например +7(495)988-3010</i><br /><input type="text" name="phone" size="40" /></td>
</tr>
<!--
<tr>
<td colspan="2">Ваш e-mail: <input type="text" name="email" size="30" /></td>
</tr>
-->
<tr>
<td colspan="3"><input type="checkbox" name="login_password" id="login_password_id" onChange="ChangeLoginPassword()"/><label for="login_password_id">Если хотите, можно указать логин, пароль и e-mail</label></td>
</tr>
<tr style="display: none;" id="tr_login_password">
<td>Логин<br /><input type="text" name="new_login" size="30" /></td>
<td>Пароль<br /><input type="text" name="new_password" size="30" /></td>
<td>Ваш e-mail<br /><input type="text" name="email" size="30" /></td>
</tr>
</table>
</div>
<div id="legal_entity_info" style="display: none;">
<h2>Информация о компании</h2>
<table>
<tr>
<td>Наименование компании<br /><input type="text" name="company_name" size="55" /></td>
<td>ИНН/КПП<br /><input type="text" name="inn" size="25"/></td>
</tr>
<tr>
<td colspan="2">Юр. адрес<br /><input type="text" name="juridical_address" size="55"/></td>
</tr>
<tr>
<td colspan="2">Фактический адрес<br /><input type="text" name="actual_address" size="55"/></td>
</tr>
<tr>
<td colspan="2"><input type="checkbox" name="send_fax" id="send_fax_id" onChange="ChangeSendFax()"/><label for="send_fax_id">Отправить счет по факсу</label>
<div id="id_fax" style="display: none;">Номер факса <input type="text" name="fax" size="15" /></div>
</td>
</tr>
</table>
</div>
<?php
}
/* Выводим платежные системы */
//$external_propertys['cond_of_delivery'] = to_int($_POST['cond_of_delivery']);
$shop->ShowSystemOfPay(to_str($GLOBALS['LA']['xsl_system_of_pay']));
?>
<div>Комментарии к заказу:<br /><textarea name="order_description" cols="50" rows="3"/></textarea></div>
<input type="submit" value="Оплатить" name="pay" onclick="return AjaxSendForm(fCallBackSiteUser, '&action=ajax_step_pay', this)"/>
</form>
<?php
$result = ob_get_clean();
$JsHttpRequest = new JsHttpRequest(SITE_CODING);
$GLOBALS['_RESULT'] = array(
'result' => $result);
echo $JsHttpRequest->LOADER;
exit();
}
// END обработка AJAX-запросов при заказе
if (class_exists("SiteUsers"))
{
/* Определяем идентификатор текущего пользователя */
$SiteUsers = & singleton('SiteUsers');
$site_users_id = $SiteUsers->GetCurrentSiteUser();
}
else
{
$site_users_id = false;
}
// Повторение заказа
if (to_str($_REQUEST['action']) == 'repeat')
{
$shop_order_id = to_int($_REQUEST['shop_order_id']);
$order_row = $shop->GetOrder($shop_order_id);
// Заказ найден
if ($order_row)
{
// Если заказ принадлежит этому пользователю
if ($order_row['site_users_id'] == $site_users_id && $site_users_id != 0)
{
$result_order_items = $shop->GetOrderItems($shop_order_id);
$shop_id_from_order = to_int($order_row['shop_shops_id']);
while ($row = mysql_fetch_assoc($result_order_items))
{
// Число товаров передаем, если посетитеь кладет в корзину больше одного товара
if (to_int( $row['shop_order_items_quantity']) > 0)
{
$count = to_int( $row['shop_order_items_quantity']);
}
/* Добавляем товар в корзину */
$shop->AddIntoCart(array('user_id' => $site_users_id,
'shop_id' => $shop_id_from_order,
'item_id' => $row['shop_items_catalog_item_id'],
'count' => $count));
}
}
}
}
// Запускаем сессию, если пользователь не авторизирован и пришли данные для регистрации
if ($site_users_id == 0 && isset($_POST['site_users_login'])
&& isset($_POST['site_users_password'])
&& isset($_POST['site_users_email'])
&& !isset($_SESSION))
{
session_start();
}
$GLOBALS['external_propertys'] = array();
/* Переданы данные для авторизации */
if (isset($_REQUEST['action']) && $_REQUEST['action']== 'ajax_step_pay')
{
ob_start();
// Пользователь не авторизован
if (!$site_users_id)
{
// Пользователь зарегистрирован
if (isset($_POST['type_person']) && $_POST['type_person'] == 'registered')
{
/* Проверяем правильность введенных данных */
$site_users_id = $SiteUsers->ValidUser(to_str($_POST['login']), to_str($_POST['password']));
}
else // Пользователь не зарегистрирован
{
$user_login = to_str($_POST['new_login']);
$user_login = trim($user_login);
$user_password = to_str($_POST['new_password']);
$user_password = trim($user_password);
$user_email = to_str($_POST['email']);
$user_email = trim($user_email);
// Не задан логин
if(empty($user_login))
{
// Генерируем логин
$user_login = 'AST' . rand_str('6');
}
// Не задан пароль
if(empty($user_password))
{
// Генерируем пароль
$user_password = rand_str('6');
}
if(empty($user_email))
{
// Генерируем e-mail
$user_email = $user_login . '@astsoft.ru';
}
$site_user_param = array();
$fio = to_str($_POST['fio']);
$fio = trim($fio);
$fio_mas = explode(' ', $fio);
$site_user_param['site_users_name'] = to_str($fio_mas[1]);
$site_user_param['site_users_surname'] = to_str($fio_mas[0]);
$site_user_param['site_users_patronymic'] = to_str($fio_mas[2]);
$site_user_param['site_users_login'] = $user_login;
$site_user_param['site_users_password'] = $user_password;
$site_user_param['site_users_email'] = $user_email;
$site_user_param['site_users_company'] = to_str($_POST['company_name']);
$site_user_param['site_users_phone'] = to_str($_POST['phone']);
$site_user_param['site_users_fax'] = to_str($_POST['fax']);
$site_user_param['site_users_postcode'] = to_int($_POST['index']);
$site_user_param['site_users_confirmation'] = true;
$site_user_param['users_id'] = false;
$site_users_id = $SiteUsers->InsertSiteUser($site_user_param);
}
}
if ($site_users_id > 0)
{
// Авторизуем пользователя
$SiteUsers->SetCurrentSiteUser($site_users_id);
$_SESSION['cond_of_delivery'] = to_int($_POST['cond_of_delivery']);
$_SESSION['order_description'] = to_str($_POST['order_description']);
$row = $shop->GetCondOfDelivery($_SESSION['cond_of_delivery']);
/* Получаем данные о магазине */
$shop_row = $shop->GetShop($shop_id);
/* идентификатор валюты магазина */
$shop_currency_id = to_int($shop_row['shop_currency_id']);
$coefficient = $shop->GetCurrencyCoefficientToShopCurrency($row['shop_currency_id'], $shop_currency_id);
$price_delivery = sprintf("%.2f", $row['shop_cond_of_delivery_price'] * $coefficient);
$_SESSION['cond_of_delivery_price'] = $price_delivery;
/* Запоминаем купон */
$_SESSION['shop_coupon_text'] = to_str($_POST['shop_coupon_text']);
//print_r($_SESSION);
/* Если выбрана (существует) платежная система */
if (to_int($_POST['system_of_pay_id']) != 0)
{
// Вызываем обработчик платежной системы
if (!$shop->ExecSystemsOfPayHandler(to_int($_POST['system_of_pay_id'])))
{
// Не удалось найти обработчик
show_error_message("Не найден обработчик платежной системы с номером ".to_int($_POST['system_of_pay_id']));
}
}
else
{
// Ошибка, не указана платежная система!
show_error_message('Ошибка! Не указана ни одна платежная система.');
}
}
elseif($site_users_id == -2)
{
echo 'Пользователь с такими данными уже зарегистрирован!';
}
else
{
echo 'Неверные данные пользователя!';
}
$result = ob_get_contents();
$JsHttpRequest = new JsHttpRequest(SITE_CODING);
if ($site_users_id > 0)
{
$GLOBALS['_RESULT'] = array('cart' => $result);
}
else
{
$GLOBALS['_RESULT'] = array('authorization_message' => $result);
}
ob_clean();
echo $JsHttpRequest->LOADER;
exit();
}
/* AJAX добавление товара в корзину */
if (isset($_GET['ajax_add_item_id']))
{
$param = array();
$param['shop_id'] = $shop_id;
$param['item_id'] = to_int($_GET['ajax_add_item_id']);
$param['user_id'] = $site_users_id;
// Число товаров передаем, если посетитеь кладет в корзину больше одного товара
if (to_int($_GET['count']) > 0)
{
$param['count'] = to_int($_GET['count']);
}
// Добавляем товар в корзину
$shop->AddIntoCart($param);
// Отображаем корзину
$JsHttpRequest = new JsHttpRequest(SITE_CODING);
ob_start();
$shop->ShowCart($shop_id, $site_users_id, to_str($GLOBALS['LA']['xsl_little_cart']));
$little_cart_html = ob_get_clean();
$GLOBALS['_RESULT'] = array('cart' => $little_cart_html);
echo $JsHttpRequest->LOADER;
exit();
}
/* добавление товара в корзину */
if (to_str($_GET['action']) == 'add')
{
$param = array();
$param['shop_id'] = $shop_id;
$param['item_id'] = to_int($_GET['item_id']);
$param['user_id'] = $site_users_id;
// Число товаров передаем, если посетитеь кладет в корзину больше одного товара
if (to_int($_GET['count']) > 0)
{
$param['count'] = to_int($_GET['count']);
}
/* Добавляем товар в корзину */
$shop->AddIntoCart($param);
}
/* Удаляение товара из корзины */
if (to_str($_GET['action']) == 'delete_item')
{
$param = array();
$param['shop_id'] = $shop_id;
$param['item_id'] = to_int($_GET['item_id']);
/* Проверяем наличие пользователя */
if ($site_users_id != 0)
{
$param['user_id'] = $site_users_id;
}
$shop->DeleteCart($param);
}
/* Пересчет товара в корзине */
if (isset($_POST['recount']))
{
$param = array();
foreach ($_POST as $key => $value)
{
$param['item_id'] = $key;
/* Получаем идентификатор записи в корзине по идентификатору пользователя и товара */
$cart_id = $shop->GetItemFromCart($shop_id, $site_users_id, $param['item_id']);
$param['cart_id'] = to_int($cart_id['shop_cart_id']);
$param['user_id'] = $site_users_id;
$param['shop_id'] = $shop_id;
$param['count'] = to_int($value);
/* Если установлен флажок - делаем товар отложенным */
$param['postpone'] = !empty($_POST['flag_postpone'.$key]) ? 1 : 0;
/* Если количество = 0 - удаляем из корзины */
if ($param['count'] == 0)
{
$shop->DeleteCart($param);
}
else
{
$shop->UpdateCart($param);
}
}
}
?>
Также необходимо поменять стандартные XSL-шаблоны
Измененный код XSL-шаблона "МагазинАдресДоставки"
<?xml version="1.0" encoding="windows-1251"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output xmlns="http://www.w3.org/TR/xhtml1/strict" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" encoding="Windows-1251" indent="yes" method="html" omit-xml-declaration="no" version="1.0" media-type="text/xml"/>
<xsl:template match="/locations">
<!--
<table border="0" cellpadding="5" cellspacing="5" class="shop_navigation_table">
<tr>
<td id="shop_navigation_current">Адрес доставки</td>
<td>→</td>
<td id="shop_navigation">Способ доставки</td>
<td>→</td>
<td id="shop_navigation">Форма оплаты</td>
<td>→</td>
<td id="shop_navigation">Данные доставки</td>
</tr>
</table>
-->
<SCRIPT type="text/javascript" language="JavaScript">
<xsl:comment>
<xsl:text disable-output-escaping="yes">
<![CDATA[
location_select_id = "location";
city_select_id = "sel_city";
cityarea_select_id = "sel_city_area";
]]>
</xsl:text>
</xsl:comment>
</SCRIPT>
<form name="address" id="address" method="POST" action="./" enctype="multipart/form-data">
<h1>Доставка</h1>
<!--
<p>
<a href="{shop/path}cart/">Корзина</a>
</p>
-->
<table>
<tr><td>В корзине есть товар, который требет физической доставки курьером или почтой. Выберите пожалуйста адрес доставки</td></tr>
<tr>
<td>Страна: <select id="country" name="country" onchange="doSetLocation(this.options[this.selectedIndex].value, '{/locations/shop/path}cart/')">
<xsl:apply-templates select="country"/>
</select>  
Область: 
<xsl:variable name="country_id" select="/locations//country[@select = 1]/@id" />
<select name="location" id="location" onchange="doSetCity(this.options[this.selectedIndex].value, '{/locations/shop/path}cart/')">
<option value="0">..</option>
<xsl:apply-templates select="location[@parent = $country_id]"/>
</select>
</td>
</tr>
<tr>
<td>Город: <select name="sel_city" id="sel_city" onchange="doSetCityArea(this.options[this.selectedIndex].value, '{/locations/shop/path}cart/')">
<option value="0">..</option>
<xsl:apply-templates select="city[@parent = location[@parent = $country_id]]"/>
</select>  
Район города: <select name="sel_city_area" id="sel_city_area">
<option value="0">..</option>
</select>  
</td>
</tr>
<tr>
<td>Индекс: <input type="text" size="5" name="index" value=""/>  
Улица, дом, квартира: <input type="text" size="30" name="full_address" value=""/></td>
</tr>
<tr>
<td>
<input name="step_1" value="Далее >>" type="submit" onclick="return AjaxSendForm(fCallBackSiteUser, '&action=ajax_step1', this)"></input>
</td>
</tr>
</table>
</form>
<!-- Заполняем все дочерние элементы страны -->
<SCRIPT type="text/javascript" language="JavaScript">
var oldHandler=window['onload'];
window['onload']=function(){if(typeof(oldHandler)=='function'){oldHandler();}newHandler();};
function newHandler(){
doSetLocation(document.getElementById('country').options[document.getElementById('country').selectedIndex].value, '<xsl:value-of select="/locations/shop/path" />cart/');
}
</SCRIPT>
</xsl:template>
<!-- Шаблон заполняет options для стран -->
<xsl:template match="country">
<xsl:choose>
<!-- Если страна задана по умолчанию -->
<xsl:when test="@select=1">
<option value="{@id}" selected="">
<xsl:value-of disable-output-escaping="yes" select="name"/>
</option>
</xsl:when>
<xsl:otherwise>
<option value="{@id}">
<xsl:value-of disable-output-escaping="yes" select="name"/>
</option>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- Шаблон заполняет options для местоположений (областей) -->
<xsl:template match="location">
<option value="{@id}">
<xsl:value-of disable-output-escaping="yes" select="name"/>
</option>
</xsl:template>
<!-- Шаблон заполняет options для городов -->
<xsl:template match="city">
<option value="{@id}">
<xsl:value-of disable-output-escaping="yes" select="name"/>
</option>
</xsl:template>
<!-- Шаблон заполняет options для районов -->
<xsl:template match="cityarea">
<option value="{@id}">
<xsl:value-of disable-output-escaping="yes" select="name"/>
</option>
</xsl:template>
</xsl:stylesheet>
Измененный код XSL-шаблона "МагазинДоставки"
<?xml version="1.0" encoding="windows-1251"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output xmlns="http://www.w3.org/TR/xhtml1/strict" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" encoding="Windows-1251" indent="yes" method="html" omit-xml-declaration="no" version="1.0" media-type="text/xml"/>
<!-- Шаблон для типов доставки -->
<xsl:template match="/types_of_delivery">
<!--<table border="0" cellpadding="5" cellspacing="5" class="shop_navigation_table">
<tr>
<td id="shop_navigation">Адрес доставки</td>
<td>→</td>
<td id="shop_navigation_current">Способ доставки</td>
<td>→</td>
<td id="shop_navigation">Форма оплаты</td>
<td>→</td>
<td id="shop_navigation">Данные доставки</td>
</tr>
</table>-->
<!--<form name="address" id="address" method="POST">-->
<h2>Стоимость доставки</h2>
<!-- Проверяем количество способов доставки -->
<xsl:choose>
<xsl:when test="count_cond_of_delivery=0">
<p>По выбранным Вами условиям доставка не возможна, заказ будет оформлен без доставки.</p>
<p>Уточнить данные о доставке Вы можете, связавшись с представителем нашей компании.</p>
<input type="hidden" name="type_of_delivery" value="0"/>
</xsl:when>
<xsl:otherwise>
<table cellspacing="0" cellpadding="0" border="0" class="shop_cart_table">
<tr class="shop_cart_table_title">
<td>Способ доставки</td>
<td>Описание</td>
<td>Цена доставки</td>
<td>Стоимость товаров</td>
<td>Итого</td>
</tr>
<xsl:apply-templates select="type_of_delivery"/>
</table>
</xsl:otherwise>
</xsl:choose>
<!--<p>
<input name="step_3" value="Далее >>" type="submit"/>
</p>-->
<!--</form>-->
</xsl:template>
<xsl:template match="type_of_delivery">
<tr>
<td>
<input type="radio" value="{shop_cond_of_delivery_id}" id="cond_of_delivery{shop_cond_of_delivery_id}" name="cond_of_delivery" style="border: 0px">
<xsl:if test="position() = 1">
<xsl:attribute name="checked"></xsl:attribute>
</xsl:if>
</input> 
<label for="cond_of_delivery{shop_cond_of_delivery_id}">
<b>
<xsl:value-of select="name"/>
</b>
</label>
</td>
<td>
<!-- Описание доставки -->
<p>
<xsl:value-of disable-output-escaping="yes" select="description"/>
</p>
</td>
<td>
<xsl:value-of select="price"/> <xsl:value-of select="/types_of_delivery/shop/shop_currency/shop_currency_name"/></td>
<td>
<xsl:value-of select="cart_sum"/> <xsl:value-of select="/types_of_delivery/shop/shop_currency/shop_currency_name"/>
</td>
<td style="font-weight: bold">
<xsl:value-of select="total"/> <xsl:value-of select="/types_of_delivery/shop/shop_currency/shop_currency_name"/>
</td>
</tr>
</xsl:template>
</xsl:stylesheet>
Измененный код XSL-шаблона "МагазинКорзина"
<?xml version="1.0" encoding="windows-1251"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output xmlns="http://www.w3.org/TR/xhtml1/strict" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" encoding="Windows-1251" indent="yes" method="html" omit-xml-declaration="no" version="1.0" media-type="text/xml"/>
<!-- Шаблон для корзины -->
<xsl:variable name="recount" select="recount"/>
<xsl:template match="/cart">
<xsl:choose>
<xsl:when test="(count_item=0) and (count_postpone_item=0)">
<!-- В корзине нет ни одного элемента -->
<p class="title">В корзине нет ни одного товара.</p>
<p>
<xsl:choose>
<xsl:when test="user_id != 0">Для оформления заказа добавьте товар в корзину.</xsl:when>
<xsl:when test="site_users_class_exists = 1">Вы не авторизированы. Если Вы зарегистрированный пользователь, данные Вашей корзины станут видны после авторизации.</xsl:when>
<xsl:otherwise></xsl:otherwise>
</xsl:choose>
</p>
</xsl:when>
<xsl:otherwise>
<!-- Вывод корзины -->
<h1>Моя корзина</h1>
<p>Для оформления заказа, нажмите "Оформить заказ".</p>
<form action="{/cart/shop/path}cart/" name="address" method="POST">
<table cellspacing="0" cellpadding="0" border="0" class="shop_cart_table">
<!-- Если есть товары -->
<xsl:if test="count(itemincart[flag_postpone=0]) > 0">
<tr class="shop_cart_table_title">
<td>Изображение</td>
<td width="100">Товар</td>
<!--<td width="70">Вес</td>-->
<td width="70">Кол-во</td>
<td width="70">Цена</td>
<td>Сумма</td>
<td>Отложить</td>
<!--<td>Действия</td>-->
</tr>
<xsl:apply-templates select="itemincart[flag_postpone=0]"/>
<tr class="shop_cart_table">
<td> </td>
<td>
<b>Итого:</b>
</td>
<td>
<b>
<xsl:value-of disable-output-escaping="yes" select="totalquantity"/>
</b>
</td>
<td> </td>
<td>
<b>
<xsl:value-of disable-output-escaping="yes" select="total_sum_without_discount"/> <xsl:value-of disable-output-escaping="yes" select="shop/shop_currency/shop_currency_name"/></b>
</td>
<td> </td>
<!--<td> </td>-->
</tr>
<xsl:if test="total_sum_without_discount > totalsum">
<tr class="shop_cart_table">
<td style="border-bottom: thin dashed #DADADA">
 
</td>
<td style="border-bottom: thin dashed #DADADA">
<b>Скидка:</b>
</td>
<td style="border-bottom: thin dashed #DADADA"> </td>
<td style="border-bottom: thin dashed #DADADA"> </td>
<td style="border-bottom: thin dashed #DADADA">
<b>
<xsl:value-of disable-output-escaping="yes" select="format-number(total_sum_without_discount - totalsum, '#.00')"/> <xsl:value-of disable-output-escaping="yes" select="shop/currency"/></b>
</td>
<td style="border-bottom: thin dashed #DADADA"> </td>
</tr>
<tr class="shop_cart_table">
<td style="border-bottom: none">
 
</td>
<td style="border-bottom: none">
<b>Всего:</b>
</td>
<td style="border-bottom: none"> </td>
<td style="border-bottom: none"> </td>
<td style="border-bottom: none">
<b>
<xsl:value-of disable-output-escaping="yes" select="totalsum"/> <xsl:value-of disable-output-escaping="yes" select="shop/currency"/></b>
</td>
<td style="border-bottom: none"> </td>
</tr>
</xsl:if>
</xsl:if>
<!-- Если есть отложенные товары -->
<xsl:if test="count(itemincart[flag_postpone=1]) > 0">
<tr class="shop_cart_table">
<td colspan="7" style="padding-top:10px">
<strong>
<big>Отложенные товары</big>
</strong>
</td>
</tr>
<tr class="shop_cart_table_title">
<td>Изображение</td>
<td>Название</td>
<!--<td width="70">Вес</td>-->
<td width="70">Кол — во</td>
<td width="70">Цена</td>
<td>Сумма</td>
<td>Отложить</td>
<!--<td>Действия</td>-->
</tr>
<xsl:apply-templates select="itemincart[flag_postpone=1]"/>
<tr class="shop_cart_table">
<td> </td>
<td>
<b>Итого:</b>
</td>
<td>
<b>
<xsl:value-of disable-output-escaping="yes" select="totalquantity_postpone_item"/>
</b>
</td>
<td> </td>
<td>
<b>
<xsl:value-of disable-output-escaping="yes" select="totalsum_postpone_item"/> <xsl:value-of disable-output-escaping="yes" select="shop/shop_currency/shop_currency_name"/></b>
</td>
<td> </td>
<td> </td>
</tr>
</xsl:if>
</table>
<!-- Купон -->
<div style="padding: 5px;">
Купон: 
<input name="shop_coupon_text" type="text" value="{coupon_text}" style="margin-right: 10px"/>
</div>
<!-- Кнопки -->
<input name="recount" value="Пересчитать" type="submit" style="margin-right: 10px"/>
<xsl:choose>
<xsl:when test="site_users_class_exists = 1"></xsl:when>
<xsl:otherwise>
<!-- В случае если отключен модуль пользователей сайта, запрашиваем информацию
о пользователе сайта здесь -->
<table border="0" cellspacing="0" cellpadding="2">
<tr class="shop_cart_table_title">
<td colspan="2" align="center">Данные о заказчике</td>
</tr>
<tr>
<td>Фамилия</td>
<td>
<input name="site_users_surname" type="text" value="" size="40"/>
</td>
</tr>
<tr>
<td>Имя</td>
<td>
<input name="site_users_name" type="text" value="" size="40"/>
</td>
</tr>
<tr>
<td>Отчество</td>
<td>
<input name="site_users_patronymic" type="text" value="" size="40"/>
</td>
</tr>
<tr>
<td>E-mail</td>
<td>
<input name="site_users_email" type="text" value="" size="40"/>
</td>
</tr>
<tr>
<td>Телефон</td>
<td>
<input name="site_users_phone" type="text" value="" size="40"/>
</td>
</tr>
<tr>
<td>Факс</td>
<td>
<input name="site_users_fax" type="text" value="" size="40"/>
</td>
</tr>
<tr>
<td>Адрес</td>
<td>
<input name="site_users_address" type="text" value="" size="40"/>
</td>
</tr>
</table>
<!-- Добавляем скрытое поле с указанием подшага -->
<input name="step_1_1a" type="hidden" value="1"/>
</xsl:otherwise>
</xsl:choose>
<!--
<xsl:if test="user_id != 0 or site_users_class_exists = 0">
<input name="step_1" value="Оформить заказ" type="submit" style="font-weight: bold"/>
</xsl:if>
-->
</form>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- Шаблон для товара в корзине -->
<xsl:template match="itemincart">
<tr class="shop_cart_table">
<td>
<xsl:if test="item/small_image!=''">
<img src="{item/small_image}"/>
</xsl:if>
<br/>
<a href="?action=delete_item&item_id={item/@id}">Удалить из корзины</a>
</td>
<td>
<a href="{/cart/shop/path}{item/fullpath}{item/path}/">
<xsl:value-of disable-output-escaping="yes" select="item/name"/>
</a>
<!-- Средняя оценка товара -->
<div style="float: left; margin: 20px 0px 0px 0px">
<b>Рейтинг:</b>
<br/>
<xsl:if test="item/comments/average_grade/node()">
<xsl:call-template name="show_average_grade">
<xsl:with-param name="grade" select="item/comments/average_grade"/>
<xsl:with-param name="const_grade" select="5"/>
</xsl:call-template>
</xsl:if>
<xsl:if test="not(item/comments/average_grade/node())">
<xsl:call-template name="show_average_grade">
<xsl:with-param name="grade" select="0"/>
<xsl:with-param name="const_grade" select="5"/>
</xsl:call-template>
</xsl:if>
</div>
<div style="clear: both"></div>
</td>
<td style="white-space: nowrap">
<input type="text" size="3" name="{item/@id}" value="{quantity}"/> <xsl:value-of select="item/mesure" disable-output-escaping="yes"/></td>
<td style="white-space: nowrap">
<!-- Цена -->
<xsl:value-of disable-output-escaping="yes" select="item/price"/> <xsl:value-of select="item/currency" disable-output-escaping="yes"/></td>
<td style="white-space: nowrap">
<!-- Сумма -->
<xsl:value-of disable-output-escaping="yes" select="item/price * quantity"/> <xsl:value-of disable-output-escaping="yes" select="item/currency"/></td>
<td align="center">
<!-- Отложенные товары -->
<xsl:choose>
<xsl:when test="flag_postpone=1">
<input type="checkbox" name="flag_postpone{item/@id}" checked=""/>
</xsl:when>
<xsl:otherwise>
<input type="checkbox" name="flag_postpone{item/@id}"/>
</xsl:otherwise>
</xsl:choose>
</td>
<!--<td align="center"><a href="?action=delete_item&item_id={item/@id}" title="Удалить товар из корзины" alt="Удалить товар из корзины"><img src="/hostcmsfiles/images/delete.gif" /></a></td>-->
</tr>
</xsl:template>
<!-- Вывод рейтинга товара -->
<xsl:template name="show_average_grade">
<xsl:param name="grade" select="0"/>
<xsl:param name="const_grade" select="0"/>
<!-- Чтобы избежать зацикливания -->
<xsl:variable name="current_grade" select="$grade * 1"/>
<xsl:choose>
<!-- Если число целое -->
<xsl:when test="floor($current_grade) = $current_grade and not($const_grade > ceiling($current_grade))">
<xsl:if test="$current_grade - 1 > 0">
<xsl:call-template name="show_average_grade">
<xsl:with-param name="grade" select="$current_grade - 1"/>
<xsl:with-param name="const_grade" select="$const_grade - 1"/>
</xsl:call-template>
</xsl:if>
<xsl:if test="$current_grade != 0">
<img src="/hostcmsfiles/images/stars_single.gif"/>
</xsl:if>
</xsl:when>
<xsl:when test="$current_grade != 0 and not($const_grade > ceiling($current_grade))">
<xsl:if test="$current_grade - 0.5 > 0">
<xsl:call-template name="show_average_grade">
<xsl:with-param name="grade" select="$current_grade - 0.5"/>
<xsl:with-param name="const_grade" select="$const_grade - 1"/>
</xsl:call-template>
</xsl:if>
<img src="/hostcmsfiles/images/stars_half.gif"/>
</xsl:when>
<!-- Выводим серые звездочки, пока текущая позиция не дойдет то значения, увеличенного до целого -->
<xsl:otherwise>
<xsl:call-template name="show_average_grade">
<xsl:with-param name="grade" select="$current_grade"/>
<xsl:with-param name="const_grade" select="$const_grade - 1"/>
</xsl:call-template>
<img src="/hostcmsfiles/images/stars_gray.gif"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- Шаблон для вывода звездочек (оценки) -->
<xsl:template name="for">
<xsl:param name="i" select="0"/>
<xsl:param name="n"/>
<input type="radio" name="shop_comment_grade" value="{$i}" id="id_shop_comment_grade_{$i}">
<xsl:if test="/shop/shop_comment_grade = $i">
<xsl:attribute name="checked">
</xsl:attribute>
</xsl:if>
</input> 
<label for="id_shop_comment_grade_{$i}">
<xsl:call-template name="show_average_grade">
<xsl:with-param name="grade" select="$i"/>
<xsl:with-param name="const_grade" select="5"/>
</xsl:call-template>
</label>
<br/>
<xsl:if test="$n > $i and $n > 1">
<xsl:call-template name="for">
<xsl:with-param name="i" select="$i + 1"/>
<xsl:with-param name="n" select="$n"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
Измененный код XSL-шаблона "МагазинПлатежнаяСистема"
<?xml version="1.0" encoding="windows-1251"?>
<!DOCTYPE xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output xmlns="http://www.w3.org/TR/xhtml1/strict" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" encoding="Windows-1251" indent="yes" method="html" omit-xml-declaration="no" version="1.0" media-type="text/xml"/>
<!-- Шаблон для платежных систем -->
<xsl:template match="/list">
<!--
<table border="0" cellpadding="5" cellspacing="5" class="shop_navigation_table">
<tr>
<td id="shop_navigation">Адрес доставки</td>
<td>→</td>
<td id="shop_navigation">Способ доставки</td>
<td>→</td>
<td id="shop_navigation_current">Форма оплаты</td>
<td>→</td>
<td id="shop_navigation">Данные доставки</td>
</tr>
</table>-->
<h2>Методы оплаты</h2>
<!--<form name="address" id="address" method="post">-->
<xsl:choose>
<xsl:when test="count_system_of_pay=0">
<p>
<b>В данный момент нет доступных платежных систем!</b>
</p>
<p>Оформление заказа невозможно, свяжитесь с администрацией Интернет-магазина.</p>
</xsl:when>
<xsl:otherwise>
<table cellspacing="0" cellpadding="0" border="0" class="shop_cart_table">
<tr class="shop_cart_table_title">
<td>Форма оплаты</td>
<td>Описание</td>
</tr>
<xsl:apply-templates select="system_of_pay"/>
</table>
<!--<p><input name="step_4" value="Далее >>" type="submit"/></p>-->
</xsl:otherwise>
</xsl:choose>
<!--</form>-->
</xsl:template>
<xsl:template match="system_of_pay">
<tr>
<td width="40%">
<input type="radio" class="input_radio" name="system_of_pay_id" value="{@id}" id="system_of_pay_{@id}" style="border: 0px">
<xsl:if test="position() = 1">
<xsl:attribute name="checked"></xsl:attribute>
</xsl:if>
</input>
 
<label for="system_of_pay_{@id}">
<b>
<xsl:value-of select="name"/>
</b>
</label>
</td>
<td width="60%">
<!-- Описание платежной системы -->
<xsl:value-of disable-output-escaping="yes" select="description"/>
</td>
</tr>
</xsl:template>
</xsl:stylesheet>
В XSL-шаблонах "ОплатаПриПолучении", "ОплатаПоФормеПД4", "ОплатаБезналичнаяОтЮрЛица" убрать следующий код
<table border="0" cellpadding="5" cellspacing="5" class="shop_navigation_table">
<tr>
<td id="shop_navigation">Адрес доставки</td>
<td>→</td>
<td id="shop_navigation">Способ доставки</td>
<td>→</td>
<td id="shop_navigation">Форма оплаты</td>
<td>→</td>
<td id="shop_navigation_current">Данные доставки</td>
</tr>
</table>
При использовании данного решения, в процессе оформления заказа, пишет нет активных способов оплаты.
Подскажите пожалуйста как исправить данную ошибку? или хотябы укажите направление куда копать.
у меня тоже не совсем получилось. выходят ошибки типа failed to transformXLT/
Тема по прежнему актуальна, в частности для тех кто хочет оформлять заказы в 1 шаг.
Весьма элегантно задача выполнена на сайте serveroom . ru
AJAX и Javascript делают процесс простым и доходчивым для покупателей.
Может кто подскажет как такое чудо можно реализовать?
Тема по прежнему актуальна, в частности для тех кто хочет оформлять заказы в 1 шаг.
Весьма элегантно задача выполнена на сайте serveroom . ru
AJAX и Javascript делают процесс простым и доходчивым для покупателей.
Может кто подскажет как такое чудо можно реализовать?
www.energoprofi23.ru
У кого есть рабочая версия такой реализации оформления заказа? Может как-то по-другому можно реализовать? Подсобите!

Делись своими знаниями. Это путь к бессмертию.
тоже озадачен этим вопросом, просмотрел что дано выше - не работает.
Данная реализация по всей видимости подходит для более ранних версий системы. Вначале была куча ошибок в преобразователе, заменил кодировку в приведенных шаблонах на utf-8 все заработало (доступные способы оплаты не показывает если вес товара равен 0, считает что товар электронный), а вот сама кнопка заказа увы не работает, появляется лоадер аякса и ничего не происходит. Причем даже через firebug ошибку отловить не смог, т.к. он ничего не показывает при нажатии
Данная реализация по всей видимости подходит для более ранних версий системы. Вначале была куча ошибок в преобразователе, заменил кодировку в приведенных шаблонах на utf-8 все заработало (доступные способы оплаты не показывает если вес товара равен 0, считает что товар электронный), а вот сама кнопка заказа увы не работает, появляется лоадер аякса и ничего не происходит. Причем даже через firebug ошибку отловить не смог, т.к. он ничего не показывает при нажатии
Прошу прощения за ап, но нужна помощь в данном вопросе.
Делись своими знаниями. Это путь к бессмертию.
У меня реализовано оформление в один шаг, но это решение не дает возможности выбора варианта доставки.
Я ограничил доставку только внутри своего региона (области). Скажите как можно с помощью Ajax запроса при изменении города обновить варианты доставки в форме не увеличивая количество шагов?
Я ограничил доставку только внутри своего региона (области). Скажите как можно с помощью Ajax запроса при изменении города обновить варианты доставки в форме не увеличивая количество шагов?
alex-saratov, асинхронно посылайте на сервер идентификаторы выбранных пользователем страны, области, города и района. Затем в коде настроек тип. дин. страницы корзины получайте этот запрос, рассчитывайте общий вес заказа и его сумму, и передавайте все эти параметры в метод ShowTypeOfDelivery. Результат его вызова верните в ответ на этот AJAX-запрос.
Авторизация